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