• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 "frameworks/bridge/declarative_frontend/engine/jsi/jsi_view_register.h"
17 
18 #include "base/error/error_code.h"
19 #include "base/geometry/ng/size_t.h"
20 #include "base/i18n/localization.h"
21 #include "base/log/log.h"
22 #include "base/memory/ace_type.h"
23 #include "base/memory/referenced.h"
24 #include "base/utils/system_properties.h"
25 #include "base/utils/utils.h"
26 #include "bridge/card_frontend/card_frontend_declarative.h"
27 #include "bridge/card_frontend/form_frontend_declarative.h"
28 #include "bridge/common/utils/engine_helper.h"
29 #include "bridge/declarative_frontend/declarative_frontend.h"
30 #include "bridge/declarative_frontend/engine/functions/js_drag_function.h"
31 #include "bridge/declarative_frontend/engine/js_object_template.h"
32 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_api_bridge.h"
33 #include "bridge/declarative_frontend/frontend_delegate_declarative.h"
34 #include "bridge/declarative_frontend/interfaces/profiler/js_profiler.h"
35 #include "bridge/declarative_frontend/jsview/canvas/js_canvas_image_data.h"
36 #include "bridge/js_frontend/engine/jsi/ark_js_runtime.h"
37 #include "core/common/card_scope.h"
38 #include "core/common/container.h"
39 #include "core/components/container_modal/container_modal_constants.h"
40 #include "core/components_ng/base/inspector.h"
41 #include "core/components_ng/base/inspector_filter.h"
42 #include "core/components_ng/pattern/stage/page_pattern.h"
43 #include "core/components_v2/inspector/inspector.h"
44 
45 namespace OHOS::Ace::Framework {
46 namespace {
47 static constexpr uint32_t PARAM_SIZE_ONE   = 1;
48 static constexpr uint32_t PARAM_SIZE_TWO   = 2;
49 static constexpr uint32_t PARAM_SIZE_THREE = 3;
50 static constexpr uint32_t PARAM_TRHEE_INDEX = 2;
51 constexpr int FUNC_SET_CREATE_ARG_LEN = 2;
52 }
53 
CreateJsObjectFromJsonValue(const EcmaVM * vm,const std::unique_ptr<JsonValue> & jsonValue)54 JSRef<JSVal> CreateJsObjectFromJsonValue(const EcmaVM* vm, const std::unique_ptr<JsonValue>& jsonValue)
55 {
56     if (jsonValue->IsBool()) {
57         return JSRef<JSVal>::Make(JsiValueConvertor::toJsiValueWithVM(vm, jsonValue->GetBool()));
58     } else if (jsonValue->IsNumber()) {
59         return JSRef<JSVal>::Make(JsiValueConvertor::toJsiValueWithVM(vm, jsonValue->GetDouble()));
60     } else if (jsonValue->IsString()) {
61         return JSRef<JSVal>::Make(JsiValueConvertor::toJsiValueWithVM(vm, jsonValue->GetString()));
62     } else if (jsonValue->IsArray()) {
63         JSRef<JSArray> array = JSRef<JSArray>::New();
64         int32_t size = jsonValue->GetArraySize();
65         for (int32_t i = 0; i < size; ++i) {
66             std::unique_ptr<JsonValue> item = jsonValue->GetArrayItem(i);
67             array->SetValueAt(i, CreateJsObjectFromJsonValue(vm, item));
68         }
69         return array;
70     } else if (jsonValue->IsObject()) {
71         JSRef<JSObject> object = JSRef<JSObject>::New();
72         std::unique_ptr<JsonValue> child = jsonValue->GetChild();
73         while (child && child->IsValid()) {
74             const std::string& key = child->GetKey();
75             object->SetPropertyObject(key.c_str(), CreateJsObjectFromJsonValue(vm, child));
76             child = child->GetNext();
77         }
78         return object;
79     } else if (jsonValue->IsNull()) {
80         return JSRef<JSVal>::Make(panda::JSValueRef::Null(vm));
81     } else {
82         return JSRef<JSVal>::Make(panda::JSValueRef::Undefined(vm));
83     }
84 }
85 
RegisterCardUpdateCallback(int64_t cardId,const panda::Local<panda::ObjectRef> & obj)86 void RegisterCardUpdateCallback(int64_t cardId, const panda::Local<panda::ObjectRef>& obj)
87 {
88     JSRef<JSObject> object = JSRef<JSObject>::Make(obj);
89     JSRef<JSVal> storageValue = object->GetProperty("localStorage_");
90     if (!storageValue->IsObject()) {
91         return;
92     }
93 
94     JSRef<JSObject> storage = JSRef<JSObject>::Cast(storageValue);
95     JSRef<JSVal> setOrCreateVal = storage->GetProperty("setOrCreate");
96     if (!setOrCreateVal->IsFunction()) {
97         return;
98     }
99 
100     JSRef<JSFunc> setOrCreate = JSRef<JSFunc>::Cast(setOrCreateVal);
101     auto id = ContainerScope::CurrentId();
102     auto callback = [storage, setOrCreate, id](const std::string& data) {
103         ContainerScope scope(id);
104         const EcmaVM* vm = storage->GetEcmaVM();
105         CHECK_NULL_VOID(vm);
106         std::unique_ptr<JsonValue> jsonRoot = JsonUtil::ParseJsonString(data);
107         CHECK_NULL_VOID(jsonRoot);
108         auto child = jsonRoot->GetChild();
109         if (!child || !child->IsValid()) {
110             return;
111         }
112 
113         while (child && child->IsValid()) {
114             const std::string& key = child->GetKey();
115             JSRef<JSVal> args[] = {
116                 JSRef<JSVal>::Make(JsiValueConvertor::toJsiValueWithVM(vm, key)),
117                 CreateJsObjectFromJsonValue(vm, child),
118             };
119             setOrCreate->Call(storage, FUNC_SET_CREATE_ARG_LEN, args);
120             child = child->GetNext();
121         }
122     };
123 
124     auto container = Container::Current();
125     if (container->IsFRSCardContainer() || container->IsDynamicRender()) {
126         auto frontEnd = AceType::DynamicCast<FormFrontendDeclarative>(container->GetCardFrontend(cardId).Upgrade());
127         CHECK_NULL_VOID(frontEnd);
128         auto delegate = frontEnd->GetDelegate();
129         CHECK_NULL_VOID(delegate);
130         delegate->SetUpdateCardDataCallback(callback);
131         delegate->UpdatePageDataImmediately();
132     } else {
133         auto frontEnd = AceType::DynamicCast<CardFrontendDeclarative>(container->GetCardFrontend(cardId).Upgrade());
134         CHECK_NULL_VOID(frontEnd);
135         auto delegate = frontEnd->GetDelegate();
136         CHECK_NULL_VOID(delegate);
137         delegate->SetUpdateCardDataCallback(callback);
138         delegate->UpdatePageDataImmediately();
139     }
140 }
141 
SetFormCallbacks(RefPtr<Container> container,JSView * view)142 void SetFormCallbacks(RefPtr<Container> container, JSView* view)
143 {
144     auto pipeline = container->GetPipelineContext();
145     if (pipeline != nullptr) {
146         pipeline->SetOnFormRecycleCallback([weak = Referenced::WeakClaim(view)]() {
147             auto view = weak.Upgrade();
148             std::string statusData;
149             if (view) {
150                 statusData = view->FireOnFormRecycle();
151             } else {
152                 LOGE("view is null");
153             }
154             return statusData;
155         });
156 
157         pipeline->SetOnFormRecoverCallback([weak = Referenced::WeakClaim(view)](const std::string& statusData) {
158             auto view = weak.Upgrade();
159             if (view) {
160                 view->FireOnFormRecover(statusData);
161             } else {
162                 LOGE("view is null");
163             }
164         });
165     } else {
166         LOGE("execute SetOnFormRecycleCallback and SetOnFormRecoverCallback failed due to pipeline is null");
167     }
168 }
169 
UpdatePageLifeCycleFunctions(RefPtr<NG::FrameNode> pageNode,JSView * view)170 void UpdatePageLifeCycleFunctions(RefPtr<NG::FrameNode> pageNode, JSView* view)
171 {
172     auto pagePattern = pageNode->GetPattern<NG::PagePattern>();
173     CHECK_NULL_VOID(pagePattern);
174     pagePattern->SetOnPageShow([weak = Referenced::WeakClaim(view)]() {
175         auto view = weak.Upgrade();
176         if (view) {
177             view->FireOnShow();
178         }
179     });
180     pagePattern->SetOnPageHide([weak = Referenced::WeakClaim(view)]() {
181         auto view = weak.Upgrade();
182         if (view) {
183             view->FireOnHide();
184         }
185     });
186     pagePattern->SetOnBackPressed([weak = Referenced::WeakClaim(view)]() {
187         auto view = weak.Upgrade();
188         if (view) {
189             return view->FireOnBackPress();
190         }
191         return false;
192     });
193 }
194 
UpdateCardRootComponent(const EcmaVM * vm,const panda::Local<panda::ObjectRef> & obj)195 void UpdateCardRootComponent(const EcmaVM* vm, const panda::Local<panda::ObjectRef>& obj)
196 {
197     auto* view = static_cast<JSView*>(obj->GetNativePointerField(vm, 0));
198     if (!view && !static_cast<JSViewPartialUpdate*>(view) && !static_cast<JSViewFullUpdate*>(view)) {
199         return;
200     }
201 
202     auto container = Container::Current();
203     if (container && container->IsUseNewPipeline()) {
204         // Set Partial Update
205         Container::SetCurrentUsePartialUpdate(!view->isFullUpdate());
206 
207         auto cardId = CardScope::CurrentId();
208         view->SetCardId(cardId);
209 
210         RegisterCardUpdateCallback(cardId, obj);
211 
212         RefPtr<NG::PageRouterManager> pageRouterManager;
213 
214         if (container->IsFRSCardContainer() || container->IsDynamicRender()) {
215             auto frontEnd = AceType::DynamicCast<FormFrontendDeclarative>(container->GetCardFrontend(cardId).Upgrade());
216             CHECK_NULL_VOID(frontEnd);
217             auto delegate = frontEnd->GetDelegate();
218             CHECK_NULL_VOID(delegate);
219             pageRouterManager = delegate->GetPageRouterManager();
220         } else {
221             auto frontEnd = AceType::DynamicCast<CardFrontendDeclarative>(container->GetCardFrontend(cardId).Upgrade());
222             CHECK_NULL_VOID(frontEnd);
223             auto delegate = frontEnd->GetDelegate();
224             CHECK_NULL_VOID(delegate);
225             pageRouterManager = delegate->GetPageRouterManager();
226         }
227         CHECK_NULL_VOID(pageRouterManager);
228         auto pageNode = pageRouterManager->GetCurrentPageNode();
229         CHECK_NULL_VOID(pageNode);
230 
231         auto pageRootNode = AceType::DynamicCast<NG::UINode>(view->CreateViewNode());
232         CHECK_NULL_VOID(pageRootNode);
233         pageRootNode->MountToParent(pageNode);
234 
235         SetFormCallbacks(container, view);
236         UpdatePageLifeCycleFunctions(pageNode, view);
237     }
238 }
239 
JsLoadDocument(panda::JsiRuntimeCallInfo * runtimeCallInfo)240 panda::Local<panda::JSValueRef> JsLoadDocument(panda::JsiRuntimeCallInfo* runtimeCallInfo)
241 {
242     EcmaVM* vm = runtimeCallInfo->GetVM();
243     LocalScope scope(vm);
244     uint32_t argc = runtimeCallInfo->GetArgsNumber();
245     if (argc != 1) {
246         return panda::JSValueRef::Undefined(vm);
247     }
248     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
249     if (!firstArg->IsObject(vm)) {
250         return panda::JSValueRef::Undefined(vm);
251     }
252 
253     auto container = Container::Current();
254     if (container && container->IsDynamicRender()) {
255         LOGD("load dynamic component card");
256         panda::Local<panda::ObjectRef> obj = firstArg->ToObject(vm);
257         UpdateCardRootComponent(vm, obj);
258         return panda::JSValueRef::Undefined(vm);
259     }
260 
261     panda::Global<panda::ObjectRef> obj(vm, Local<panda::ObjectRef>(firstArg));
262     JsiDeclarativeEngine::SetEntryObject(obj);
263 #if defined(PREVIEW)
264     panda::Global<panda::ObjectRef> rootView(vm, obj->ToObject(vm));
265     auto runtime = JsiDeclarativeEngineInstance::GetCurrentRuntime();
266     shared_ptr<ArkJSRuntime> arkRuntime = std::static_pointer_cast<ArkJSRuntime>(runtime);
267     arkRuntime->AddRootView(rootView);
268 #endif
269 
270     return panda::JSValueRef::Undefined(vm);
271 }
272 
JsLoadCustomTitleBar(panda::JsiRuntimeCallInfo * runtimeCallInfo)273 panda::Local<panda::JSValueRef> JsLoadCustomTitleBar(panda::JsiRuntimeCallInfo* runtimeCallInfo)
274 {
275     EcmaVM* vm = runtimeCallInfo->GetVM();
276     uint32_t argc = runtimeCallInfo->GetArgsNumber();
277     if (argc != 1) {
278         return panda::JSValueRef::Undefined(vm);
279     }
280     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
281     if (!firstArg->IsObject(vm)) {
282         return panda::JSValueRef::Undefined(vm);
283     }
284 
285     panda::Local<panda::ObjectRef> obj = firstArg->ToObject(vm);
286     AddCustomTitleBarComponent(obj);
287 
288     return panda::JSValueRef::Undefined(vm);
289 }
290 
JsRegisterNamedRoute(panda::JsiRuntimeCallInfo * runtimeCallInfo)291 panda::Local<panda::JSValueRef> JsRegisterNamedRoute(panda::JsiRuntimeCallInfo* runtimeCallInfo)
292 {
293     EcmaVM* vm = runtimeCallInfo->GetVM();
294     uint32_t argc = runtimeCallInfo->GetArgsNumber();
295     // will need three arguments
296     if (argc != 3) {
297         return panda::JSValueRef::Undefined(vm);
298     }
299     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
300     if (!firstArg->IsFunction(vm)) {
301         return panda::JSValueRef::Undefined(vm);
302     }
303 #ifdef DYNAMIC_COMPONENT_SUPPORT
304     auto container = Container::Current();
305     if (container && container->IsDynamicRender()) {
306         LOGD("load dynamic component card through named route");
307         panda::Local<panda::FunctionRef> objSupplier = firstArg;
308         std::vector<Local<JSValueRef>> argv;
309         auto obj = objSupplier->Call(vm, JSNApi::GetGlobalObject(vm), argv.data(), 0);
310         UpdateCardRootComponent(vm, obj->ToObject(vm));
311         return panda::JSValueRef::Undefined(vm);
312     }
313 #endif
314     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
315     if (!secondArg->IsString(vm)) {
316         return panda::JSValueRef::Undefined(vm);
317     }
318     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(2);
319     if (!thirdArg->IsObject(vm)) {
320         return panda::JSValueRef::Undefined(vm);
321     }
322 
323     JsiDeclarativeEngine::AddToNamedRouterMap(vm,
324         panda::Global<panda::FunctionRef>(vm, Local<panda::FunctionRef>(firstArg)),
325         secondArg->ToString(vm)->ToString(vm), thirdArg->ToObject(vm));
326 
327     return panda::JSValueRef::Undefined(vm);
328 }
329 
JsNavigationRegister(panda::JsiRuntimeCallInfo * runtimeCallInfo)330 panda::Local<panda::JSValueRef> JsNavigationRegister(panda::JsiRuntimeCallInfo* runtimeCallInfo)
331 {
332     EcmaVM *vm = runtimeCallInfo->GetVM();
333     auto argsNum = runtimeCallInfo->GetArgsNumber();
334     const uint8_t maxArgSize = 2;
335     if (argsNum != maxArgSize) {
336         TAG_LOGE(AceLogTag::ACE_NAVIGATION, "builder param is invalid: argsNum: %{public}d", argsNum);
337         return panda::JSValueRef::Undefined(vm);
338     }
339     Local<JSValueRef> nameProp = runtimeCallInfo->GetCallArgRef(0);
340     if (!nameProp->IsString(vm)) {
341         TAG_LOGE(AceLogTag::ACE_NAVIGATION, "name is invalid");
342         return panda::JSValueRef::Undefined(vm);
343     }
344     std::string name = nameProp->ToString(vm)->ToString(vm);
345     Local<JSValueRef> builderProp = runtimeCallInfo->GetCallArgRef(1);
346     if (!builderProp->IsObject(vm)) {
347         TAG_LOGE(AceLogTag::ACE_NAVIGATION, "get builder object failed: %{public}s", name.c_str());
348         return panda::JSValueRef::Undefined(vm);
349     }
350     JsiDeclarativeEngine::AddToNavigationBuilderMap(name,
351         panda::Global<panda::ObjectRef>(vm, Local<panda::ObjectRef>(builderProp)));
352     return panda::JSValueRef::Undefined(vm);
353 }
354 
JSPostCardAction(panda::JsiRuntimeCallInfo * runtimeCallInfo)355 panda::Local<panda::JSValueRef> JSPostCardAction(panda::JsiRuntimeCallInfo* runtimeCallInfo)
356 {
357     EcmaVM* vm = runtimeCallInfo->GetVM();
358 #if defined(PREVIEW)
359     LOGW("[Engine Log] The postCardAction interface in the Previewer is a mocked implementation and"
360 "may behave differently than an real device.");
361     return panda::JSValueRef::Undefined(vm);
362 #endif
363     uint32_t argc = runtimeCallInfo->GetArgsNumber();
364     if (argc > 2) {
365         return panda::JSValueRef::Undefined(vm);
366     }
367     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
368     if (!firstArg->IsObject(vm)) {
369         return panda::JSValueRef::Undefined(vm);
370     }
371 
372     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
373     if (!secondArg->IsObject(vm)) {
374         return panda::JSValueRef::Undefined(vm);
375     }
376 
377     panda::Local<panda::ObjectRef> obj = firstArg->ToObject(vm);
378     auto* view = static_cast<JSView*>(obj->GetNativePointerField(vm, 0));
379     if (!view && !static_cast<JSViewPartialUpdate*>(view) && !static_cast<JSViewFullUpdate*>(view)) {
380         return panda::JSValueRef::Undefined(vm);
381     }
382 
383     auto value = panda::JSON::Stringify(vm, secondArg);
384     if (!value->IsString(vm)) {
385         return panda::JSValueRef::Undefined(vm);
386     }
387     auto valueStr = panda::Local<panda::StringRef>(value);
388     auto action = valueStr->ToString(vm);
389 
390 #if !defined(NG_BUILD)
391     int64_t cardId = view->GetCardId();
392     auto container = Container::Current();
393     if (container && container->IsUseNewPipeline()) {
394         if (container->IsFRSCardContainer()) {
395             auto frontEnd = AceType::DynamicCast<FormFrontendDeclarative>(container->GetCardFrontend(cardId).Upgrade());
396             CHECK_NULL_RETURN(frontEnd, panda::JSValueRef::Undefined(vm));
397             auto delegate = frontEnd->GetDelegate();
398             CHECK_NULL_RETURN(delegate, panda::JSValueRef::Undefined(vm));
399             delegate->FireCardAction(action);
400         } else {
401             auto frontEnd = AceType::DynamicCast<CardFrontendDeclarative>(container->GetCardFrontend(cardId).Upgrade());
402             CHECK_NULL_RETURN(frontEnd, panda::JSValueRef::Undefined(vm));
403             auto delegate = frontEnd->GetDelegate();
404             CHECK_NULL_RETURN(delegate, panda::JSValueRef::Undefined(vm));
405             delegate->FireCardAction(action);
406         }
407     }
408 #endif
409     return panda::JSValueRef::Undefined(vm);
410 }
411 
JsLoadEtsCard(panda::JsiRuntimeCallInfo * runtimeCallInfo)412 panda::Local<panda::JSValueRef> JsLoadEtsCard(panda::JsiRuntimeCallInfo* runtimeCallInfo)
413 {
414     EcmaVM* vm = runtimeCallInfo->GetVM();
415     uint32_t argc = runtimeCallInfo->GetArgsNumber();
416     if (argc > 2) {
417         return panda::JSValueRef::Undefined(vm);
418     }
419     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
420     if (!firstArg->IsObject(vm)) {
421         return panda::JSValueRef::Undefined(vm);
422     }
423 
424     panda::Local<panda::ObjectRef> obj = firstArg->ToObject(vm);
425     UpdateCardRootComponent(vm, obj);
426 
427     return panda::JSValueRef::Undefined(vm);
428 }
429 
430 #if defined(PREVIEW)
JsPreviewerComponent(panda::JsiRuntimeCallInfo * runtimeCallInfo)431 panda::Local<panda::JSValueRef> JsPreviewerComponent(panda::JsiRuntimeCallInfo* runtimeCallInfo)
432 {
433     EcmaVM* vm = runtimeCallInfo->GetVM();
434 
435     auto runtime = JsiDeclarativeEngineInstance::GetCurrentRuntime();
436     shared_ptr<ArkJSRuntime> arkRuntime = std::static_pointer_cast<ArkJSRuntime>(runtime);
437     std::string requiredComponentName = arkRuntime->GetRequiredComponent();
438     panda::Global<panda::ObjectRef> obj = arkRuntime->GetPreviewComponent(vm, requiredComponentName);
439     if (obj->IsUndefined()) {
440         return panda::JSValueRef::Undefined(vm);
441     }
442     UpdateRootComponent(vm, obj.ToLocal());
443 
444     return panda::JSValueRef::Undefined(vm);
445 }
446 
JsGetPreviewComponentFlag(panda::JsiRuntimeCallInfo * runtimeCallInfo)447 panda::Local<panda::JSValueRef> JsGetPreviewComponentFlag(panda::JsiRuntimeCallInfo* runtimeCallInfo)
448 {
449     EcmaVM* vm = runtimeCallInfo->GetVM();
450 
451     auto runtime = JsiDeclarativeEngineInstance::GetCurrentRuntime();
452     shared_ptr<ArkJSRuntime> arkRuntime = std::static_pointer_cast<ArkJSRuntime>(runtime);
453     bool isComponentPreview = arkRuntime->GetPreviewFlag();
454     if (!isComponentPreview) {
455         return panda::JSValueRef::False(vm);
456     }
457     return panda::JSValueRef::True(vm);
458 }
459 
JsStorePreviewComponents(panda::JsiRuntimeCallInfo * runtimeCallInfo)460 panda::Local<panda::JSValueRef> JsStorePreviewComponents(panda::JsiRuntimeCallInfo* runtimeCallInfo)
461 {
462     EcmaVM* vm = runtimeCallInfo->GetVM();
463 
464     auto runtime = JsiDeclarativeEngineInstance::GetCurrentRuntime();
465     shared_ptr<ArkJSRuntime> arkRuntime = std::static_pointer_cast<ArkJSRuntime>(runtime);
466     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
467     if (!firstArg->IsNumber()) {
468         return panda::JSValueRef::Undefined(vm);
469     }
470     panda::Local<NumberRef> componentNum = firstArg->ToNumber(vm);
471     uint32_t numOfComponent = componentNum->Value();
472     for (uint32_t index = 1; index <= numOfComponent * 2; index++) { // 2: each component pass two args, name and itself
473         Local<JSValueRef> componentName = runtimeCallInfo->GetCallArgRef(index);
474         if (!componentName->IsString(vm)) {
475             return panda::JSValueRef::Undefined(vm);
476         }
477         std::string name = componentName->ToString(vm)->ToString(vm);
478         Local<JSValueRef> componentObj = runtimeCallInfo->GetCallArgRef(++index);
479         if (componentObj->IsUndefined()) {
480             return panda::JSValueRef::Undefined(vm);
481         }
482         panda::Global<panda::ObjectRef> obj(vm, componentObj->ToObject(vm));
483         arkRuntime->AddPreviewComponent(name, obj);
484     }
485 
486     return panda::JSValueRef::Undefined(vm);
487 }
488 
JsGetRootView(panda::JsiRuntimeCallInfo * runtimeCallInfo)489 panda::Local<panda::JSValueRef> JsGetRootView(panda::JsiRuntimeCallInfo* runtimeCallInfo)
490 {
491     auto runtime = JsiDeclarativeEngineInstance::GetCurrentRuntime();
492     shared_ptr<ArkJSRuntime> arkRuntime = std::static_pointer_cast<ArkJSRuntime>(runtime);
493     return arkRuntime->GetRootView().ToLocal();
494 }
495 #endif
496 
JsDumpMemoryStats(panda::JsiRuntimeCallInfo * runtimeCallInfo)497 panda::Local<panda::JSValueRef> JsDumpMemoryStats(panda::JsiRuntimeCallInfo* runtimeCallInfo)
498 {
499     EcmaVM* vm = runtimeCallInfo->GetVM();
500     return panda::JSValueRef::Undefined(vm);
501 }
502 
JsGetI18nResource(panda::JsiRuntimeCallInfo * runtimeCallInfo)503 panda::Local<panda::JSValueRef> JsGetI18nResource(panda::JsiRuntimeCallInfo* runtimeCallInfo)
504 {
505     EcmaVM* vm = runtimeCallInfo->GetVM();
506     uint32_t argc = runtimeCallInfo->GetArgsNumber();
507     if (vm == nullptr) {
508         return panda::JSValueRef::Undefined(vm);
509     }
510     if (argc != 2 && argc != 1) {
511         return panda::JSValueRef::Undefined(vm);
512     }
513     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
514     if (!firstArg->IsString(vm)) {
515         return panda::JSValueRef::Undefined(vm);
516     }
517 
518     std::vector<std::string> splitStr;
519     std::string str = firstArg->ToString(vm)->ToString(vm);
520     StringUtils::SplitStr(str, ".", splitStr);
521     if (splitStr.size() != 2) {
522         return panda::JSValueRef::Undefined(vm);
523     }
524 
525     auto targetStringKey = splitStr[0];
526     auto targetStringKeyValue = splitStr[1];
527     auto resultStrJson = JsiDeclarativeEngineInstance::GetI18nStringResource(targetStringKey, targetStringKeyValue);
528     auto resultStr = resultStrJson->GetString();
529     if (argc == 1) {
530         return panda::StringRef::NewFromUtf8(vm, resultStr.c_str());
531     }
532 
533     panda::LocalScope scope(vm);
534     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
535     if (secondArg->IsArray(vm)) {
536         auto arrayVal = panda::Local<panda::ArrayRef>(secondArg);
537         auto len = arrayVal->Length(vm);
538         std::vector<std::string> arrayResult;
539         for (auto i = 0U; i < len; i++) {
540             auto subItemVal = panda::ArrayRef::GetValueAt(vm, arrayVal, i);
541             if (!subItemVal->IsString(vm)) {
542                 arrayResult.emplace_back(std::string());
543                 continue;
544             }
545             auto itemVal = panda::Local<panda::StringRef>(subItemVal);
546             arrayResult.emplace_back(itemVal->ToString(vm));
547         }
548         ReplacePlaceHolderArray(resultStr, arrayResult);
549     } else if (secondArg->IsObject(vm)) {
550         auto value = panda::JSON::Stringify(vm, secondArg);
551         if (value->IsString(vm)) {
552             auto valueStr = panda::Local<panda::StringRef>(value);
553             std::unique_ptr<JsonValue> argsPtr = JsonUtil::ParseJsonString(valueStr->ToString(vm));
554             ReplacePlaceHolder(resultStr, argsPtr);
555         }
556     } else if (secondArg->IsNumber()) {
557         double count = secondArg->ToNumber(vm)->Value();
558         auto pluralChoice = Localization::GetInstance()->PluralRulesFormat(count);
559         if (!pluralChoice.empty()) {
560             resultStr = ParserPluralResource(resultStrJson, pluralChoice, str);
561         }
562     }
563 
564     return panda::StringRef::NewFromUtf8(vm, resultStr.c_str());
565 }
566 
JsGetMediaResource(panda::JsiRuntimeCallInfo * runtimeCallInfo)567 panda::Local<panda::JSValueRef> JsGetMediaResource(panda::JsiRuntimeCallInfo* runtimeCallInfo)
568 {
569     EcmaVM* vm = runtimeCallInfo->GetVM();
570     uint32_t argc = runtimeCallInfo->GetArgsNumber();
571     if (argc != 1) {
572         return panda::JSValueRef::Undefined(vm);
573     }
574     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
575     if (!firstArg->IsString(vm)) {
576         return panda::JSValueRef::Undefined(vm);
577     }
578 
579     std::string targetMediaFileName = firstArg->ToString(vm)->ToString(vm);
580     std::string filePath = JsiDeclarativeEngineInstance::GetMediaResource(targetMediaFileName);
581     return panda::StringRef::NewFromUtf8(vm, filePath.c_str());
582 }
583 
JsGetFrontendDelegate()584 RefPtr<FrontendDelegate> JsGetFrontendDelegate()
585 {
586     auto engine = EngineHelper::GetEngine(Container::CurrentId());
587     auto jsiEngine = AceType::DynamicCast<JsiDeclarativeEngine>(engine);
588     if (!jsiEngine) {
589         return nullptr;
590     }
591     auto engineInstance = jsiEngine->GetEngineInstance();
592     if (engineInstance == nullptr) {
593         return nullptr;
594     }
595     return engineInstance->GetDelegate();
596 }
597 
JsGetInspectorNodes(panda::JsiRuntimeCallInfo * runtimeCallInfo)598 panda::Local<panda::JSValueRef> JsGetInspectorNodes(panda::JsiRuntimeCallInfo* runtimeCallInfo)
599 {
600     ContainerScope scope{Container::CurrentIdSafely()};
601     EcmaVM* vm = runtimeCallInfo->GetVM();
602     if (vm == nullptr) {
603         return panda::JSValueRef::Undefined(vm);
604     }
605     auto declarativeDelegate = AceType::DynamicCast<FrontendDelegateDeclarative>(JsGetFrontendDelegate());
606     if (!declarativeDelegate) {
607         return panda::JSValueRef::Undefined(vm);
608     }
609     auto accessibilityManager = declarativeDelegate->GetJSAccessibilityManager();
610     auto nodeInfos = accessibilityManager->DumpComposedElementsToJson();
611     return panda::JSON::Parse(vm, panda::StringRef::NewFromUtf8(vm, nodeInfos->ToString().c_str()));
612 }
613 
JsGetInspectorNodeById(panda::JsiRuntimeCallInfo * runtimeCallInfo)614 panda::Local<panda::JSValueRef> JsGetInspectorNodeById(panda::JsiRuntimeCallInfo* runtimeCallInfo)
615 {
616     ContainerScope scope{Container::CurrentIdSafely()};
617     EcmaVM* vm = runtimeCallInfo->GetVM();
618     uint32_t argc = runtimeCallInfo->GetArgsNumber();
619     if (vm == nullptr) {
620         return panda::JSValueRef::Undefined(vm);
621     }
622     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
623     if (argc < 1 || !firstArg->IsNumber()) {
624         return panda::JSValueRef::Undefined(vm);
625     }
626     auto declarativeDelegate = OHOS::Ace::AceType::DynamicCast<FrontendDelegateDeclarative>(JsGetFrontendDelegate());
627     if (!declarativeDelegate) {
628         return panda::JSValueRef::Undefined(vm);
629     }
630     auto accessibilityManager = declarativeDelegate->GetJSAccessibilityManager();
631     if (!accessibilityManager) {
632         return panda::JSValueRef::Undefined(vm);
633     }
634     int32_t intValue = firstArg->Int32Value(vm);
635     auto nodeInfo = accessibilityManager->DumpComposedElementToJson(intValue);
636     return panda::JSON::Parse(vm, panda::StringRef::NewFromUtf8(vm, nodeInfo->ToString().c_str()));
637 }
638 
JsGetInspectorTree(panda::JsiRuntimeCallInfo * runtimeCallInfo)639 panda::Local<panda::JSValueRef> JsGetInspectorTree(panda::JsiRuntimeCallInfo* runtimeCallInfo)
640 {
641     ContainerScope scope{Container::CurrentIdSafely()};
642     EcmaVM* vm = runtimeCallInfo->GetVM();
643     if (vm == nullptr) {
644         return panda::JSValueRef::Undefined(vm);
645     }
646     auto container = Container::Current();
647     if (!container) {
648         return panda::JSValueRef::Undefined(vm);
649     }
650 
651     if (container->IsUseNewPipeline()) {
652         auto nodeInfos = NG::Inspector::GetInspector(false);
653         return panda::JSON::Parse(vm, panda::StringRef::NewFromUtf8(vm, nodeInfos.c_str()));
654     }
655 #if !defined(NG_BUILD)
656     auto pipelineContext = AceType::DynamicCast<PipelineContext>(container->GetPipelineContext());
657     if (pipelineContext == nullptr) {
658         return panda::JSValueRef::Undefined(vm);
659     }
660     auto nodeInfos = V2::Inspector::GetInspectorTree(pipelineContext);
661     return panda::JSON::Parse(vm, panda::StringRef::NewFromUtf8(vm, nodeInfos.c_str()));
662 #else
663     return panda::JSValueRef::Undefined(vm);
664 #endif
665 }
666 
JsGetFilteredInspectorTree(panda::JsiRuntimeCallInfo * runtimeCallInfo)667 panda::Local<panda::JSValueRef> JsGetFilteredInspectorTree(panda::JsiRuntimeCallInfo* runtimeCallInfo)
668 {
669     ContainerScope scope{Container::CurrentIdSafely()};
670     EcmaVM* vm = runtimeCallInfo->GetVM();
671 
672     auto container = Container::Current();
673     if (!container) {
674         JSException::Throw(ERROR_CODE_PARAM_INVALID, "%s", "container is nullptr");
675         return panda::StringRef::NewFromUtf8(vm, "");
676     }
677     auto argc = runtimeCallInfo->GetArgsNumber();
678     if (argc > PARAM_SIZE_ONE) {
679         JSException::Throw(ERROR_CODE_PARAM_INVALID, "%s", "invalid param count");
680         return panda::StringRef::NewFromUtf8(vm, "");
681     }
682 
683     NG::InspectorFilter filter;
684     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
685     if (argc == PARAM_SIZE_ONE) {
686         if (!firstArg->IsArray(vm)) {
687             JSException::Throw(ERROR_CODE_PARAM_INVALID, "%s", "invalid param type");
688             return panda::StringRef::NewFromUtf8(vm, "");
689         }
690         auto arrayVal = panda::Local<panda::ArrayRef>(firstArg);
691         auto len = arrayVal->Length(vm);
692         for (auto i = 0U; i < len; i++) {
693             auto subItemVal = panda::ArrayRef::GetValueAt(vm, arrayVal, i);
694             if (!subItemVal->IsString(vm)) {
695                 JSException::Throw(ERROR_CODE_PARAM_INVALID, "%s", "invalid param type");
696                 return panda::StringRef::NewFromUtf8(vm, "");
697             }
698             auto itemVal = panda::Local<panda::StringRef>(subItemVal);
699             filter.AddFilterAttr(itemVal->ToString(vm));
700         }
701     }
702     if (container->IsUseNewPipeline()) {
703         bool needThrow = false;
704         auto nodeInfos = NG::Inspector::GetInspector(false, filter, needThrow);
705         if (needThrow) {
706             JSException::Throw(ERROR_CODE_PARAM_INVALID, "%s", "get inspector failed");
707             return panda::StringRef::NewFromUtf8(vm, "");
708         }
709         return panda::StringRef::NewFromUtf8(vm, nodeInfos.c_str());
710     }
711     JSException::Throw(ERROR_CODE_PARAM_INVALID, "%s", "get inspector tree failed");
712     return panda::StringRef::NewFromUtf8(vm, "");
713 }
714 
JsGetFilteredInspectorTreeById(panda::JsiRuntimeCallInfo * runtimeCallInfo)715 panda::Local<panda::JSValueRef> JsGetFilteredInspectorTreeById(panda::JsiRuntimeCallInfo* runtimeCallInfo)
716 {
717     ContainerScope scope{Container::CurrentIdSafely()};
718     EcmaVM* vm = runtimeCallInfo->GetVM();
719 
720     auto container = Container::Current();
721     if (!container) {
722         JSException::Throw(ERROR_CODE_PARAM_INVALID, "%s", "container is nullptr");
723         return panda::StringRef::NewFromUtf8(vm, "");
724     }
725 
726     auto argc = runtimeCallInfo->GetArgsNumber();
727     if (argc < PARAM_SIZE_TWO || argc > PARAM_SIZE_THREE) {
728         JSException::Throw(ERROR_CODE_PARAM_INVALID, "%s", "invalid param count");
729         return panda::StringRef::NewFromUtf8(vm, "");
730     }
731 
732     NG::InspectorFilter filter;
733     // get component id
734     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
735     if (!firstArg->IsString(vm)) {
736         JSException::Throw(ERROR_CODE_PARAM_INVALID, "%s", "invalid param type");
737         return panda::StringRef::NewFromUtf8(vm, "");
738     }
739     std::string key = firstArg->ToString(vm)->ToString(vm);
740     filter.SetFilterID(key);
741 
742     // get depth
743     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
744     if (!secondArg->IsNumber()) {
745         JSException::Throw(ERROR_CODE_PARAM_INVALID, "%s", "invalid param type");
746         return panda::StringRef::NewFromUtf8(vm, "");
747     }
748     int32_t depth = secondArg->Int32Value(vm);
749     if (depth < 0) {
750         JSException::Throw(ERROR_CODE_PARAM_INVALID, "%s", "invalid filter depth");
751         return panda::StringRef::NewFromUtf8(vm, "");
752     }
753     filter.SetFilterDepth(depth);
754 
755     // get inspecotr filter list
756     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(PARAM_TRHEE_INDEX);
757     if (argc == PARAM_SIZE_THREE) {
758         if (!thirdArg->IsArray(vm)) {
759             JSException::Throw(ERROR_CODE_PARAM_INVALID, "%s", "invalid param type");
760             return panda::StringRef::NewFromUtf8(vm, "");
761         }
762         auto arrayVal = panda::Local<panda::ArrayRef>(thirdArg);
763         auto len = arrayVal->Length(vm);
764         for (auto i = 0U; i < len; i++) {
765             auto subItemVal = panda::ArrayRef::GetValueAt(vm, arrayVal, i);
766             if (!subItemVal->IsString(vm)) {
767                 JSException::Throw(ERROR_CODE_PARAM_INVALID, "%s", "invalid param type");
768                 return panda::StringRef::NewFromUtf8(vm, "");
769             }
770             auto itemVal = panda::Local<panda::StringRef>(subItemVal);
771             filter.AddFilterAttr(itemVal->ToString(vm));
772         }
773     }
774     if (container->IsUseNewPipeline()) {
775         bool needThrow = false;
776         auto nodeInfos = NG::Inspector::GetInspector(false, filter, needThrow);
777         if (needThrow) {
778             JSException::Throw(ERROR_CODE_PARAM_INVALID, "%s", "get inspector failed");
779             return panda::StringRef::NewFromUtf8(vm, "");
780         }
781         return panda::StringRef::NewFromUtf8(vm, nodeInfos.c_str());
782     }
783     JSException::Throw(ERROR_CODE_PARAM_INVALID, "%s", "get inspector tree failed");
784     return panda::StringRef::NewFromUtf8(vm, "");
785 }
786 
JsGetInspectorByKey(panda::JsiRuntimeCallInfo * runtimeCallInfo)787 panda::Local<panda::JSValueRef> JsGetInspectorByKey(panda::JsiRuntimeCallInfo* runtimeCallInfo)
788 {
789     ContainerScope scope{Container::CurrentIdSafely()};
790     EcmaVM* vm = runtimeCallInfo->GetVM();
791     auto argc = runtimeCallInfo->GetArgsNumber();
792     if (vm == nullptr) {
793         return panda::JSValueRef::Undefined(vm);
794     }
795     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
796     if (argc < 1 || !firstArg->IsString(vm)) {
797         return panda::JSValueRef::Undefined(vm);
798     }
799     auto container = Container::Current();
800     if (!container) {
801         return panda::JSValueRef::Undefined(vm);
802     }
803     std::string key = firstArg->ToString(vm)->ToString(vm);
804     if (container->IsUseNewPipeline()) {
805         auto resultStr = NG::Inspector::GetInspectorNodeByKey(key);
806         return panda::StringRef::NewFromUtf8(vm, resultStr.c_str());
807     }
808 #if !defined(NG_BUILD)
809     auto pipelineContext = AceType::DynamicCast<PipelineContext>(container->GetPipelineContext());
810     if (pipelineContext == nullptr) {
811         return panda::JSValueRef::Undefined(vm);
812     }
813     auto resultStr = V2::Inspector::GetInspectorNodeByKey(pipelineContext, key);
814     return panda::StringRef::NewFromUtf8(vm, resultStr.c_str());
815 #else
816     return panda::JSValueRef::Undefined(vm);
817 #endif
818 }
819 
JsSendEventByKey(panda::JsiRuntimeCallInfo * runtimeCallInfo)820 panda::Local<panda::JSValueRef> JsSendEventByKey(panda::JsiRuntimeCallInfo* runtimeCallInfo)
821 {
822     ContainerScope scope{Container::CurrentIdSafely()};
823     EcmaVM* vm = runtimeCallInfo->GetVM();
824     auto argc = runtimeCallInfo->GetArgsNumber();
825     if (vm == nullptr) {
826         return panda::JSValueRef::Undefined(vm);
827     }
828     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
829     if (argc < 3 || !firstArg->IsString(vm)) { // 3: arg numbers
830         return panda::JSValueRef::Undefined(vm);
831     }
832     auto container = Container::Current();
833     if (!container) {
834         return panda::JSValueRef::Undefined(vm);
835     }
836 
837     std::string key = firstArg->ToString(vm)->ToString(vm);
838     auto action = runtimeCallInfo->GetCallArgRef(1)->Int32Value(vm);
839     auto params = runtimeCallInfo->GetCallArgRef(2)->ToString(vm)->ToString(vm);
840     if (container->IsUseNewPipeline()) {
841         auto result = NG::Inspector::SendEventByKey(key, action, params);
842         return panda::BooleanRef::New(vm, result);
843     }
844 #if !defined(NG_BUILD)
845     auto pipelineContext = AceType::DynamicCast<PipelineContext>(container->GetPipelineContext());
846     if (pipelineContext == nullptr) {
847         return panda::JSValueRef::Undefined(vm);
848     }
849     auto result = V2::Inspector::SendEventByKey(pipelineContext, key, action, params);
850     return panda::BooleanRef::New(vm, result);
851 #else
852     return panda::JSValueRef::Undefined(vm);
853 #endif
854 }
855 
GetTouchPointFromJS(const JsiObject & value)856 static TouchEvent GetTouchPointFromJS(const JsiObject& value)
857 {
858     TouchEvent touchPoint;
859 
860     auto type = value->GetProperty("type");
861     touchPoint.type = static_cast<TouchType>(type->ToNumber<int32_t>());
862 
863     auto id = value->GetProperty("id");
864     touchPoint.id = id->ToNumber<int32_t>();
865 
866     auto x = value->GetProperty("x");
867     touchPoint.x = x->ToNumber<float>();
868 
869     auto y = value->GetProperty("y");
870     touchPoint.y = y->ToNumber<float>();
871 
872     touchPoint.time = std::chrono::high_resolution_clock::now();
873 
874     return touchPoint;
875 }
876 
JsSendTouchEvent(panda::JsiRuntimeCallInfo * runtimeCallInfo)877 panda::Local<panda::JSValueRef> JsSendTouchEvent(panda::JsiRuntimeCallInfo* runtimeCallInfo)
878 {
879     ContainerScope scope{Container::CurrentIdSafely()};
880     EcmaVM* vm = runtimeCallInfo->GetVM();
881     auto argc = runtimeCallInfo->GetArgsNumber();
882     if (vm == nullptr) {
883         return panda::JSValueRef::Undefined(vm);
884     }
885     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
886     if (argc < 1 || !firstArg->IsObject(vm)) {
887         return panda::JSValueRef::Undefined(vm);
888     }
889 
890     auto container = Container::Current();
891     if (!container) {
892         return panda::JSValueRef::Undefined(vm);
893     }
894     auto pipelineContext = container->GetPipelineContext();
895     if (pipelineContext == nullptr) {
896         return panda::JSValueRef::Undefined(vm);
897     }
898     JsiObject obj(firstArg);
899     TouchEvent touchPoint = GetTouchPointFromJS(obj);
900     auto result = pipelineContext->GetTaskExecutor()->PostTask(
901         [pipelineContext, touchPoint]() { pipelineContext->OnTouchEvent(touchPoint); },
902         TaskExecutor::TaskType::UI, "ArkUIJsSendTouchEvent");
903     return panda::BooleanRef::New(vm, result);
904 }
905 
GetKeyEventFromJS(const JsiObject & value)906 static KeyEvent GetKeyEventFromJS(const JsiObject& value)
907 {
908     auto type = value->GetProperty("type");
909     auto action = static_cast<KeyAction>(type->ToNumber<int32_t>());
910 
911     auto jsKeyCode = value->GetProperty("keyCode");
912     auto code = static_cast<KeyCode>(jsKeyCode->ToNumber<int32_t>());
913 
914     KeyEvent keyEvent(code, action);
915 
916     auto jsKeySource = value->GetProperty("keySource");
917     keyEvent.sourceType = static_cast<SourceType>(jsKeySource->ToNumber<int32_t>());
918 
919     auto jsDeviceId = value->GetProperty("deviceId");
920     keyEvent.deviceId = jsDeviceId->ToNumber<int32_t>();
921 
922     auto jsMetaKey = value->GetProperty("metaKey");
923     keyEvent.metaKey = jsMetaKey->ToNumber<int32_t>();
924 
925     auto jsTimestamp = value->GetProperty("timestamp");
926     auto timeStamp = jsTimestamp->ToNumber<int64_t>();
927     keyEvent.SetTimeStamp(timeStamp);
928 
929     auto jsUnicode = value->GetProperty("unicode");
930     keyEvent.unicode = jsUnicode->ToNumber<uint32_t>();
931 
932     return keyEvent;
933 }
934 
JsSendKeyEvent(panda::JsiRuntimeCallInfo * runtimeCallInfo)935 panda::Local<panda::JSValueRef> JsSendKeyEvent(panda::JsiRuntimeCallInfo* runtimeCallInfo)
936 {
937     ContainerScope scope{Container::CurrentIdSafely()};
938     EcmaVM* vm = runtimeCallInfo->GetVM();
939     auto argc = runtimeCallInfo->GetArgsNumber();
940     if (vm == nullptr) {
941         return panda::JSValueRef::Undefined(vm);
942     }
943     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
944     if (argc < 1 || !firstArg->IsObject(vm)) {
945         return panda::JSValueRef::Undefined(vm);
946     }
947 
948     auto container = Container::Current();
949     if (!container) {
950         return panda::JSValueRef::Undefined(vm);
951     }
952     auto pipelineContext = container->GetPipelineContext();
953     if (pipelineContext == nullptr) {
954         return panda::JSValueRef::Undefined(vm);
955     }
956     JsiObject obj(firstArg);
957     KeyEvent keyEvent = GetKeyEventFromJS(obj);
958     auto result = pipelineContext->GetTaskExecutor()->PostTask(
959         [pipelineContext, keyEvent]() { pipelineContext->OnNonPointerEvent(keyEvent); },
960         TaskExecutor::TaskType::UI, "ArkUIJsSendKeyEvent");
961     return panda::BooleanRef::New(vm, result);
962 }
963 
GetMouseEventFromJS(const JsiObject & value)964 static MouseEvent GetMouseEventFromJS(const JsiObject& value)
965 {
966     MouseEvent mouseEvent;
967 
968     auto action = value->GetProperty("action");
969     mouseEvent.action = static_cast<MouseAction>(action->ToNumber<int32_t>());
970 
971     auto button = value->GetProperty("button");
972     mouseEvent.button = static_cast<MouseButton>(button->ToNumber<int32_t>());
973 
974     auto x = value->GetProperty("x");
975     mouseEvent.x = x->ToNumber<float>();
976     mouseEvent.deltaX = mouseEvent.x;
977 
978     auto y = value->GetProperty("y");
979     mouseEvent.y = y->ToNumber<float>();
980     mouseEvent.deltaY = mouseEvent.y;
981 
982     mouseEvent.time = std::chrono::high_resolution_clock::now();
983     mouseEvent.sourceType = SourceType::MOUSE;
984     return mouseEvent;
985 }
986 
JsSendMouseEvent(panda::JsiRuntimeCallInfo * runtimeCallInfo)987 panda::Local<panda::JSValueRef> JsSendMouseEvent(panda::JsiRuntimeCallInfo* runtimeCallInfo)
988 {
989     ContainerScope scope{Container::CurrentIdSafely()};
990     EcmaVM* vm = runtimeCallInfo->GetVM();
991     auto argc = runtimeCallInfo->GetArgsNumber();
992     if (vm == nullptr) {
993         return panda::JSValueRef::Undefined(vm);
994     }
995     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
996     if (argc < 1 || !firstArg->IsObject(vm)) {
997         return panda::JSValueRef::Undefined(vm);
998     }
999 
1000     auto container = Container::Current();
1001     if (!container) {
1002         return panda::JSValueRef::Undefined(vm);
1003     }
1004     auto pipelineContext = container->GetPipelineContext();
1005     if (pipelineContext == nullptr) {
1006         return panda::JSValueRef::Undefined(vm);
1007     }
1008     JsiObject obj(firstArg);
1009     MouseEvent mouseEvent = GetMouseEventFromJS(obj);
1010     auto result = pipelineContext->GetTaskExecutor()->PostTask(
1011         [pipelineContext, mouseEvent]() { pipelineContext->OnMouseEvent(mouseEvent); },
1012         TaskExecutor::TaskType::UI, "ArkUIJsSendMouseEvent");
1013     return panda::BooleanRef::New(vm, result);
1014 }
1015 
Vp2Px(panda::JsiRuntimeCallInfo * runtimeCallInfo)1016 panda::Local<panda::JSValueRef> Vp2Px(panda::JsiRuntimeCallInfo* runtimeCallInfo)
1017 {
1018     EcmaVM* vm = runtimeCallInfo->GetVM();
1019     uint32_t argc = runtimeCallInfo->GetArgsNumber();
1020     if (argc != 1) {
1021         return panda::JSValueRef::Undefined(vm);
1022     }
1023     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1024     if (!firstArg->IsNumber()) {
1025         return panda::JSValueRef::Undefined(vm);
1026     }
1027 
1028     double vpValue = firstArg->ToNumber(vm)->Value();
1029     double density = PipelineBase::GetCurrentDensity();
1030     double pxValue = vpValue * density;
1031     return panda::NumberRef::New(vm, pxValue);
1032 }
1033 
Px2Vp(panda::JsiRuntimeCallInfo * runtimeCallInfo)1034 panda::Local<panda::JSValueRef> Px2Vp(panda::JsiRuntimeCallInfo* runtimeCallInfo)
1035 {
1036     ContainerScope scope(Container::CurrentIdSafely());
1037     EcmaVM* vm = runtimeCallInfo->GetVM();
1038     uint32_t argc = runtimeCallInfo->GetArgsNumber();
1039     if (argc != 1) {
1040         return panda::JSValueRef::Undefined(vm);
1041     }
1042     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1043     if (!firstArg->IsNumber()) {
1044         return panda::JSValueRef::Undefined(vm);
1045     }
1046     double density = PipelineBase::GetCurrentDensity();
1047     if (NearZero(density)) {
1048         return panda::JSValueRef::Undefined(vm);
1049     }
1050 
1051     double pxValue = firstArg->ToNumber(vm)->Value();
1052     double vpValue = pxValue / density;
1053 
1054     return panda::NumberRef::New(vm, vpValue);
1055 }
1056 
Fp2Px(panda::JsiRuntimeCallInfo * runtimeCallInfo)1057 panda::Local<panda::JSValueRef> Fp2Px(panda::JsiRuntimeCallInfo* runtimeCallInfo)
1058 {
1059     ContainerScope scope(Container::CurrentIdSafely());
1060     EcmaVM* vm = runtimeCallInfo->GetVM();
1061     uint32_t argc = runtimeCallInfo->GetArgsNumber();
1062     if (argc != 1) {
1063         return panda::JSValueRef::Undefined(vm);
1064     }
1065     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1066     if (!firstArg->IsNumber()) {
1067         return panda::JSValueRef::Undefined(vm);
1068     }
1069 
1070     double density = PipelineBase::GetCurrentDensity();
1071     double fpValue = firstArg->ToNumber(vm)->Value();
1072 
1073     auto container = Container::Current();
1074     if (!container) {
1075         return panda::JSValueRef::Undefined(vm);
1076     }
1077     auto pipelineContext = container->GetPipelineContext();
1078     double fontScale = 1.0;
1079     if (pipelineContext) {
1080         fontScale = pipelineContext->GetFontScale();
1081     }
1082     double pxValue = fpValue * density * fontScale;
1083     return panda::NumberRef::New(vm, pxValue);
1084 }
1085 
Px2Fp(panda::JsiRuntimeCallInfo * runtimeCallInfo)1086 panda::Local<panda::JSValueRef> Px2Fp(panda::JsiRuntimeCallInfo* runtimeCallInfo)
1087 {
1088     ContainerScope scope(Container::CurrentIdSafely());
1089     EcmaVM* vm = runtimeCallInfo->GetVM();
1090     uint32_t argc = runtimeCallInfo->GetArgsNumber();
1091     if (argc != 1) {
1092         return panda::JSValueRef::Undefined(vm);
1093     }
1094     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1095     if (!firstArg->IsNumber()) {
1096         return panda::JSValueRef::Undefined(vm);
1097     }
1098     double density = PipelineBase::GetCurrentDensity();
1099     if (NearZero(density)) {
1100         return panda::JSValueRef::Undefined(vm);
1101     }
1102 
1103     double pxValue = firstArg->ToNumber(vm)->Value();
1104     auto container = Container::Current();
1105     if (!container) {
1106         return panda::JSValueRef::Undefined(vm);
1107     }
1108     auto pipelineContext = container->GetPipelineContext();
1109     double fontScale = 1.0;
1110     if (pipelineContext) {
1111         fontScale = pipelineContext->GetFontScale();
1112     }
1113     double ratio = density * fontScale;
1114     double fpValue = pxValue / ratio;
1115     return panda::NumberRef::New(vm, fpValue);
1116 }
1117 
Lpx2Px(panda::JsiRuntimeCallInfo * runtimeCallInfo)1118 panda::Local<panda::JSValueRef> Lpx2Px(panda::JsiRuntimeCallInfo* runtimeCallInfo)
1119 {
1120     ContainerScope scope(Container::CurrentIdSafely());
1121     EcmaVM* vm = runtimeCallInfo->GetVM();
1122     uint32_t argc = runtimeCallInfo->GetArgsNumber();
1123     if (argc != 1) {
1124         return panda::JSValueRef::Undefined(vm);
1125     }
1126     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1127     if (!firstArg->IsNumber()) {
1128         return panda::JSValueRef::Undefined(vm);
1129     }
1130     auto container = Container::Current();
1131     CHECK_NULL_RETURN(container, panda::JSValueRef::Undefined(vm));
1132     auto window = container->GetWindow();
1133     CHECK_NULL_RETURN(window, panda::JSValueRef::Undefined(vm));
1134     auto width = window->GetCurrentWindowRect().Width();
1135 
1136     auto frontend = container->GetFrontend();
1137     CHECK_NULL_RETURN(frontend, panda::JSValueRef::Undefined(vm));
1138     auto windowConfig = frontend->GetWindowConfig();
1139     auto pipelineContext = container->GetPipelineContext();
1140     if (pipelineContext && pipelineContext->IsContainerModalVisible()) {
1141         width -= 2 * (CONTAINER_BORDER_WIDTH + CONTENT_PADDING).ConvertToPx();
1142     }
1143     if (!windowConfig.autoDesignWidth) {
1144         windowConfig.UpdateDesignWidthScale(width);
1145     }
1146 
1147     double lpxValue = firstArg->ToNumber(vm)->Value();
1148     double pxValue = lpxValue * windowConfig.designWidthScale;
1149     return panda::NumberRef::New(vm, pxValue);
1150 }
1151 
Px2Lpx(panda::JsiRuntimeCallInfo * runtimeCallInfo)1152 panda::Local<panda::JSValueRef> Px2Lpx(panda::JsiRuntimeCallInfo* runtimeCallInfo)
1153 {
1154     ContainerScope scope(Container::CurrentIdSafely());
1155     EcmaVM* vm = runtimeCallInfo->GetVM();
1156     uint32_t argc = runtimeCallInfo->GetArgsNumber();
1157     if (argc != 1) {
1158         return panda::JSValueRef::Undefined(vm);
1159     }
1160     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1161     if (!firstArg->IsNumber()) {
1162         return panda::JSValueRef::Undefined(vm);
1163     }
1164     auto container = Container::Current();
1165     CHECK_NULL_RETURN(container, panda::JSValueRef::Undefined(vm));
1166     auto window = container->GetWindow();
1167     CHECK_NULL_RETURN(window, panda::JSValueRef::Undefined(vm));
1168     auto width = window->GetCurrentWindowRect().Width();
1169 
1170     auto frontend = container->GetFrontend();
1171     CHECK_NULL_RETURN(frontend, panda::JSValueRef::Undefined(vm));
1172     auto windowConfig = frontend->GetWindowConfig();
1173     auto pipelineContext = container->GetPipelineContext();
1174     if (pipelineContext && pipelineContext->IsContainerModalVisible()) {
1175         width -= 2 * (CONTAINER_BORDER_WIDTH + CONTENT_PADDING).ConvertToPx();
1176     }
1177     if (!windowConfig.autoDesignWidth) {
1178         windowConfig.UpdateDesignWidthScale(width);
1179     }
1180 
1181     double pxValue = firstArg->ToNumber(vm)->Value();
1182     double lpxValue = pxValue / windowConfig.designWidthScale;
1183     return panda::NumberRef::New(vm, lpxValue);
1184 }
1185 
SetAppBackgroundColor(panda::JsiRuntimeCallInfo * runtimeCallInfo)1186 panda::Local<panda::JSValueRef> SetAppBackgroundColor(panda::JsiRuntimeCallInfo* runtimeCallInfo)
1187 {
1188     ContainerScope scope(Container::CurrentIdSafely());
1189     EcmaVM* vm = runtimeCallInfo->GetVM();
1190     uint32_t argc = runtimeCallInfo->GetArgsNumber();
1191     if (argc != 1) {
1192         return panda::JSValueRef::Undefined(vm);
1193     }
1194     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1195     if (!firstArg->IsString(vm)) {
1196         return panda::JSValueRef::Undefined(vm);
1197     }
1198     std::string backgroundColorStr = firstArg->ToString(vm)->ToString(vm);
1199     auto container = Container::Current();
1200     if (!container) {
1201         return panda::JSValueRef::Undefined(vm);
1202     }
1203     auto pipelineContext = container->GetPipelineContext();
1204     if (pipelineContext) {
1205         pipelineContext->SetAppBgColor(Color::FromString(backgroundColorStr));
1206     }
1207     return panda::JSValueRef::Undefined(vm);
1208 }
1209 
RequestFocus(panda::JsiRuntimeCallInfo * runtimeCallInfo)1210 panda::Local<panda::JSValueRef> RequestFocus(panda::JsiRuntimeCallInfo* runtimeCallInfo)
1211 {
1212     ContainerScope scope(Container::CurrentIdSafely());
1213     EcmaVM* vm = runtimeCallInfo->GetVM();
1214     uint32_t argc = runtimeCallInfo->GetArgsNumber();
1215     if (vm == nullptr) {
1216         return panda::JSValueRef::Undefined(vm);
1217     }
1218     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1219     if (argc < 1 || !firstArg->IsString(vm)) {
1220         return panda::JSValueRef::Undefined(vm);
1221     }
1222     std::string inspectorKey = firstArg->ToString(vm)->ToString(vm);
1223 
1224     bool result = false;
1225     auto pipelineContext = PipelineContext::GetCurrentContext();
1226     CHECK_NULL_RETURN(pipelineContext, panda::BooleanRef::New(vm, result));
1227     if (!pipelineContext->GetTaskExecutor()) {
1228         return panda::BooleanRef::New(vm, result);
1229     }
1230     pipelineContext->GetTaskExecutor()->PostSyncTask(
1231         [pipelineContext, inspectorKey, &result]() { result = pipelineContext->RequestFocus(inspectorKey); },
1232         TaskExecutor::TaskType::UI, "ArkUIJsRequestFocus");
1233     return panda::BooleanRef::New(vm, result);
1234 }
1235 
SetCursor(panda::JsiRuntimeCallInfo * runtimeCallInfo)1236 panda::Local<panda::JSValueRef> SetCursor(panda::JsiRuntimeCallInfo* runtimeCallInfo)
1237 {
1238     ContainerScope scope(Container::CurrentIdSafely());
1239     EcmaVM* vm = runtimeCallInfo->GetVM();
1240     uint32_t argc = runtimeCallInfo->GetArgsNumber();
1241     if (vm == nullptr) {
1242         return panda::JSValueRef::Undefined(vm);
1243     }
1244     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1245     if (argc < 1 || !firstArg->IsNumber()) {
1246         return panda::JSValueRef::Undefined(vm);
1247     }
1248     int32_t intValue = firstArg->Int32Value(vm);
1249 
1250     auto pipelineContext = PipelineContext::GetCurrentContext();
1251     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
1252     if (!pipelineContext->GetTaskExecutor()) {
1253         return panda::JSValueRef::Undefined(vm);
1254     }
1255     pipelineContext->GetTaskExecutor()->PostSyncTask(
1256         [pipelineContext, intValue]() { pipelineContext->SetCursor(intValue); },
1257         TaskExecutor::TaskType::UI, "ArkUIJsSetCursor");
1258     return panda::JSValueRef::Undefined(vm);
1259 }
1260 
RestoreDefault(panda::JsiRuntimeCallInfo * runtimeCallInfo)1261 panda::Local<panda::JSValueRef> RestoreDefault(panda::JsiRuntimeCallInfo* runtimeCallInfo)
1262 {
1263     ContainerScope scope(Container::CurrentIdSafely());
1264     EcmaVM* vm = runtimeCallInfo->GetVM();
1265     if (vm == nullptr) {
1266         return panda::JSValueRef::Undefined(vm);
1267     }
1268 
1269     auto pipelineContext = PipelineContext::GetCurrentContext();
1270     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
1271     if (!pipelineContext->GetTaskExecutor()) {
1272         return panda::JSValueRef::Undefined(vm);
1273     }
1274     pipelineContext->GetTaskExecutor()->PostSyncTask(
1275         [pipelineContext]() { pipelineContext->RestoreDefault(); },
1276         TaskExecutor::TaskType::UI, "ArkUIJsRestoreDefault");
1277     return panda::JSValueRef::Undefined(vm);
1278 }
1279 
JSHandleUncaughtException(panda::JsiRuntimeCallInfo * runtimeCallInfo)1280 panda::Local<panda::JSValueRef> JSHandleUncaughtException(panda::JsiRuntimeCallInfo* runtimeCallInfo)
1281 {
1282     ContainerScope scope(Container::CurrentIdSafely());
1283     EcmaVM* vm = runtimeCallInfo->GetVM();
1284     auto engine = EngineHelper::GetCurrentEngineSafely();
1285     CHECK_NULL_RETURN(engine, panda::JSValueRef::Undefined(vm));
1286     auto nativeEngine = engine->GetNativeEngine();
1287     auto arkNativeEngine = static_cast<ArkNativeEngine*>(nativeEngine);
1288     CHECK_NULL_RETURN(arkNativeEngine, panda::JSValueRef::Undefined(vm));
1289     NapiUncaughtExceptionCallback callback = arkNativeEngine->GetNapiUncaughtExceptionCallback();
1290     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1291     if (!firstArg->IsObject(vm)) {
1292         return panda::JSValueRef::Undefined(vm);
1293     }
1294     panda::Local<panda::ObjectRef> exception = firstArg->ToObject(vm);
1295     callback(arkNativeEngine->ArkValueToNapiValue(reinterpret_cast<napi_env>(arkNativeEngine), exception));
1296     return panda::JSValueRef::Undefined(vm);
1297 }
1298 
1299 #ifdef FORM_SUPPORTED
JsRegisterFormViews(BindingTarget globalObj,const std::unordered_set<std::string> & formModuleList,bool isReload,void * nativeEngine)1300 void JsRegisterFormViews(
1301     BindingTarget globalObj, const std::unordered_set<std::string>& formModuleList, bool isReload, void* nativeEngine)
1302 {
1303     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
1304     if (!runtime) {
1305         return;
1306     }
1307     if (isReload) {
1308         JsBindFormViews(globalObj, formModuleList, nativeEngine, isReload);
1309         return;
1310     }
1311     auto vm = runtime->GetEcmaVm();
1312     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "loadEtsCard"),
1313         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsLoadEtsCard));
1314     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "postCardAction"),
1315         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JSPostCardAction));
1316 #if defined(PREVIEW)
1317     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "previewComponent"),
1318         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsPreviewerComponent));
1319     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getPreviewComponentFlag"),
1320         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetPreviewComponentFlag));
1321     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "storePreviewComponents"),
1322         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsStorePreviewComponents));
1323     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "GetRootView"),
1324         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetRootView));
1325 #endif
1326     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "dumpMemoryStats"),
1327         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsDumpMemoryStats));
1328     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "$s"),
1329         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetI18nResource));
1330     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "$m"),
1331         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetMediaResource));
1332     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorNodes"),
1333         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorNodes));
1334     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorNodeById"),
1335         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorNodeById));
1336     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorTree"),
1337         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorTree));
1338     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorByKey"),
1339         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorByKey));
1340     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getFilteredInspectorTree"),
1341         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetFilteredInspectorTree));
1342     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getFilteredInspectorTreeById"),
1343         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetFilteredInspectorTreeById));
1344     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendEventByKey"),
1345         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendEventByKey));
1346     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendTouchEvent"),
1347         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendTouchEvent));
1348     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendKeyEvent"),
1349         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendKeyEvent));
1350     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendMouseEvent"),
1351         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendMouseEvent));
1352     globalObj->Set(
1353         vm, panda::StringRef::NewFromUtf8(vm, "vp2px"), panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Vp2Px));
1354     globalObj->Set(
1355         vm, panda::StringRef::NewFromUtf8(vm, "px2vp"), panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Px2Vp));
1356     globalObj->Set(
1357         vm, panda::StringRef::NewFromUtf8(vm, "fp2px"), panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Fp2Px));
1358     globalObj->Set(
1359         vm, panda::StringRef::NewFromUtf8(vm, "px2fp"), panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Px2Fp));
1360     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "lpx2px"),
1361         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Lpx2Px));
1362     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "px2lpx"),
1363         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Px2Lpx));
1364     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "setAppBgColor"),
1365         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), SetAppBackgroundColor));
1366     globalObj->Set(vm,
1367         panda::StringRef::NewFromUtf8(vm, "_arkUIUncaughtPromiseError"),
1368         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JSHandleUncaughtException));
1369 
1370     JsBindFormViews(globalObj, formModuleList, nativeEngine);
1371 
1372     JSObjectTemplate toggleType;
1373     toggleType.Constant("Checkbox", 0);
1374     toggleType.Constant("Switch", 1);
1375     toggleType.Constant("Button", 2); // 2 means index of constant
1376 
1377     JSObjectTemplate refreshStatus;
1378     refreshStatus.Constant("Inactive", 0);
1379     refreshStatus.Constant("Drag", 1);
1380     refreshStatus.Constant("OverDrag", 2);
1381     refreshStatus.Constant("Refresh", 3); // 3 means index of constant
1382     refreshStatus.Constant("Done", 4);    // 4 means index of constant
1383 
1384     JSObjectTemplate mainAxisAlign;
1385     mainAxisAlign.Constant("Start", 1);
1386     mainAxisAlign.Constant("Center", 2);       // 2 means index of constant
1387     mainAxisAlign.Constant("End", 3);          // 3 means index of constant
1388     mainAxisAlign.Constant("SpaceBetween", 6); // 6 means index of constant
1389     mainAxisAlign.Constant("SpaceAround", 7);  // 7 means index of constant
1390 
1391     JSObjectTemplate crossAxisAlign;
1392     crossAxisAlign.Constant("Start", 1);
1393 
1394     crossAxisAlign.Constant("Center", 2);  // 2 means index of constant
1395     crossAxisAlign.Constant("End", 3);     // 3 means index of constant
1396     crossAxisAlign.Constant("Stretch", 4); // 4 means index of constant
1397 
1398     JSObjectTemplate direction;
1399     direction.Constant("Horizontal", 0);
1400     direction.Constant("Vertical", 1);
1401 
1402     JSObjectTemplate loadingProgressStyle;
1403     loadingProgressStyle.Constant("Default", 1);
1404     loadingProgressStyle.Constant("Circular", 2); // 2 means index of constant
1405     loadingProgressStyle.Constant("Orbital", 3);  // 3 means index of constant
1406 
1407     JSObjectTemplate progressStyle;
1408     progressStyle.Constant("Linear", 0);
1409     progressStyle.Constant("Ring", 1);      // 1 means index of constant
1410     progressStyle.Constant("Eclipse", 2);   // 2 means index of constant
1411     progressStyle.Constant("ScaleRing", 3); // 3 means index of constant
1412     progressStyle.Constant("Capsule", 4);   // 4 means index of constant
1413 
1414     JSObjectTemplate stackFit;
1415     stackFit.Constant("Keep", 0);
1416     stackFit.Constant("Stretch", 1);
1417     stackFit.Constant("Inherit", 2);    // 2 means index of constant
1418     stackFit.Constant("FirstChild", 3); // 3 means index of constant
1419 
1420     JSObjectTemplate overflow;
1421     overflow.Constant("Clip", 0);
1422     overflow.Constant("Observable", 1);
1423 
1424     JSObjectTemplate alignment;
1425     alignment.Constant("TopLeft", 0);
1426     alignment.Constant("TopCenter", 1);
1427     alignment.Constant("TopRight", 2);     // 2 means index of constant
1428     alignment.Constant("CenterLeft", 3);   // 3 means index of constant
1429     alignment.Constant("Center", 4);       // 4 means index of constant
1430     alignment.Constant("CenterRight", 5);  // 5 means index of constant
1431     alignment.Constant("BottomLeft", 6);   // 6 means index of constant
1432     alignment.Constant("BottomCenter", 7); // 7 means index of constant
1433     alignment.Constant("BottomRight", 8);  // 8 means index of constant
1434 
1435     JSObjectTemplate sliderStyle;
1436     sliderStyle.Constant("OutSet", 0);
1437     sliderStyle.Constant("InSet", 1);
1438     sliderStyle.Constant("NONE", 2);
1439 
1440     JSObjectTemplate sliderChangeMode;
1441     sliderChangeMode.Constant("Begin", 0);
1442     sliderChangeMode.Constant("Moving", 1);
1443     sliderChangeMode.Constant("End", 2); // 2 means index of constant
1444 
1445     JSObjectTemplate pickerStyle;
1446     pickerStyle.Constant("Inline", 0);
1447     pickerStyle.Constant("Block", 1);
1448     pickerStyle.Constant("Fade", 2); // 2 means index of constant
1449 
1450     JSObjectTemplate buttonType;
1451     buttonType.Constant("Normal", (int)ButtonType::NORMAL);
1452     buttonType.Constant("Capsule", (int)ButtonType::CAPSULE);
1453     buttonType.Constant("Circle", (int)ButtonType::CIRCLE);
1454     buttonType.Constant("Arc", (int)ButtonType::ARC);
1455     buttonType.Constant("ROUNDED_RECTANGLE", (int)ButtonType::ROUNDED_RECTANGLE);
1456 
1457     JSObjectTemplate iconPosition;
1458     iconPosition.Constant("Start", 0);
1459     iconPosition.Constant("End", 1);
1460 
1461     JSObjectTemplate badgePosition;
1462     badgePosition.Constant("RightTop", 0);
1463     badgePosition.Constant("Right", 1);
1464     badgePosition.Constant("Left", 2); // 2 means index of constant
1465 
1466     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "MainAxisAlign"), *mainAxisAlign);
1467     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "CrossAxisAlign"), *crossAxisAlign);
1468     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "Direction"), *direction);
1469     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "StackFit"), *stackFit);
1470     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "Align"), *alignment);
1471     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "Overflow"), *overflow);
1472     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "ButtonType"), *buttonType);
1473     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "LoadingProgressStyle"), *loadingProgressStyle);
1474     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "ProgressStyle"), *progressStyle);
1475     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "ToggleType"), *toggleType);
1476     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "RefreshStatus"), *refreshStatus);
1477     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "SliderStyle"), *sliderStyle);
1478     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "SliderChangeMode"), *sliderChangeMode);
1479     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "IconPosition"), *iconPosition);
1480     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "PickerStyle"), *pickerStyle);
1481     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "BadgePosition"), *badgePosition);
1482 }
1483 #endif
1484 
JsRegisterViews(BindingTarget globalObj,void * nativeEngine)1485 void JsRegisterViews(BindingTarget globalObj, void* nativeEngine)
1486 {
1487     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
1488     if (!runtime) {
1489         return;
1490     }
1491     auto vm = runtime->GetEcmaVm();
1492     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "loadDocument"),
1493         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsLoadDocument));
1494     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "loadEtsCard"),
1495         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsLoadEtsCard));
1496     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "postCardAction"),
1497         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JSPostCardAction));
1498 #if defined(PREVIEW)
1499     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "previewComponent"),
1500         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsPreviewerComponent));
1501     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getPreviewComponentFlag"),
1502         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetPreviewComponentFlag));
1503     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "storePreviewComponents"),
1504         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsStorePreviewComponents));
1505     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "GetRootView"),
1506         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetRootView));
1507 #endif
1508     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "dumpMemoryStats"),
1509         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsDumpMemoryStats));
1510     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "$s"),
1511         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetI18nResource));
1512     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "$m"),
1513         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetMediaResource));
1514     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorNodes"),
1515         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorNodes));
1516     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorNodeById"),
1517         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorNodeById));
1518     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorTree"),
1519         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorTree));
1520     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInspectorByKey"),
1521         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetInspectorByKey));
1522     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getFilteredInspectorTree"),
1523         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetFilteredInspectorTree));
1524     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getFilteredInspectorTreeById"),
1525         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsGetFilteredInspectorTreeById));
1526     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendEventByKey"),
1527         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendEventByKey));
1528     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendTouchEvent"),
1529         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendTouchEvent));
1530     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendKeyEvent"),
1531         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendKeyEvent));
1532     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sendMouseEvent"),
1533         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsSendMouseEvent));
1534     globalObj->Set(
1535         vm, panda::StringRef::NewFromUtf8(vm, "vp2px"), panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Vp2Px));
1536     globalObj->Set(
1537         vm, panda::StringRef::NewFromUtf8(vm, "px2vp"), panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Px2Vp));
1538     globalObj->Set(
1539         vm, panda::StringRef::NewFromUtf8(vm, "fp2px"), panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Fp2Px));
1540     globalObj->Set(
1541         vm, panda::StringRef::NewFromUtf8(vm, "px2fp"), panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Px2Fp));
1542     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "lpx2px"),
1543         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Lpx2Px));
1544     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "px2lpx"),
1545         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Px2Lpx));
1546     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "setAppBgColor"),
1547         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), SetAppBackgroundColor));
1548     globalObj->Set(vm,
1549         panda::StringRef::NewFromUtf8(vm, "_arkUIUncaughtPromiseError"),
1550         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JSHandleUncaughtException));
1551 
1552     BindingTarget focusControlObj = panda::ObjectRef::New(const_cast<panda::EcmaVM*>(vm));
1553     focusControlObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "requestFocus"),
1554         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), RequestFocus));
1555     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "focusControl"), focusControlObj);
1556     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "registerNamedRoute"),
1557         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsRegisterNamedRoute));
1558     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "NavigationBuilderRegister"),
1559         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsNavigationRegister));
1560     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getArkUINativeModule"),
1561         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), NG::ArkUINativeModule::GetArkUINativeModule));
1562     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "loadCustomTitleBar"),
1563         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), JsLoadCustomTitleBar));
1564 
1565     BindingTarget cursorControlObj = panda::ObjectRef::New(const_cast<panda::EcmaVM*>(vm));
1566     cursorControlObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "setCursor"),
1567         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), SetCursor));
1568     cursorControlObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "restoreDefault"),
1569         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), RestoreDefault));
1570     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "cursorControl"), cursorControlObj);
1571     JsBindViews(globalObj, nativeEngine);
1572 
1573     JSObjectTemplate toggleType;
1574     toggleType.Constant("Checkbox", 0);
1575     toggleType.Constant("Switch", 1);
1576     toggleType.Constant("Button", 2); // 2 means index of constant
1577 
1578     JSObjectTemplate refreshStatus;
1579     refreshStatus.Constant("Inactive", 0);
1580     refreshStatus.Constant("Drag", 1);
1581     refreshStatus.Constant("OverDrag", 2);
1582     refreshStatus.Constant("Refresh", 3); // 3 means index of constant
1583     refreshStatus.Constant("Done", 4);    // 4 means index of constant
1584 
1585     JSObjectTemplate mainAxisAlign;
1586     mainAxisAlign.Constant("Start", 1);
1587     mainAxisAlign.Constant("Center", 2);       // 2 means index of constant
1588     mainAxisAlign.Constant("End", 3);          // 3 means index of constant
1589     mainAxisAlign.Constant("SpaceBetween", 6); // 6 means index of constant
1590     mainAxisAlign.Constant("SpaceAround", 7);  // 7 means index of constant
1591 
1592     JSObjectTemplate crossAxisAlign;
1593     crossAxisAlign.Constant("Start", 1);
1594 
1595     crossAxisAlign.Constant("Center", 2);  // 2 means index of constant
1596     crossAxisAlign.Constant("End", 3);     // 3 means index of constant
1597     crossAxisAlign.Constant("Stretch", 4); // 4 means index of constant
1598 
1599     JSObjectTemplate direction;
1600     direction.Constant("Horizontal", 0);
1601     direction.Constant("Vertical", 1);
1602 
1603     JSObjectTemplate loadingProgressStyle;
1604     loadingProgressStyle.Constant("Default", 1);
1605     loadingProgressStyle.Constant("Circular", 2); // 2 means index of constant
1606     loadingProgressStyle.Constant("Orbital", 3);  // 3 means index of constant
1607 
1608     JSObjectTemplate progressStyle;
1609     progressStyle.Constant("Linear", 0);
1610     progressStyle.Constant("Ring", 1);      // 1 means index of constant
1611     progressStyle.Constant("Eclipse", 2);   // 2 means index of constant
1612     progressStyle.Constant("ScaleRing", 3); // 3 means index of constant
1613     progressStyle.Constant("Capsule", 4);   // 4 means index of constant
1614 
1615     JSObjectTemplate stackFit;
1616     stackFit.Constant("Keep", 0);
1617     stackFit.Constant("Stretch", 1);
1618     stackFit.Constant("Inherit", 2);    // 2 means index of constant
1619     stackFit.Constant("FirstChild", 3); // 3 means index of constant
1620 
1621     JSObjectTemplate overflow;
1622     overflow.Constant("Clip", 0);
1623     overflow.Constant("Observable", 1);
1624 
1625     JSObjectTemplate alignment;
1626     alignment.Constant("TopLeft", 0);
1627     alignment.Constant("TopCenter", 1);
1628     alignment.Constant("TopRight", 2);     // 2 means index of constant
1629     alignment.Constant("CenterLeft", 3);   // 3 means index of constant
1630     alignment.Constant("Center", 4);       // 4 means index of constant
1631     alignment.Constant("CenterRight", 5);  // 5 means index of constant
1632     alignment.Constant("BottomLeft", 6);   // 6 means index of constant
1633     alignment.Constant("BottomCenter", 7); // 7 means index of constant
1634     alignment.Constant("BottomRight", 8);  // 8 means index of constant
1635 
1636     JSObjectTemplate sliderStyle;
1637     sliderStyle.Constant("OutSet", 0);
1638     sliderStyle.Constant("InSet", 1);
1639     sliderStyle.Constant("NONE", 2);
1640 
1641     JSObjectTemplate sliderChangeMode;
1642     sliderChangeMode.Constant("Begin", 0);
1643     sliderChangeMode.Constant("Moving", 1);
1644     sliderChangeMode.Constant("End", 2);   // 2 means index of constant
1645     sliderChangeMode.Constant("Click", 3); // 3 means index of constant
1646 
1647     JSObjectTemplate pickerStyle;
1648     pickerStyle.Constant("Inline", 0);
1649     pickerStyle.Constant("Block", 1);
1650     pickerStyle.Constant("Fade", 2); // 2 means index of constant
1651 
1652     JSObjectTemplate buttonType;
1653     buttonType.Constant("Normal", (int)ButtonType::NORMAL);
1654     buttonType.Constant("Capsule", (int)ButtonType::CAPSULE);
1655     buttonType.Constant("Circle", (int)ButtonType::CIRCLE);
1656     buttonType.Constant("Arc", (int)ButtonType::ARC);
1657     buttonType.Constant("ROUNDED_RECTANGLE", (int)ButtonType::ROUNDED_RECTANGLE);
1658 
1659     JSObjectTemplate iconPosition;
1660     iconPosition.Constant("Start", 0);
1661     iconPosition.Constant("End", 1);
1662 
1663     JSObjectTemplate badgePosition;
1664     badgePosition.Constant("RightTop", 0);
1665     badgePosition.Constant("Right", 1);
1666     badgePosition.Constant("Left", 2); // 2 means index of constant
1667 
1668     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "MainAxisAlign"), *mainAxisAlign);
1669     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "CrossAxisAlign"), *crossAxisAlign);
1670 
1671     auto container = Container::Current();
1672     if (container == nullptr || !container->IsDynamicRender()) {
1673         globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "Direction"), *direction);
1674     }
1675 
1676     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "StackFit"), *stackFit);
1677     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "Align"), *alignment);
1678     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "Overflow"), *overflow);
1679     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "ButtonType"), *buttonType);
1680     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "LoadingProgressStyle"), *loadingProgressStyle);
1681     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "ProgressStyle"), *progressStyle);
1682     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "ToggleType"), *toggleType);
1683     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "RefreshStatus"), *refreshStatus);
1684     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "SliderStyle"), *sliderStyle);
1685     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "SliderChangeMode"), *sliderChangeMode);
1686     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "IconPosition"), *iconPosition);
1687     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "PickerStyle"), *pickerStyle);
1688     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "BadgePosition"), *badgePosition);
1689 }
1690 
JsRegisterWorkerViews(BindingTarget globalObj,void * nativeEngine)1691 void JsRegisterWorkerViews(BindingTarget globalObj, void* nativeEngine)
1692 {
1693     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
1694     if (!runtime) {
1695         return;
1696     }
1697     auto vm = runtime->GetEcmaVm();
1698     globalObj->Set(
1699         vm, panda::StringRef::NewFromUtf8(vm, "vp2px"), panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Vp2Px));
1700     globalObj->Set(
1701         vm, panda::StringRef::NewFromUtf8(vm, "px2vp"), panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Px2Vp));
1702     globalObj->Set(
1703         vm, panda::StringRef::NewFromUtf8(vm, "fp2px"), panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Fp2Px));
1704     globalObj->Set(
1705         vm, panda::StringRef::NewFromUtf8(vm, "px2fp"), panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Px2Fp));
1706     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "lpx2px"),
1707         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Lpx2Px));
1708     globalObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "px2lpx"),
1709         panda::FunctionRef::New(const_cast<panda::EcmaVM*>(vm), Px2Lpx));
1710     JsBindWorkerViews(globalObj, nativeEngine);
1711 }
1712 
1713 } // namespace OHOS::Ace::Framework
1714