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*)(¶ms);
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