• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_xcomponent_bridge.h"
16 
17 #include "base/log/ace_scoring_log.h"
18 #include "base/utils/utils.h"
19 #include "bridge/common/utils/engine_helper.h"
20 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
21 #include "bridge/declarative_frontend/jsview/models/indexer_model_impl.h"
22 #include "bridge/declarative_frontend/jsview/js_xcomponent.h"
23 #include "bridge/declarative_frontend/jsview/js_xcomponent_controller.h"
24 #include "core/components_ng/pattern/xcomponent/xcomponent_model_ng.h"
25 
26 namespace OHOS::Ace::NG {
27 
28 enum ArgIndices {
29     ARG_FIRST = 0,
30     ARG_ID = 1,
31     ARG_TYPE = 2,
32     ARG_IMAGE_AI_OPTIONS = 3,
33     ARG_LIBRARY_NAME = 4,
34     ARG_CONTROLLER = 5
35 };
36 
ConvertToXComponentType(const std::string & type)37 XComponentType XComponentBridge::ConvertToXComponentType(const std::string& type)
38 {
39     if (type == "surface") {
40         return XComponentType::SURFACE;
41     }
42     if (type == "component") {
43         return XComponentType::COMPONENT;
44     }
45     if (type == "node") {
46         return XComponentType::NODE;
47     }
48 #ifdef PLATFORM_VIEW_SUPPORTED
49     if (type == "platform_view") {
50         return XComponentType::PLATFORM_VIEW;
51     }
52 #endif
53     return XComponentType::SURFACE;
54 }
55 
ParseParams(ArkUIRuntimeCallInfo * runtimeCallInfo,ArkUI_Params & params)56 void XComponentBridge::ParseParams(ArkUIRuntimeCallInfo* runtimeCallInfo, ArkUI_Params& params)
57 {
58     ArkUI_XComponent_Params* xcParams = (ArkUI_XComponent_Params*)(&params);
59     EcmaVM* vm = runtimeCallInfo->GetVM();
60     CHECK_NULL_VOID(vm);
61     Local<JSValueRef> paramsArg = runtimeCallInfo->GetCallArgRef(ARG_TYPE);
62     CHECK_NULL_VOID(paramsArg->IsObject(vm));
63     auto obj = Local<panda::ObjectRef>(paramsArg);
64     auto idStr = panda::StringRef::NewFromUtf8(vm, "id");
65     auto typeStr = panda::StringRef::NewFromUtf8(vm, "type");
66     auto librarynameStr = panda::StringRef::NewFromUtf8(vm, "libraryname");
67     auto controllerStr = panda::StringRef::NewFromUtf8(vm, "controller");
68     auto imageAIOptionsStr = panda::StringRef::NewFromUtf8(vm, "imageAIOptions");
69 
70     auto idArg = obj->Get(vm, idStr);
71     auto typeArg = obj->Get(vm, typeStr);
72     auto libraryNameArg = obj->Get(vm, librarynameStr);
73     auto controllerArg = obj->Get(vm, controllerStr);
74     auto imageAIOptionsArg = obj->Get(vm, imageAIOptionsStr);
75 
76     xcParams->id = idArg->IsString(vm) ? idArg->ToString(vm)->ToString(vm) : "";
77     if (libraryNameArg->IsString(vm)) {
78         xcParams->libraryName = libraryNameArg->ToString(vm)->ToString(vm);
79     }
80     if (typeArg->IsString(vm)) {
81         xcParams->type = ConvertToXComponentType(typeArg->ToString(vm)->ToString(vm));
82     } else if (typeArg->IsNumber()) {
83         xcParams->type = static_cast<XComponentType>(typeArg->Int32Value(vm));
84     }
85     xcParams->controller = nullptr;
86     if (controllerArg->IsObject(vm)) {
87         Framework::JSXComponentController* jsXComponentController = static_cast<Framework::JSXComponentController*>(
88             Local<panda::ObjectRef>(controllerArg)->GetNativePointerField(vm, 0));
89         if (jsXComponentController) {
90             jsXComponentController->SetInstanceId(Container::CurrentId());
91             Framework::XComponentClient::GetInstance().AddControllerToJSXComponentControllersMap(
92                 xcParams->id, jsXComponentController);
93             xcParams->controller = jsXComponentController->GetController();
94         }
95     }
96     xcParams->aiOptions = nullptr;
97     if (imageAIOptionsArg->IsObject(vm)) {
98         auto engine = EngineHelper::GetCurrentEngine();
99         CHECK_NULL_VOID(engine);
100         NativeEngine* nativeEngine = engine->GetNativeEngine();
101         CHECK_NULL_VOID(nativeEngine);
102         Local<JSValueRef> value = imageAIOptionsArg;
103         JSValueWrapper valueWrapper = value;
104         Framework::ScopeRAII scope(reinterpret_cast<napi_env>(nativeEngine));
105         napi_value optionsValue = nativeEngine->ValueToNapiValue(valueWrapper);
106         xcParams->aiOptions = optionsValue;
107     }
108 }
109 
SetControllerOnCreated(ArkUIRuntimeCallInfo * runtimeCallInfo,FrameNode * frameNode)110 void XComponentBridge::SetControllerOnCreated(ArkUIRuntimeCallInfo* runtimeCallInfo, FrameNode* frameNode)
111 {
112     CHECK_NULL_VOID(frameNode);
113     EcmaVM* vm = runtimeCallInfo->GetVM();
114     Local<JSValueRef> paramsArg = runtimeCallInfo->GetCallArgRef(ARG_TYPE);
115     CHECK_NULL_VOID(paramsArg->IsObject(vm));
116     auto obj = Local<panda::ObjectRef>(paramsArg);
117     auto controllerStr = panda::StringRef::NewFromUtf8(vm, "controller");
118     auto controllerArg = obj->Get(vm, controllerStr);
119     CHECK_NULL_VOID(controllerArg->IsObject(vm));
120     auto object = controllerArg->ToObject(vm);
121     auto createdFunc = object->Get(vm, panda::StringRef::NewFromUtf8(vm, "onSurfaceCreated"));
122     if (createdFunc->IsFunction(vm)) {
123         panda::Local<panda::FunctionRef> func = createdFunc;
124         auto onSurfaceCreated = [vm, func = panda::CopyableGlobal(vm, func), frameNode](const std::string& surfaceId) {
125             panda::LocalScope pandaScope(vm);
126             panda::TryCatch trycatch(vm);
127             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
128             panda::Local<panda::JSValueRef> para[1] = { panda::StringRef::NewFromUtf8(vm, surfaceId.c_str()) };
129             func->Call(vm, func.ToLocal(), para, 1);
130         };
131         XComponentModelNG::SetControllerOnCreated(frameNode, std::move(onSurfaceCreated));
132     }
133 }
134 
SetControllerOnChanged(ArkUIRuntimeCallInfo * runtimeCallInfo,FrameNode * frameNode)135 void XComponentBridge::SetControllerOnChanged(ArkUIRuntimeCallInfo* runtimeCallInfo, FrameNode* frameNode)
136 {
137     CHECK_NULL_VOID(frameNode);
138     EcmaVM* vm = runtimeCallInfo->GetVM();
139     Local<JSValueRef> paramsArg = runtimeCallInfo->GetCallArgRef(ARG_TYPE);
140     CHECK_NULL_VOID(paramsArg->IsObject(vm));
141     auto obj = Local<panda::ObjectRef>(paramsArg);
142     auto controllerStr = panda::StringRef::NewFromUtf8(vm, "controller");
143     auto controllerArg = obj->Get(vm, controllerStr);
144     CHECK_NULL_VOID(controllerArg->IsObject(vm));
145     auto object = controllerArg->ToObject(vm);
146     auto changedFunc = object->Get(vm, panda::StringRef::NewFromUtf8(vm, "onSurfaceChanged"));
147     if (changedFunc->IsFunction(vm)) {
148         panda::Local<panda::FunctionRef> func = changedFunc;
149         auto onSurfaceChanged = [vm, func = panda::CopyableGlobal(vm, func), frameNode](
150                                     const std::string& surfaceId, const NG::RectF& rect) {
151             panda::LocalScope pandaScope(vm);
152             panda::TryCatch trycatch(vm);
153             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
154             const char* keys[] = { "offsetX", "offsetY", "surfaceWidth", "surfaceHeight" };
155             Local<JSValueRef> rectValues[] = { panda::NumberRef::New(vm, rect.Left()),
156                 panda::NumberRef::New(vm, rect.Top()), panda::NumberRef::New(vm, rect.Width()),
157                 panda::NumberRef::New(vm, rect.Height()) };
158             auto rectObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, rectValues);
159             panda::Local<panda::JSValueRef> para[2] = { panda::StringRef::NewFromUtf8(vm, surfaceId.c_str()), rectObj };
160             func->Call(vm, func.ToLocal(), para, 2);
161         };
162         XComponentModelNG::SetControllerOnChanged(frameNode, std::move(onSurfaceChanged));
163     }
164 }
165 
SetControllerOnDestroyed(ArkUIRuntimeCallInfo * runtimeCallInfo,FrameNode * frameNode)166 void XComponentBridge::SetControllerOnDestroyed(ArkUIRuntimeCallInfo* runtimeCallInfo, FrameNode* frameNode)
167 {
168     CHECK_NULL_VOID(frameNode);
169     EcmaVM* vm = runtimeCallInfo->GetVM();
170     Local<JSValueRef> paramsArg = runtimeCallInfo->GetCallArgRef(ARG_TYPE);
171     CHECK_NULL_VOID(paramsArg->IsObject(vm));
172     auto obj = Local<panda::ObjectRef>(paramsArg);
173     auto controllerStr = panda::StringRef::NewFromUtf8(vm, "controller");
174     auto controllerArg = obj->Get(vm, controllerStr);
175     CHECK_NULL_VOID(controllerArg->IsObject(vm));
176     auto object = controllerArg->ToObject(vm);
177     auto destroyedFunc = object->Get(vm, panda::StringRef::NewFromUtf8(vm, "onSurfaceDestroyed"));
178     if (destroyedFunc->IsFunction(vm)) {
179         panda::Local<panda::FunctionRef> func = destroyedFunc;
180         auto ondestroyed = [vm, func = panda::CopyableGlobal(vm, func), frameNode](const std::string& surfaceId) {
181             panda::LocalScope pandaScope(vm);
182             panda::TryCatch trycatch(vm);
183             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
184             panda::Local<panda::JSValueRef> para[1] = { panda::StringRef::NewFromUtf8(vm, surfaceId.c_str()) };
185             func->Call(vm, func.ToLocal(), para, 1);
186         };
187         XComponentModelNG::SetControllerOnDestroyed(frameNode, std::move(ondestroyed));
188     }
189 }
190 
SetControllerCallback(ArkUIRuntimeCallInfo * runtimeCallInfo,FrameNode * frameNode)191 void XComponentBridge::SetControllerCallback(ArkUIRuntimeCallInfo* runtimeCallInfo, FrameNode* frameNode)
192 {
193     SetControllerOnCreated(runtimeCallInfo, frameNode);
194     SetControllerOnChanged(runtimeCallInfo, frameNode);
195     SetControllerOnDestroyed(runtimeCallInfo, frameNode);
196 }
197 
SetControllerCallback(ArkUIRuntimeCallInfo * runtimeCallInfo)198 void XComponentBridge::SetControllerCallback(ArkUIRuntimeCallInfo* runtimeCallInfo)
199 {
200     EcmaVM* vm = runtimeCallInfo->GetVM();
201     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(ARG_FIRST);
202     Local<JSValueRef> controllerArg = runtimeCallInfo->GetCallArgRef(ARG_CONTROLLER);
203     auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
204     auto object = controllerArg->ToObject(vm);
205     auto createdFunc = object->Get(vm, panda::StringRef::NewFromUtf8(vm, "onSurfaceCreated"));
206     if (createdFunc->IsFunction(vm)) {
207         panda::Local<panda::FunctionRef> func = createdFunc;
208         auto onSurfaceCreated = [vm, func = panda::CopyableGlobal(vm, func), frameNode](const std::string& surfaceId) {
209             panda::LocalScope pandaScope(vm);
210             panda::TryCatch trycatch(vm);
211             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
212             panda::Local<panda::JSValueRef> para[1] = { panda::StringRef::NewFromUtf8(vm, surfaceId.c_str()) };
213             func->Call(vm, func.ToLocal(), para, 1);
214         };
215         XComponentModelNG::SetControllerOnCreated(frameNode, std::move(onSurfaceCreated));
216     }
217     auto changedFunc = object->Get(vm, panda::StringRef::NewFromUtf8(vm, "onSurfaceChanged"));
218     if (changedFunc->IsFunction(vm)) {
219         panda::Local<panda::FunctionRef> func = changedFunc;
220         auto onSurfaceChanged = [vm, func = panda::CopyableGlobal(vm, func), frameNode](
221                                     const std::string& surfaceId, const NG::RectF& rect) {
222             panda::LocalScope pandaScope(vm);
223             panda::TryCatch trycatch(vm);
224             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
225             const char* keys[] = { "offsetX", "offsetY", "surfaceWidth", "surfaceHeight" };
226             Local<JSValueRef> rectValues[] = { panda::NumberRef::New(vm, rect.Left()),
227                 panda::NumberRef::New(vm, rect.Top()), panda::NumberRef::New(vm, rect.Width()),
228                 panda::NumberRef::New(vm, rect.Height()) };
229             auto rectObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, rectValues);
230             panda::Local<panda::JSValueRef> para[2] = { panda::StringRef::NewFromUtf8(vm, surfaceId.c_str()), rectObj };
231             func->Call(vm, func.ToLocal(), para, 2);
232         };
233         XComponentModelNG::SetControllerOnChanged(frameNode, std::move(onSurfaceChanged));
234     }
235     auto destroyedFunc = object->Get(vm, panda::StringRef::NewFromUtf8(vm, "onSurfaceDestroyed"));
236     if (destroyedFunc->IsFunction(vm)) {
237         panda::Local<panda::FunctionRef> func = destroyedFunc;
238         auto ondestroyed = [vm, func = panda::CopyableGlobal(vm, func), frameNode](const std::string& surfaceId) {
239             panda::LocalScope pandaScope(vm);
240             panda::TryCatch trycatch(vm);
241             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
242             panda::Local<panda::JSValueRef> para[1] = { panda::StringRef::NewFromUtf8(vm, surfaceId.c_str()) };
243             func->Call(vm, func.ToLocal(), para, 1);
244         };
245         XComponentModelNG::SetControllerOnDestroyed(frameNode, std::move(ondestroyed));
246     }
247 }
248 
SetXComponentInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)249 ArkUINativeModuleValue XComponentBridge::SetXComponentInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
250 {
251     EcmaVM* vm = runtimeCallInfo->GetVM();
252     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
253     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(ARG_FIRST);
254     Local<JSValueRef> idArg = runtimeCallInfo->GetCallArgRef(ARG_ID);
255     Local<JSValueRef> typeArg = runtimeCallInfo->GetCallArgRef(ARG_TYPE);
256     Local<JSValueRef> librarynameArg = runtimeCallInfo->GetCallArgRef(ARG_LIBRARY_NAME);
257     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
258     if (!idArg->IsString(vm)) {
259         return panda::JSValueRef::Undefined(vm);
260     }
261     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
262     Framework::JSRef<Framework::JSVal> args = info[ARG_CONTROLLER];
263     Framework::JSRef<Framework::JSObject> controllerObj;
264     std::shared_ptr<InnerXComponentController> xcomponentController = nullptr;
265     if (args->IsObject()) {
266         controllerObj = Framework::JSRef<Framework::JSObject>::Cast(args);
267         Framework::JSXComponentController* jsXComponentController =
268             controllerObj->Unwrap<Framework::JSXComponentController>();
269         if (jsXComponentController) {
270             jsXComponentController->SetInstanceId(Container::CurrentId());
271             Framework::XComponentClient::GetInstance().AddControllerToJSXComponentControllersMap(
272                 idArg->ToString(vm)->ToString(vm), jsXComponentController);
273             xcomponentController = jsXComponentController->GetController();
274         }
275     }
276     XComponentType xcomponentType = XComponentType::SURFACE;
277     if (typeArg->IsString(vm)) {
278         xcomponentType = ConvertToXComponentType(typeArg->ToString(vm)->ToString(vm));
279     } else if (typeArg->IsNumber()) {
280         xcomponentType = static_cast<XComponentType>(typeArg->Int32Value(vm));
281     }
282     GetArkUINodeModifiers()->getXComponentModifier()->setXComponentId(
283         nativeNode, idArg->ToString(vm)->ToString(vm).c_str());
284     GetArkUINodeModifiers()->getXComponentModifier()->setXComponentType(
285         nativeNode, static_cast<int32_t>(xcomponentType));
286     if (librarynameArg->IsString(vm)) {
287         auto libraryName = librarynameArg->ToString(vm)->ToString(vm);
288         GetArkUINodeModifiers()->getXComponentModifier()->setXComponentLibraryname(nativeNode, libraryName.c_str());
289     }
290     if ((librarynameArg->IsNull() || librarynameArg->IsUndefined()) && xcomponentController &&
291         !controllerObj->IsUndefined()) {
292         SetControllerCallback(runtimeCallInfo);
293     }
294     HandleDetachCallback(runtimeCallInfo);
295     HandleImageAIOptions(runtimeCallInfo);
296     GetArkUINodeModifiers()->getXComponentModifier()->initXComponent(nativeNode);
297     return panda::JSValueRef::Undefined(vm);
298 }
299 
HandleDetachCallback(ArkUIRuntimeCallInfo * runtimeCallInfo)300 void XComponentBridge::HandleDetachCallback(ArkUIRuntimeCallInfo *runtimeCallInfo)
301 {
302     EcmaVM* vm = runtimeCallInfo->GetVM();
303     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(ARG_FIRST);
304     auto detachCallback = [](const std::string& xcomponentId) {
305         Framework::XComponentClient::GetInstance().DeleteControllerFromJSXComponentControllersMap(xcomponentId);
306         Framework::XComponentClient::GetInstance().DeleteFromJsValMapById(xcomponentId);
307     };
308     auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
309     XComponentModelNG::SetDetachCallback(frameNode, std::move(detachCallback));
310 }
311 
HandleImageAIOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)312 void XComponentBridge::HandleImageAIOptions(ArkUIRuntimeCallInfo *runtimeCallInfo)
313 {
314     EcmaVM* vm = runtimeCallInfo->GetVM();
315     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(ARG_FIRST);
316     Local<JSValueRef> imageAIOptionsArg = runtimeCallInfo->GetCallArgRef(ARG_IMAGE_AI_OPTIONS);
317     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
318     if (imageAIOptionsArg->IsObject(vm)) {
319         auto engine = EngineHelper::GetCurrentEngine();
320         CHECK_NULL_VOID(engine);
321         NativeEngine* nativeEngine = engine->GetNativeEngine();
322         CHECK_NULL_VOID(nativeEngine);
323         Local<JSValueRef> value = imageAIOptionsArg;
324         JSValueWrapper valueWrapper = value;
325         Framework::ScopeRAII scope(reinterpret_cast<napi_env>(nativeEngine));
326         napi_value optionsValue = nativeEngine->ValueToNapiValue(valueWrapper);
327         GetArkUINodeModifiers()->getXComponentModifier()->setImageAIOptions(nativeNode, optionsValue);
328     }
329 }
330 
ResetXComponentInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)331 ArkUINativeModuleValue XComponentBridge::ResetXComponentInitialize(ArkUIRuntimeCallInfo *runtimeCallInfo)
332 {
333     EcmaVM *vm = runtimeCallInfo->GetVM();
334     return panda::JSValueRef::Undefined(vm);
335 }
336 
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)337 ArkUINativeModuleValue XComponentBridge::SetBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
338 {
339     EcmaVM *vm = runtimeCallInfo->GetVM();
340     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
341     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(ARG_FIRST);
342     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(ARG_ID);
343     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
344     Color color;
345     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
346         GetArkUINodeModifiers()->getXComponentModifier()->resetXComponentBackgroundColor(nativeNode);
347     } else {
348         GetArkUINodeModifiers()->getXComponentModifier()->setXComponentBackgroundColor(nativeNode, color.GetValue());
349     }
350     return panda::JSValueRef::Undefined(vm);
351 }
352 
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)353 ArkUINativeModuleValue XComponentBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
354 {
355     EcmaVM *vm = runtimeCallInfo->GetVM();
356     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
357     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(ARG_FIRST);
358     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
359     GetArkUINodeModifiers()->getXComponentModifier()->resetXComponentBackgroundColor(nativeNode);
360     return panda::JSValueRef::Undefined(vm);
361 }
362 
SetOpacity(ArkUIRuntimeCallInfo * runtimeCallInfo)363 ArkUINativeModuleValue XComponentBridge::SetOpacity(ArkUIRuntimeCallInfo *runtimeCallInfo)
364 {
365     EcmaVM *vm = runtimeCallInfo->GetVM();
366     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
367     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(ARG_FIRST);
368     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(ARG_ID);
369     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
370     double opacity;
371     if (!ArkTSUtils::ParseJsDouble(vm, secondArg, opacity)) {
372         GetArkUINodeModifiers()->getXComponentModifier()->resetXComponentOpacity(nativeNode);
373     } else {
374         GetArkUINodeModifiers()->getXComponentModifier()->setXComponentOpacity(nativeNode, opacity);
375     }
376     return panda::JSValueRef::Undefined(vm);
377 }
378 
ResetOpacity(ArkUIRuntimeCallInfo * runtimeCallInfo)379 ArkUINativeModuleValue XComponentBridge::ResetOpacity(ArkUIRuntimeCallInfo *runtimeCallInfo)
380 {
381     EcmaVM *vm = runtimeCallInfo->GetVM();
382     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
383     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(ARG_FIRST);
384     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
385     GetArkUINodeModifiers()->getXComponentModifier()->resetXComponentOpacity(nativeNode);
386     return panda::JSValueRef::Undefined(vm);
387 }
388 
SetLinearGradientBlur(ArkUIRuntimeCallInfo * runtimeCallInfo)389 ArkUINativeModuleValue XComponentBridge::SetLinearGradientBlur(ArkUIRuntimeCallInfo *runtimeCallInfo)
390 {
391     EcmaVM* vm = runtimeCallInfo->GetVM();
392     return panda::JSValueRef::Undefined(vm);
393 }
394 
ResetLinearGradientBlur(ArkUIRuntimeCallInfo * runtimeCallInfo)395 ArkUINativeModuleValue XComponentBridge::ResetLinearGradientBlur(ArkUIRuntimeCallInfo *runtimeCallInfo)
396 {
397     EcmaVM* vm = runtimeCallInfo->GetVM();
398     return panda::JSValueRef::Undefined(vm);
399 }
400 
SetPixelStretchEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)401 ArkUINativeModuleValue XComponentBridge::SetPixelStretchEffect(ArkUIRuntimeCallInfo *runtimeCallInfo)
402 {
403     EcmaVM* vm = runtimeCallInfo->GetVM();
404     return panda::JSValueRef::Undefined(vm);
405 }
406 
ResetPixelStretchEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)407 ArkUINativeModuleValue XComponentBridge::ResetPixelStretchEffect(ArkUIRuntimeCallInfo *runtimeCallInfo)
408 {
409     EcmaVM* vm = runtimeCallInfo->GetVM();
410     return panda::JSValueRef::Undefined(vm);
411 }
412 
SetLightUpEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)413 ArkUINativeModuleValue XComponentBridge::SetLightUpEffect(ArkUIRuntimeCallInfo *runtimeCallInfo)
414 {
415     EcmaVM* vm = runtimeCallInfo->GetVM();
416     return panda::JSValueRef::Undefined(vm);
417 }
418 
ResetLightUpEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)419 ArkUINativeModuleValue XComponentBridge::ResetLightUpEffect(ArkUIRuntimeCallInfo *runtimeCallInfo)
420 {
421     EcmaVM* vm = runtimeCallInfo->GetVM();
422     return panda::JSValueRef::Undefined(vm);
423 }
424 
SetSphericalEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)425 ArkUINativeModuleValue XComponentBridge::SetSphericalEffect(ArkUIRuntimeCallInfo *runtimeCallInfo)
426 {
427     EcmaVM* vm = runtimeCallInfo->GetVM();
428     return panda::JSValueRef::Undefined(vm);
429 }
430 
ResetSphericalEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)431 ArkUINativeModuleValue XComponentBridge::ResetSphericalEffect(ArkUIRuntimeCallInfo *runtimeCallInfo)
432 {
433     EcmaVM* vm = runtimeCallInfo->GetVM();
434     return panda::JSValueRef::Undefined(vm);
435 }
436 
SetColorBlend(ArkUIRuntimeCallInfo * runtimeCallInfo)437 ArkUINativeModuleValue XComponentBridge::SetColorBlend(ArkUIRuntimeCallInfo *runtimeCallInfo)
438 {
439     EcmaVM* vm = runtimeCallInfo->GetVM();
440     return panda::JSValueRef::Undefined(vm);
441 }
442 
ResetColorBlend(ArkUIRuntimeCallInfo * runtimeCallInfo)443 ArkUINativeModuleValue XComponentBridge::ResetColorBlend(ArkUIRuntimeCallInfo *runtimeCallInfo)
444 {
445     EcmaVM* vm = runtimeCallInfo->GetVM();
446     return panda::JSValueRef::Undefined(vm);
447 }
448 
SetHueRotate(ArkUIRuntimeCallInfo * runtimeCallInfo)449 ArkUINativeModuleValue XComponentBridge::SetHueRotate(ArkUIRuntimeCallInfo *runtimeCallInfo)
450 {
451     EcmaVM* vm = runtimeCallInfo->GetVM();
452     return panda::JSValueRef::Undefined(vm);
453 }
454 
ResetHueRotate(ArkUIRuntimeCallInfo * runtimeCallInfo)455 ArkUINativeModuleValue XComponentBridge::ResetHueRotate(ArkUIRuntimeCallInfo *runtimeCallInfo)
456 {
457     EcmaVM* vm = runtimeCallInfo->GetVM();
458     return panda::JSValueRef::Undefined(vm);
459 }
460 
SetSepia(ArkUIRuntimeCallInfo * runtimeCallInfo)461 ArkUINativeModuleValue XComponentBridge::SetSepia(ArkUIRuntimeCallInfo *runtimeCallInfo)
462 {
463     EcmaVM* vm = runtimeCallInfo->GetVM();
464     return panda::JSValueRef::Undefined(vm);
465 }
466 
ResetSepia(ArkUIRuntimeCallInfo * runtimeCallInfo)467 ArkUINativeModuleValue XComponentBridge::ResetSepia(ArkUIRuntimeCallInfo *runtimeCallInfo)
468 {
469     EcmaVM* vm = runtimeCallInfo->GetVM();
470     return panda::JSValueRef::Undefined(vm);
471 }
472 
SetInvert(ArkUIRuntimeCallInfo * runtimeCallInfo)473 ArkUINativeModuleValue XComponentBridge::SetInvert(ArkUIRuntimeCallInfo *runtimeCallInfo)
474 {
475     EcmaVM* vm = runtimeCallInfo->GetVM();
476     return panda::JSValueRef::Undefined(vm);
477 }
478 
ResetInvert(ArkUIRuntimeCallInfo * runtimeCallInfo)479 ArkUINativeModuleValue XComponentBridge::ResetInvert(ArkUIRuntimeCallInfo *runtimeCallInfo)
480 {
481     EcmaVM* vm = runtimeCallInfo->GetVM();
482     return panda::JSValueRef::Undefined(vm);
483 }
484 
SetContrast(ArkUIRuntimeCallInfo * runtimeCallInfo)485 ArkUINativeModuleValue XComponentBridge::SetContrast(ArkUIRuntimeCallInfo *runtimeCallInfo)
486 {
487     EcmaVM* vm = runtimeCallInfo->GetVM();
488     return panda::JSValueRef::Undefined(vm);
489 }
490 
ResetContrast(ArkUIRuntimeCallInfo * runtimeCallInfo)491 ArkUINativeModuleValue XComponentBridge::ResetContrast(ArkUIRuntimeCallInfo *runtimeCallInfo)
492 {
493     EcmaVM* vm = runtimeCallInfo->GetVM();
494     return panda::JSValueRef::Undefined(vm);
495 }
496 
SetSaturate(ArkUIRuntimeCallInfo * runtimeCallInfo)497 ArkUINativeModuleValue XComponentBridge::SetSaturate(ArkUIRuntimeCallInfo *runtimeCallInfo)
498 {
499     EcmaVM* vm = runtimeCallInfo->GetVM();
500     return panda::JSValueRef::Undefined(vm);
501 }
502 
ResetSaturate(ArkUIRuntimeCallInfo * runtimeCallInfo)503 ArkUINativeModuleValue XComponentBridge::ResetSaturate(ArkUIRuntimeCallInfo *runtimeCallInfo)
504 {
505     EcmaVM* vm = runtimeCallInfo->GetVM();
506     return panda::JSValueRef::Undefined(vm);
507 }
508 
SetBrightness(ArkUIRuntimeCallInfo * runtimeCallInfo)509 ArkUINativeModuleValue XComponentBridge::SetBrightness(ArkUIRuntimeCallInfo *runtimeCallInfo)
510 {
511     EcmaVM* vm = runtimeCallInfo->GetVM();
512     return panda::JSValueRef::Undefined(vm);
513 }
514 
ResetBrightness(ArkUIRuntimeCallInfo * runtimeCallInfo)515 ArkUINativeModuleValue XComponentBridge::ResetBrightness(ArkUIRuntimeCallInfo *runtimeCallInfo)
516 {
517     EcmaVM* vm = runtimeCallInfo->GetVM();
518     return panda::JSValueRef::Undefined(vm);
519 }
520 
SetGrayscale(ArkUIRuntimeCallInfo * runtimeCallInfo)521 ArkUINativeModuleValue XComponentBridge::SetGrayscale(ArkUIRuntimeCallInfo *runtimeCallInfo)
522 {
523     EcmaVM* vm = runtimeCallInfo->GetVM();
524     return panda::JSValueRef::Undefined(vm);
525 }
526 
ResetGrayscale(ArkUIRuntimeCallInfo * runtimeCallInfo)527 ArkUINativeModuleValue XComponentBridge::ResetGrayscale(ArkUIRuntimeCallInfo *runtimeCallInfo)
528 {
529     EcmaVM* vm = runtimeCallInfo->GetVM();
530     return panda::JSValueRef::Undefined(vm);
531 }
532 
SetBackdropBlur(ArkUIRuntimeCallInfo * runtimeCallInfo)533 ArkUINativeModuleValue XComponentBridge::SetBackdropBlur(ArkUIRuntimeCallInfo *runtimeCallInfo)
534 {
535     EcmaVM* vm = runtimeCallInfo->GetVM();
536     return panda::JSValueRef::Undefined(vm);
537 }
538 
ResetBackdropBlur(ArkUIRuntimeCallInfo * runtimeCallInfo)539 ArkUINativeModuleValue XComponentBridge::ResetBackdropBlur(ArkUIRuntimeCallInfo *runtimeCallInfo)
540 {
541     EcmaVM* vm = runtimeCallInfo->GetVM();
542     return panda::JSValueRef::Undefined(vm);
543 }
544 
SetBlur(ArkUIRuntimeCallInfo * runtimeCallInfo)545 ArkUINativeModuleValue XComponentBridge::SetBlur(ArkUIRuntimeCallInfo *runtimeCallInfo)
546 {
547     EcmaVM* vm = runtimeCallInfo->GetVM();
548     return panda::JSValueRef::Undefined(vm);
549 }
550 
ResetBlur(ArkUIRuntimeCallInfo * runtimeCallInfo)551 ArkUINativeModuleValue XComponentBridge::ResetBlur(ArkUIRuntimeCallInfo *runtimeCallInfo)
552 {
553     EcmaVM* vm = runtimeCallInfo->GetVM();
554     return panda::JSValueRef::Undefined(vm);
555 }
556 
SetBackgroundImagePosition(ArkUIRuntimeCallInfo * runtimeCallInfo)557 ArkUINativeModuleValue XComponentBridge::SetBackgroundImagePosition(ArkUIRuntimeCallInfo *runtimeCallInfo)
558 {
559     EcmaVM* vm = runtimeCallInfo->GetVM();
560     return panda::JSValueRef::Undefined(vm);
561 }
562 
ResetBackgroundImagePosition(ArkUIRuntimeCallInfo * runtimeCallInfo)563 ArkUINativeModuleValue XComponentBridge::ResetBackgroundImagePosition(ArkUIRuntimeCallInfo *runtimeCallInfo)
564 {
565     EcmaVM* vm = runtimeCallInfo->GetVM();
566     return panda::JSValueRef::Undefined(vm);
567 }
568 
SetBackgroundImageSize(ArkUIRuntimeCallInfo * runtimeCallInfo)569 ArkUINativeModuleValue XComponentBridge::SetBackgroundImageSize(ArkUIRuntimeCallInfo *runtimeCallInfo)
570 {
571     EcmaVM* vm = runtimeCallInfo->GetVM();
572     return panda::JSValueRef::Undefined(vm);
573 }
574 
ResetBackgroundImageSize(ArkUIRuntimeCallInfo * runtimeCallInfo)575 ArkUINativeModuleValue XComponentBridge::ResetBackgroundImageSize(ArkUIRuntimeCallInfo *runtimeCallInfo)
576 {
577     EcmaVM* vm = runtimeCallInfo->GetVM();
578     return panda::JSValueRef::Undefined(vm);
579 }
580 
SetBackgroundImage(ArkUIRuntimeCallInfo * runtimeCallInfo)581 ArkUINativeModuleValue XComponentBridge::SetBackgroundImage(ArkUIRuntimeCallInfo *runtimeCallInfo)
582 {
583     EcmaVM* vm = runtimeCallInfo->GetVM();
584     return panda::JSValueRef::Undefined(vm);
585 }
586 
ResetBackgroundImage(ArkUIRuntimeCallInfo * runtimeCallInfo)587 ArkUINativeModuleValue XComponentBridge::ResetBackgroundImage(ArkUIRuntimeCallInfo *runtimeCallInfo)
588 {
589     EcmaVM* vm = runtimeCallInfo->GetVM();
590     return panda::JSValueRef::Undefined(vm);
591 }
592 
SetOnLoad(ArkUIRuntimeCallInfo * runtimeCallInfo)593 ArkUINativeModuleValue XComponentBridge::SetOnLoad(ArkUIRuntimeCallInfo* runtimeCallInfo)
594 {
595     EcmaVM* vm = runtimeCallInfo->GetVM();
596     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
597     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(ARG_FIRST);
598     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(ARG_ID);
599     CHECK_NULL_RETURN(secondArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
600     auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
601     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
602     auto obj = secondArg->ToObject(vm);
603     panda::Local<panda::FunctionRef> func = obj;
604     auto onLoad = [vm, func = panda::CopyableGlobal(vm, func), frameNode](const std::string& xcomponentId) {
605         panda::LocalScope pandaScope(vm);
606         panda::TryCatch trycatch(vm);
607         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
608         std::vector<Local<JSValueRef>> argv;
609         Framework::JSRef<Framework::JSVal> jsVal;
610         if (Framework::XComponentClient::GetInstance().GetJSVal(xcomponentId, jsVal)) {
611             argv.emplace_back(jsVal->GetLocalHandle());
612         }
613         func->Call(vm, func.ToLocal(), argv.data(), argv.size());
614     };
615     XComponentModelNG::SetOnLoad(frameNode, std::move(onLoad));
616     return panda::JSValueRef::Undefined(vm);
617 }
618 
ResetOnLoad(ArkUIRuntimeCallInfo * runtimeCallInfo)619 ArkUINativeModuleValue XComponentBridge::ResetOnLoad(ArkUIRuntimeCallInfo* runtimeCallInfo)
620 {
621     EcmaVM* vm = runtimeCallInfo->GetVM();
622     return panda::JSValueRef::Undefined(vm);
623 }
624 
SetOnDestroy(ArkUIRuntimeCallInfo * runtimeCallInfo)625 ArkUINativeModuleValue XComponentBridge::SetOnDestroy(ArkUIRuntimeCallInfo* runtimeCallInfo)
626 {
627     EcmaVM* vm = runtimeCallInfo->GetVM();
628     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
629     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(ARG_FIRST);
630     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(ARG_ID);
631     CHECK_NULL_RETURN(secondArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
632     auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
633     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
634     auto obj = secondArg->ToObject(vm);
635     panda::Local<panda::FunctionRef> func = obj;
636     auto onDestroy = [vm, func = panda::CopyableGlobal(vm, func), frameNode]() {
637         panda::LocalScope pandaScope(vm);
638         panda::TryCatch trycatch(vm);
639         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
640         func->Call(vm, func.ToLocal(), nullptr, 0);
641     };
642     XComponentModelNG::SetOnDestroy(frameNode, std::move(onDestroy));
643     return panda::JSValueRef::Undefined(vm);
644 }
645 
ResetOnDestroy(ArkUIRuntimeCallInfo * runtimeCallInfo)646 ArkUINativeModuleValue XComponentBridge::ResetOnDestroy(ArkUIRuntimeCallInfo* runtimeCallInfo)
647 {
648     EcmaVM* vm = runtimeCallInfo->GetVM();
649     return panda::JSValueRef::Undefined(vm);
650 }
651 
SetEnableAnalyzer(ArkUIRuntimeCallInfo * runtimeCallInfo)652 ArkUINativeModuleValue XComponentBridge::SetEnableAnalyzer(ArkUIRuntimeCallInfo* runtimeCallInfo)
653 {
654     EcmaVM* vm = runtimeCallInfo->GetVM();
655     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
656     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(ARG_FIRST);
657     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(ARG_ID);
658     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
659     if (secondArg->IsBoolean()) {
660         bool boolValue = secondArg->ToBoolean(vm)->Value();
661         GetArkUINodeModifiers()->getXComponentModifier()->setXComponentEnableAnalyzer(nativeNode, boolValue);
662     } else {
663         GetArkUINodeModifiers()->getXComponentModifier()->resetXComponentEnableAnalyzer(nativeNode);
664     }
665     return panda::JSValueRef::Undefined(vm);
666 }
667 
ResetEnableAnalyzer(ArkUIRuntimeCallInfo * runtimeCallInfo)668 ArkUINativeModuleValue XComponentBridge::ResetEnableAnalyzer(ArkUIRuntimeCallInfo* runtimeCallInfo)
669 {
670     EcmaVM* vm = runtimeCallInfo->GetVM();
671     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
672     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(ARG_FIRST);
673     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
674     GetArkUINodeModifiers()->getXComponentModifier()->resetXComponentEnableAnalyzer(nativeNode);
675     return panda::JSValueRef::Undefined(vm);
676 }
677 
SetEnableSecure(ArkUIRuntimeCallInfo * runtimeCallInfo)678 ArkUINativeModuleValue XComponentBridge::SetEnableSecure(ArkUIRuntimeCallInfo *runtimeCallInfo)
679 {
680     EcmaVM *vm = runtimeCallInfo->GetVM();
681     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
682     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(ARG_FIRST);
683     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(ARG_ID);
684     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
685     if (secondArg->IsBoolean()) {
686         bool boolValue = secondArg->ToBoolean(vm)->Value();
687         GetArkUINodeModifiers()->getXComponentModifier()->setXComponentEnableSecure(nativeNode, boolValue);
688     } else {
689         GetArkUINodeModifiers()->getXComponentModifier()->resetXComponentEnableSecure(nativeNode);
690     }
691     return panda::JSValueRef::Undefined(vm);
692 }
693 
ResetEnableSecure(ArkUIRuntimeCallInfo * runtimeCallInfo)694 ArkUINativeModuleValue XComponentBridge::ResetEnableSecure(ArkUIRuntimeCallInfo *runtimeCallInfo)
695 {
696     EcmaVM *vm = runtimeCallInfo->GetVM();
697     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
698     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(ARG_FIRST);
699     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
700     GetArkUINodeModifiers()->getXComponentModifier()->resetXComponentEnableSecure(nativeNode);
701     return panda::JSValueRef::Undefined(vm);
702 }
703 } // namespace OHOS::Ace::NG
704