1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_xcomponent_node_bridge.h"
17
18 #include "bridge/declarative_frontend/jsview/js_xcomponent.h"
19 namespace OHOS::Ace::NG {
20
Create(ArkUIRuntimeCallInfo * runtimeCallInfo)21 ArkUINativeModuleValue XComponentNodeBridge::Create(ArkUIRuntimeCallInfo* runtimeCallInfo)
22 {
23 EcmaVM* vm = runtimeCallInfo->GetVM();
24 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
25
26 Framework::XComponentParams params;
27 // elmtId
28 Local<JSValueRef> arg = runtimeCallInfo->GetCallArgRef(0);
29 if (arg->IsNumber()) {
30 params.elmtId = arg->Int32Value(vm);
31 }
32 // xcomponent id
33 arg = runtimeCallInfo->GetCallArgRef(1);
34 if (arg->IsString()) {
35 params.xcomponentId = arg->ToString(vm)->ToString();
36 }
37 // xcomponentType
38 arg = runtimeCallInfo->GetCallArgRef(2);
39 if (arg->IsNumber()) {
40 params.xcomponentType = arg->Int32Value(vm);
41 }
42 // renderType
43 arg = runtimeCallInfo->GetCallArgRef(3);
44 if (arg->IsNumber()) {
45 params.renderType = arg->Int32Value(vm);
46 }
47 // surfaceId
48 arg = runtimeCallInfo->GetCallArgRef(4);
49 if (arg->IsString()) {
50 params.surfaceId = arg->ToString(vm)->ToString();
51 }
52 // selfIdealWidth
53 arg = runtimeCallInfo->GetCallArgRef(5);
54 if (arg->IsNumber()) {
55 params.width = arg->Int32Value(vm);
56 }
57 // selfIdealHeight
58 arg = runtimeCallInfo->GetCallArgRef(6);
59 if (arg->IsNumber()) {
60 params.height = arg->Int32Value(vm);
61 }
62 // libraryname
63 arg = runtimeCallInfo->GetCallArgRef(7);
64 if (arg->IsString()) {
65 params.libraryName = arg->ToString(vm)->ToString();
66 }
67
68 void* jsXComponent = Framework::JSXComponent::Create(params);
69 auto nativeModule = panda::NativePointerRef::New(
70 vm, reinterpret_cast<void*>(jsXComponent),
71 [](void* data, [[maybe_unused]] void* hint) {
72 auto* jsXComponent = reinterpret_cast<Framework::JSXComponent*>(data);
73 if (jsXComponent) {
74 delete jsXComponent;
75 jsXComponent = nullptr;
76 }
77 },
78 reinterpret_cast<void*>(jsXComponent), sizeof(void*));
79 return nativeModule;
80 }
81
GetFrameNode(ArkUIRuntimeCallInfo * runtimeCallInfo)82 ArkUINativeModuleValue XComponentNodeBridge::GetFrameNode(ArkUIRuntimeCallInfo* runtimeCallInfo)
83 {
84 EcmaVM* vm = runtimeCallInfo->GetVM();
85 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
86 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
87 Framework::JSXComponent* jsXComponent =
88 reinterpret_cast<Framework::JSXComponent*>(firstArg->ToNativePointer(vm)->Value());
89 if (jsXComponent) {
90 auto frameNode = jsXComponent->GetFrameNode();
91 auto nativeModule = panda::NativePointerRef::New(vm, reinterpret_cast<void*>(AceType::RawPtr(frameNode)));
92 return nativeModule;
93 }
94 return panda::JSValueRef::Undefined(vm);
95 }
96
RegisterOnCreateCallback(ArkUIRuntimeCallInfo * runtimeCallInfo)97 ArkUINativeModuleValue XComponentNodeBridge::RegisterOnCreateCallback(ArkUIRuntimeCallInfo* runtimeCallInfo)
98 {
99 EcmaVM* vm = runtimeCallInfo->GetVM();
100 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
101 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
102 Framework::JSXComponent* jsXComponent =
103 reinterpret_cast<Framework::JSXComponent*>(firstArg->ToNativePointer(vm)->Value());
104 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
105 if (jsXComponent && secondArg->IsFunction()) {
106 Framework::JsiExecutionContext execCtx = { vm };
107 jsXComponent->RegisterOnCreate(execCtx, secondArg);
108 }
109 return panda::JSValueRef::Undefined(vm);
110 }
111
RegisterOnDestroyCallback(ArkUIRuntimeCallInfo * runtimeCallInfo)112 ArkUINativeModuleValue XComponentNodeBridge::RegisterOnDestroyCallback(ArkUIRuntimeCallInfo* runtimeCallInfo)
113 {
114 EcmaVM* vm = runtimeCallInfo->GetVM();
115 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
116 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
117 Framework::JSXComponent* jsXComponent =
118 reinterpret_cast<Framework::JSXComponent*>(firstArg->ToNativePointer(vm)->Value());
119 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
120 if (jsXComponent && secondArg->IsFunction()) {
121 Framework::JsiExecutionContext execCtx = { vm };
122 jsXComponent->RegisterOnDestroy(execCtx, secondArg);
123 }
124 return panda::JSValueRef::Undefined(vm);
125 }
126
ChangeRenderType(ArkUIRuntimeCallInfo * runtimeCallInfo)127 ArkUINativeModuleValue XComponentNodeBridge::ChangeRenderType(ArkUIRuntimeCallInfo* runtimeCallInfo)
128 {
129 EcmaVM* vm = runtimeCallInfo->GetVM();
130 auto defaultNativeModule = panda::BooleanRef::New(vm, false);
131 CHECK_NULL_RETURN(vm, defaultNativeModule);
132 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
133 Framework::JSXComponent* jsXComponent =
134 reinterpret_cast<Framework::JSXComponent*>(firstArg->ToNativePointer(vm)->Value());
135 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
136 if (jsXComponent && secondArg->IsNumber()) {
137 auto ret = jsXComponent->ChangeRenderType(secondArg->Int32Value(vm));
138 auto nativeModule = panda::BooleanRef::New(vm, ret);
139 return nativeModule;
140 }
141 return defaultNativeModule;
142 }
143 } // namespace OHOS::Ace::NG
144