1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "frameworks/bridge/declarative_frontend/declarative_frontend.h"
17
18 #include "base/log/dump_log.h"
19 #include "base/log/event_report.h"
20 #include "core/common/recorder/node_data_cache.h"
21 #include "frameworks/bridge/card_frontend/form_frontend_delegate_declarative.h"
22 #include "frameworks/bridge/declarative_frontend/ng/page_router_manager_factory.h"
23
24 namespace OHOS::Ace {
25 namespace {
26
27 /*
28 * NOTE:
29 * This function is needed to copy the values from BaseEventInfo
30 * It is observed, that the owner of BaseEventInfo will delete the pointer before it is ultimately
31 * processed by the EventMarker callback. In order to avoid this, a copy of all data needs to be made.
32 */
CopyEventInfo(const BaseEventInfo& info)33 std::shared_ptr<BaseEventInfo> CopyEventInfo(const BaseEventInfo& info)
34 {
35 const auto* touchInfo = TypeInfoHelper::DynamicCast<TouchEventInfo>(&info);
36 if (touchInfo != nullptr) {
37 return std::make_shared<TouchEventInfo>(*touchInfo);
38 }
39
40 const auto* dragStartInfo = TypeInfoHelper::DynamicCast<DragStartInfo>(&info);
41 if (dragStartInfo != nullptr) {
42 return std::make_shared<DragStartInfo>(*dragStartInfo);
43 }
44
45 const auto* dragUpdateInfo = TypeInfoHelper::DynamicCast<DragUpdateInfo>(&info);
46 if (dragUpdateInfo != nullptr) {
47 return std::make_shared<DragUpdateInfo>(*dragUpdateInfo);
48 }
49
50 const auto* dragEndInfo = TypeInfoHelper::DynamicCast<DragEndInfo>(&info);
51 if (dragEndInfo != nullptr) {
52 return std::make_shared<DragEndInfo>(*dragEndInfo);
53 }
54
55 const auto* clickInfo = TypeInfoHelper::DynamicCast<ClickInfo>(&info);
56 if (clickInfo != nullptr) {
57 return std::make_shared<ClickInfo>(*clickInfo);
58 }
59 return nullptr;
60 }
61
TouchInfoToString(const BaseEventInfo& info, std::string& eventParam)62 void TouchInfoToString(const BaseEventInfo& info, std::string& eventParam)
63 {
64 eventParam.append("{\"touches\":[{");
65 const auto touchInfo = TypeInfoHelper::DynamicCast<TouchEventInfo>(&info);
66 if (touchInfo) {
67 auto touchList = touchInfo->GetTouches();
68 for (const auto& location : touchList) {
69 auto globalLocation = location.GetGlobalLocation();
70 eventParam.append("\"globalX\":")
71 .append(std::to_string(globalLocation.GetX()))
72 .append(",\"globalY\":")
73 .append(std::to_string(globalLocation.GetY()))
74 .append(",");
75 auto localLocation = location.GetLocalLocation();
76 eventParam.append("\"localX\":")
77 .append(std::to_string(localLocation.GetX()))
78 .append(",\"localY\":")
79 .append(std::to_string(localLocation.GetY()))
80 .append(",");
81 eventParam.append("\"size\":").append(std::to_string(location.GetSize())).append(",");
82 }
83 if (eventParam.back() == ',') {
84 eventParam.pop_back();
85 }
86 eventParam.append("}],\"changedTouches\":[{");
87 auto changeTouch = touchInfo->GetChangedTouches();
88 for (const auto& change : changeTouch) {
89 auto globalLocation = change.GetGlobalLocation();
90 eventParam.append("\"globalX\":")
91 .append(std::to_string(globalLocation.GetX()))
92 .append(",\"globalY\":")
93 .append(std::to_string(globalLocation.GetY()))
94 .append(",");
95 auto localLocation = change.GetLocalLocation();
96 eventParam.append("\"localX\":")
97 .append(std::to_string(localLocation.GetX()))
98 .append(",\"localY\":")
99 .append(std::to_string(localLocation.GetY()))
100 .append(",");
101 eventParam.append("\"size\":").append(std::to_string(change.GetSize())).append(",");
102 }
103 if (eventParam.back() == ',') {
104 eventParam.pop_back();
105 }
106 }
107 eventParam.append("}]}");
108 }
109
MouseInfoToString(const BaseEventInfo& info, std::string& eventParam)110 void MouseInfoToString(const BaseEventInfo& info, std::string& eventParam)
111 {
112 const auto mouseInfo = TypeInfoHelper::DynamicCast<MouseEventInfo>(&info);
113 eventParam.append("{\"mouse\":{");
114 if (mouseInfo) {
115 auto globalMouse = mouseInfo->GetGlobalMouse();
116 eventParam.append("\"globalX\":")
117 .append(std::to_string(globalMouse.x))
118 .append(",\"globalY\":")
119 .append(std::to_string(globalMouse.y))
120 .append(",\"globalZ\":")
121 .append(std::to_string(globalMouse.z))
122 .append(",\"localX\":")
123 .append(std::to_string(globalMouse.x))
124 .append(",\"localY\":")
125 .append(std::to_string(globalMouse.y))
126 .append(",\"localZ\":")
127 .append(std::to_string(globalMouse.z))
128 .append(",\"deltaX\":")
129 .append(std::to_string(globalMouse.deltaX))
130 .append(",\"deltaY\":")
131 .append(std::to_string(globalMouse.deltaY))
132 .append(",\"deltaZ\":")
133 .append(std::to_string(globalMouse.deltaZ))
134 .append(",\"scrollX\":")
135 .append(std::to_string(globalMouse.scrollX))
136 .append(",\"scrollY\":")
137 .append(std::to_string(globalMouse.scrollY))
138 .append(",\"scrollZ\":")
139 .append(std::to_string(globalMouse.scrollZ))
140 .append(",\"action\":")
141 .append(std::to_string(static_cast<int32_t>(globalMouse.action)))
142 .append(",\"button\":")
143 .append(std::to_string(static_cast<int32_t>(globalMouse.button)))
144 .append(",\"pressedButtons\":")
145 .append(std::to_string(globalMouse.pressedButtons));
146 }
147 eventParam.append("}}");
148 }
149
SwipeInfoToString(const BaseEventInfo& info, std::string& eventParam)150 void SwipeInfoToString(const BaseEventInfo& info, std::string& eventParam)
151 {
152 const auto& swipeInfo = TypeInfoHelper::DynamicCast<SwipeEventInfo>(&info);
153 if (swipeInfo != nullptr) {
154 eventParam = swipeInfo->ToJsonParamInfo();
155 }
156 }
157
158 } // namespace
159
160 DeclarativeFrontend::~DeclarativeFrontend() noexcept
161 {
162 LOGI("DeclarativeFrontend destroyed");
163 }
164
Destroy()165 void DeclarativeFrontend::Destroy()
166 {
167 // The call doesn't change the page pop status
168 Recorder::NodeDataCache::Get().OnBeforePagePop(true);
169 CHECK_RUN_ON(JS);
170 LOGI("DeclarativeFrontend Destroy begin.");
171 // To guarantee the jsEngine_ and delegate_ released in js thread
172 delegate_.Reset();
173 handler_.Reset();
174 if (jsEngine_) {
175 jsEngine_->Destroy();
176 }
177 jsEngine_.Reset();
178 LOGI("DeclarativeFrontend Destroy end.");
179 }
180
Initialize(FrontendType type, const RefPtr<TaskExecutor>& taskExecutor)181 bool DeclarativeFrontend::Initialize(FrontendType type, const RefPtr<TaskExecutor>& taskExecutor)
182 {
183 type_ = type;
184 taskExecutor_ = taskExecutor;
185 ACE_DCHECK(type_ == FrontendType::DECLARATIVE_JS);
186 InitializeFrontendDelegate(taskExecutor);
187
188 bool needPostJsTask = true;
189 auto container = Container::Current();
190 if (container) {
191 const auto& setting = container->GetSettings();
192 needPostJsTask = !(setting.usePlatformAsUIThread && setting.useUIAsJSThread);
193 }
194
195 #if defined(PREVIEW)
196 auto initJSEngineTask = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_), delegate = delegate_,
197 pkgNameMap = pkgNameMap_, pkgAliasMap = pkgAliasMap_, pkgContextInfoMap = pkgContextInfoMap_] {
198 auto jsEngine = weakEngine.Upgrade();
199 if (!jsEngine) {
200 return;
201 }
202 jsEngine->SetPkgNameList(pkgNameMap);
203 jsEngine->SetPkgAliasList(pkgAliasMap);
204 jsEngine->SetpkgContextInfoList(pkgContextInfoMap);
205 #else
206 auto initJSEngineTask = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_), delegate = delegate_] {
207 auto jsEngine = weakEngine.Upgrade();
208 if (!jsEngine) {
209 return;
210 }
211 #endif
212 jsEngine->Initialize(delegate);
213 };
214 if (needPostJsTask) {
215 taskExecutor->PostTask(initJSEngineTask, TaskExecutor::TaskType::JS, "ArkUIInitJsEngine");
216 } else {
217 initJSEngineTask();
218 }
219
220 return true;
221 }
222
223 void DeclarativeFrontend::AttachPipelineContext(const RefPtr<PipelineBase>& context)
224 {
225 if (!delegate_) {
226 return;
227 }
228 handler_ = AceType::MakeRefPtr<DeclarativeEventHandler>(delegate_);
229 auto pipelineContext = AceType::DynamicCast<PipelineContext>(context);
230 if (pipelineContext) {
231 pipelineContext->RegisterEventHandler(handler_);
232 }
233 delegate_->AttachPipelineContext(context);
234 }
235
236 void DeclarativeFrontend::AttachSubPipelineContext(const RefPtr<PipelineBase>& context)
237 {
238 if (!context) {
239 return;
240 }
241 auto pipelineContext = AceType::DynamicCast<PipelineContext>(context);
242 if (pipelineContext) {
243 pipelineContext->RegisterEventHandler(handler_);
244 }
245 if (!delegate_) {
246 return;
247 }
248 delegate_->AttachSubPipelineContext(context);
249 }
250
251 void DeclarativeFrontend::SetAssetManager(const RefPtr<AssetManager>& assetManager)
252 {
253 if (delegate_) {
254 delegate_->SetAssetManager(assetManager);
255 }
256 }
257
258 void DeclarativeFrontend::InitializeFrontendDelegate(const RefPtr<TaskExecutor>& taskExecutor)
259 {
260 const auto& loadCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const std::string& url,
261 const RefPtr<Framework::JsAcePage>& jsPage, bool isMainPage) {
262 auto jsEngine = weakEngine.Upgrade();
263 if (!jsEngine) {
264 return;
265 }
266 jsEngine->LoadJs(url, jsPage, isMainPage);
267 jsEngine->UpdateRootComponent();
268 };
269
270 const auto& setPluginMessageTransferCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
271 const RefPtr<JsMessageDispatcher>& dispatcher) {
272 auto jsEngine = weakEngine.Upgrade();
273 if (!jsEngine) {
274 return;
275 }
276 jsEngine->SetJsMessageDispatcher(dispatcher);
277 };
278
279 const auto& asyncEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
280 const std::string& eventId, const std::string& param) {
281 auto jsEngine = weakEngine.Upgrade();
282 if (!jsEngine) {
283 return;
284 }
285 jsEngine->FireAsyncEvent(eventId, param);
286 };
287
288 const auto& syncEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
289 const std::string& eventId, const std::string& param) {
290 auto jsEngine = weakEngine.Upgrade();
291 if (!jsEngine) {
292 return;
293 }
294 jsEngine->FireSyncEvent(eventId, param);
295 };
296
297 const auto& updatePageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
298 const RefPtr<Framework::JsAcePage>& jsPage) {
299 auto jsEngine = weakEngine.Upgrade();
300 if (!jsEngine) {
301 return;
302 }
303 jsEngine->UpdateRunningPage(jsPage);
304 jsEngine->UpdateStagingPage(jsPage);
305 };
306
307 const auto& resetStagingPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
308 auto jsEngine = weakEngine.Upgrade();
309 if (!jsEngine) {
310 return;
311 }
312 jsEngine->ResetStagingPage();
313 };
314
315 const auto& destroyPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](int32_t pageId) {
316 auto jsEngine = weakEngine.Upgrade();
317 if (!jsEngine) {
318 return;
319 }
320 jsEngine->DestroyPageInstance(pageId);
321 };
322
323 const auto& destroyApplicationCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
324 const std::string& packageName) {
325 auto jsEngine = weakEngine.Upgrade();
326 if (!jsEngine) {
327 return;
328 }
329 jsEngine->DestroyApplication(packageName);
330 };
331
332 const auto& updateApplicationStateCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
333 const std::string& packageName, Frontend::State state) {
334 auto jsEngine = weakEngine.Upgrade();
335 if (!jsEngine) {
336 return;
337 }
338 jsEngine->UpdateApplicationState(packageName, state);
339 };
340
341 const auto& onWindowDisplayModeChangedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
342 bool isShownInMultiWindow, const std::string& data) {
343 auto jsEngine = weakEngine.Upgrade();
344 if (!jsEngine) {
345 return;
346 }
347 jsEngine->OnWindowDisplayModeChanged(isShownInMultiWindow, data);
348 };
349
350 const auto& onSaveAbilityStateCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](std::string& data) {
351 auto jsEngine = weakEngine.Upgrade();
352 if (!jsEngine) {
353 return;
354 }
355 jsEngine->OnSaveAbilityState(data);
356 };
357 const auto& onRestoreAbilityStateCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
358 const std::string& data) {
359 auto jsEngine = weakEngine.Upgrade();
360 if (!jsEngine) {
361 return;
362 }
363 jsEngine->OnRestoreAbilityState(data);
364 };
365
366 const auto& onNewWantCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const std::string& data) {
367 auto jsEngine = weakEngine.Upgrade();
368 if (!jsEngine) {
369 return;
370 }
371 jsEngine->OnNewWant(data);
372 };
373
374 const auto& onConfigurationUpdatedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
375 const std::string& data) {
376 auto jsEngine = weakEngine.Upgrade();
377 if (!jsEngine) {
378 return;
379 }
380 jsEngine->OnConfigurationUpdated(data);
381 };
382
383 const auto& timerCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
384 const std::string& callbackId, const std::string& delay, bool isInterval) {
385 auto jsEngine = weakEngine.Upgrade();
386 if (!jsEngine) {
387 return;
388 }
389 jsEngine->TimerCallback(callbackId, delay, isInterval);
390 };
391
392 const auto& mediaQueryCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
393 const std::string& callbackId, const std::string& args) {
394 auto jsEngine = weakEngine.Upgrade();
395 if (!jsEngine) {
396 return;
397 }
398 jsEngine->MediaQueryCallback(callbackId, args);
399 };
400
401 const auto& layoutInspectorCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
402 const std::string& componentId) {
403 auto jsEngine = weakEngine.Upgrade();
404 if (!jsEngine) {
405 return;
406 }
407 jsEngine->LayoutInspectorCallback(componentId);
408 };
409
410 const auto& drawInspectorCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
411 const std::string& componentId) {
412 auto jsEngine = weakEngine.Upgrade();
413 if (!jsEngine) {
414 return;
415 }
416 jsEngine->DrawInspectorCallback(componentId);
417 };
418
419 const auto& requestAnimationCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
420 const std::string& callbackId, uint64_t timeStamp) {
421 auto jsEngine = weakEngine.Upgrade();
422 if (!jsEngine) {
423 return;
424 }
425 jsEngine->RequestAnimationCallback(callbackId, timeStamp);
426 };
427
428 const auto& jsCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
429 const std::string& callbackId, const std::string& args) {
430 auto jsEngine = weakEngine.Upgrade();
431 if (!jsEngine) {
432 return;
433 }
434 jsEngine->JsCallback(callbackId, args);
435 };
436
437 const auto& onMemoryLevelCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const int32_t level) {
438 auto jsEngine = weakEngine.Upgrade();
439 if (!jsEngine) {
440 return;
441 }
442 jsEngine->OnMemoryLevel(level);
443 };
444
445 const auto& onStartContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() -> bool {
446 auto jsEngine = weakEngine.Upgrade();
447 if (!jsEngine) {
448 return false;
449 }
450 return jsEngine->OnStartContinuation();
451 };
452 const auto& onCompleteContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](int32_t code) {
453 auto jsEngine = weakEngine.Upgrade();
454 if (!jsEngine) {
455 return;
456 }
457 jsEngine->OnCompleteContinuation(code);
458 };
459 const auto& onRemoteTerminatedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
460 auto jsEngine = weakEngine.Upgrade();
461 if (!jsEngine) {
462 return;
463 }
464 jsEngine->OnRemoteTerminated();
465 };
466 const auto& onSaveDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](std::string& savedData) {
467 auto jsEngine = weakEngine.Upgrade();
468 if (!jsEngine) {
469 return;
470 }
471 jsEngine->OnSaveData(savedData);
472 };
473 const auto& onRestoreDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
474 const std::string& data) -> bool {
475 auto jsEngine = weakEngine.Upgrade();
476 if (!jsEngine) {
477 return false;
478 }
479 return jsEngine->OnRestoreData(data);
480 };
481
482 const auto& externalEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
483 const std::string& componentId, const uint32_t nodeId,
484 const bool isDestroy) {
485 auto jsEngine = weakEngine.Upgrade();
486 if (!jsEngine) {
487 return;
488 }
489 jsEngine->FireExternalEvent(componentId, nodeId, isDestroy);
490 };
491
492 if (isFormRender_) {
493 delegate_ = AceType::MakeRefPtr<Framework::FormFrontendDelegateDeclarative>(taskExecutor, loadCallback,
494 setPluginMessageTransferCallback, asyncEventCallback, syncEventCallback, updatePageCallback,
495 resetStagingPageCallback, destroyPageCallback, destroyApplicationCallback, updateApplicationStateCallback,
496 timerCallback, mediaQueryCallback, layoutInspectorCallback, drawInspectorCallback, requestAnimationCallback,
497 jsCallback, onWindowDisplayModeChangedCallBack, onConfigurationUpdatedCallBack, onSaveAbilityStateCallBack,
498 onRestoreAbilityStateCallBack, onNewWantCallBack, onMemoryLevelCallBack, onStartContinuationCallBack,
499 onCompleteContinuationCallBack, onRemoteTerminatedCallBack, onSaveDataCallBack, onRestoreDataCallBack,
500 externalEventCallback);
501 } else {
502 delegate_ = AceType::MakeRefPtr<Framework::FrontendDelegateDeclarative>(taskExecutor, loadCallback,
503 setPluginMessageTransferCallback, asyncEventCallback, syncEventCallback, updatePageCallback,
504 resetStagingPageCallback, destroyPageCallback, destroyApplicationCallback, updateApplicationStateCallback,
505 timerCallback, mediaQueryCallback, layoutInspectorCallback, drawInspectorCallback, requestAnimationCallback,
506 jsCallback, onWindowDisplayModeChangedCallBack, onConfigurationUpdatedCallBack, onSaveAbilityStateCallBack,
507 onRestoreAbilityStateCallBack, onNewWantCallBack, onMemoryLevelCallBack, onStartContinuationCallBack,
508 onCompleteContinuationCallBack, onRemoteTerminatedCallBack, onSaveDataCallBack, onRestoreDataCallBack,
509 externalEventCallback);
510 }
511
512 if (disallowPopLastPage_) {
513 delegate_->DisallowPopLastPage();
514 }
515 if (!jsEngine_) {
516 EventReport::SendAppStartException(AppStartExcepType::JS_ENGINE_CREATE_ERR);
517 return;
518 }
519 delegate_->SetGroupJsBridge(jsEngine_->GetGroupJsBridge());
520 if (Container::IsCurrentUseNewPipeline()) {
521 auto loadPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const std::string& url,
522 const std::function<void(const std::string&, int32_t)>& errorCallback) {
523 auto jsEngine = weakEngine.Upgrade();
524 if (!jsEngine) {
525 return false;
526 }
527 return jsEngine->LoadPageSource(url, errorCallback);
528 };
529 auto loadPageByBufferCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
530 const std::shared_ptr<std::vector<uint8_t>>& content,
531 const std::function<void(const std::string&, int32_t)>& errorCallback) {
532 auto jsEngine = weakEngine.Upgrade();
533 if (!jsEngine) {
534 return false;
535 }
536 return jsEngine->LoadPageSource(content, errorCallback);
537 };
538 auto loadNamedRouterCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
539 const std::string& namedRouter, bool isTriggeredByJs) {
540 auto jsEngine = weakEngine.Upgrade();
541 if (!jsEngine) {
542 return false;
543 }
544 return jsEngine->LoadNamedRouterSource(namedRouter, isTriggeredByJs);
545 };
546 auto updateRootComponentCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
547 auto jsEngine = weakEngine.Upgrade();
548 if (!jsEngine) {
549 return false;
550 }
551 return jsEngine->UpdateRootComponent();
552 };
553 auto getFullPathInfoCallback =
554 [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() -> std::unique_ptr<JsonValue> {
555 auto jsEngine = weakEngine.Upgrade();
556 if (!jsEngine) {
557 return nullptr;
558 }
559 return jsEngine->GetFullPathInfo();
560 };
561 auto restoreFullPathInfoCallback =
562 [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](std::unique_ptr<JsonValue> fullPathInfo) {
563 auto jsEngine = weakEngine.Upgrade();
564 if (!jsEngine) {
565 return;
566 }
567 return jsEngine->RestoreFullPathInfo(std::move(fullPathInfo));
568 };
569 auto getNamedRouterInfoCallback =
570 [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() -> std::unique_ptr<JsonValue> {
571 auto jsEngine = weakEngine.Upgrade();
572 if (!jsEngine) {
573 return nullptr;
574 }
575 return jsEngine->GetNamedRouterInfo();
576 };
577 auto restoreNamedRouterInfoCallback =
578 [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](std::unique_ptr<JsonValue> namedRouterInfo) {
579 auto jsEngine = weakEngine.Upgrade();
580 if (!jsEngine) {
581 return;
582 }
583 return jsEngine->RestoreNamedRouterInfo(std::move(namedRouterInfo));
584 };
585 auto isNamedRouterNeedPreloadCallback =
586 [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const std::string& name) -> bool {
587 auto jsEngine = weakEngine.Upgrade();
588 if (!jsEngine) {
589 return false;
590 }
591 return jsEngine->IsNamedRouterNeedPreload(name);
592 };
593
594 auto preloadNamedRouterCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
595 const std::string& name, std::function<void(bool)>&& loadFinishCallback) {
596 auto jsEngine = weakEngine.Upgrade();
597 if (!jsEngine) {
598 return;
599 }
600 return jsEngine->PreloadNamedRouter(name, std::move(loadFinishCallback));
601 };
602
603 auto pageRouterManager = NG::PageRouterManagerFactory::CreateManager();
604 pageRouterManager->SetLoadJsCallback(std::move(loadPageCallback));
605 pageRouterManager->SetLoadJsByBufferCallback(std::move(loadPageByBufferCallback));
606 pageRouterManager->SetLoadNamedRouterCallback(std::move(loadNamedRouterCallback));
607 pageRouterManager->SetUpdateRootComponentCallback(std::move(updateRootComponentCallback));
608 pageRouterManager->SetGetFullPathInfoCallback(std::move(getFullPathInfoCallback));
609 pageRouterManager->SetRestoreFullPathInfoCallback(std::move(restoreFullPathInfoCallback));
610 pageRouterManager->SetGetNamedRouterInfoCallback(std::move(getNamedRouterInfoCallback));
611 pageRouterManager->SetRestoreNamedRouterInfoCallback(std::move(restoreNamedRouterInfoCallback));
612 pageRouterManager->SetIsNamedRouterNeedPreloadCallback(std::move(isNamedRouterNeedPreloadCallback));
613 pageRouterManager->SetPreloadNamedRouterCallback(std::move(preloadNamedRouterCallback));
614 delegate_->SetPageRouterManager(pageRouterManager);
615
616 #if defined(PREVIEW)
617 auto isComponentPreviewCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
618 auto jsEngine = weakEngine.Upgrade();
619 if (!jsEngine) {
620 return false;
621 }
622 return jsEngine->IsComponentPreview();
623 };
624 delegate_->SetIsComponentPreview(isComponentPreviewCallback);
625 #endif
626
627 auto moduleNamecallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const std::string& pageName)->
628 std::string {
629 auto jsEngine = weakEngine.Upgrade();
630 if (!jsEngine) {
631 return "";
632 }
633 return jsEngine->SearchRouterRegisterMap(pageName);
634 };
635 auto navigationLoadCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
636 const std::string bundleName, const std::string& moduleName, const std::string& pageSourceFile,
637 bool isSingleton) -> int32_t {
638 auto jsEngine = weakEngine.Upgrade();
639 if (!jsEngine) {
640 return -1;
641 }
642 return jsEngine->LoadNavDestinationSource(bundleName, moduleName, pageSourceFile, isSingleton);
643 };
644 auto container = Container::Current();
645 if (container) {
646 auto pageUrlChecker = container->GetPageUrlChecker();
647 // ArkTSCard container no SetPageUrlChecker
648 if (pageUrlChecker != nullptr) {
649 pageUrlChecker->SetModuleNameCallback(std::move(moduleNamecallback));
650 }
651 auto navigationRoute = container->GetNavigationRoute();
652 if (navigationRoute) {
653 navigationRoute->SetLoadPageCallback(std::move(navigationLoadCallback));
654 }
655 }
656 }
657 }
658
659 UIContentErrorCode DeclarativeFrontend::RunPage(const std::string& url, const std::string& params)
660 {
661 auto container = Container::Current();
662 auto isStageModel = container ? container->IsUseStageModel() : false;
663 if (!isStageModel && Container::IsCurrentUseNewPipeline()) {
664 // In NG structure and fa mode, first load app.js
665 auto taskExecutor = container ? container->GetTaskExecutor() : nullptr;
666 CHECK_NULL_RETURN(taskExecutor, UIContentErrorCode::NULL_POINTER);
667 taskExecutor->PostTask(
668 [weak = AceType::WeakClaim(this)]() {
669 auto frontend = weak.Upgrade();
670 CHECK_NULL_VOID(frontend);
671 CHECK_NULL_VOID(frontend->jsEngine_);
672 frontend->jsEngine_->LoadFaAppSource();
673 },
674 TaskExecutor::TaskType::JS, "ArkUILoadFaAppSource");
675 }
676
677 if (delegate_) {
678 if (isFormRender_) {
679 auto delegate = AceType::DynamicCast<Framework::FormFrontendDelegateDeclarative>(delegate_);
680 return delegate->RunCard(url, params, pageProfile_, 0);
681 } else {
682 delegate_->RunPage(url, params, pageProfile_);
683 return UIContentErrorCode::NO_ERRORS;
684 }
685 }
686
687 return UIContentErrorCode::NULL_POINTER;
688 }
689
690 UIContentErrorCode DeclarativeFrontend::RunPage(
691 const std::shared_ptr<std::vector<uint8_t>>& content, const std::string& params)
692 {
693 auto container = Container::Current();
694 auto isStageModel = container ? container->IsUseStageModel() : false;
695 if (!isStageModel) {
696 LOGE("RunPage by buffer must be run under stage model.");
697 return UIContentErrorCode::NO_STAGE;
698 }
699
700 if (delegate_) {
701 delegate_->RunPage(content, params, pageProfile_);
702 return UIContentErrorCode::NO_ERRORS;
703 }
704
705 return UIContentErrorCode::NULL_POINTER;
706 }
707
708 UIContentErrorCode DeclarativeFrontend::RunPageByNamedRouter(const std::string& name, const std::string& params)
709 {
710 if (delegate_) {
711 return delegate_->RunPage(name, params, pageProfile_, true);
712 }
713
714 return UIContentErrorCode::NULL_POINTER;
715 }
716
717 void DeclarativeFrontend::ReplacePage(const std::string& url, const std::string& params)
718 {
719 if (delegate_) {
720 delegate_->Replace(url, params);
721 }
722 }
723
724 void DeclarativeFrontend::PushPage(const std::string& url, const std::string& params)
725 {
726 if (delegate_) {
727 delegate_->Push(url, params);
728 }
729 }
730
731 void DeclarativeFrontend::NavigatePage(uint8_t type, const PageTarget& target, const std::string& params)
732 {
733 if (!delegate_) {
734 return;
735 }
736 switch (static_cast<NavigatorType>(type)) {
737 case NavigatorType::PUSH:
738 delegate_->Push(target, params);
739 break;
740 case NavigatorType::REPLACE:
741 delegate_->Replace(target, params);
742 break;
743 case NavigatorType::BACK:
744 delegate_->BackWithTarget(target, params);
745 break;
746 default:
747 delegate_->BackWithTarget(target, params);
748 break;
749 }
750 }
751
752 std::string DeclarativeFrontend::GetCurrentPageUrl() const
753 {
754 CHECK_NULL_RETURN(delegate_, "");
755 return delegate_->GetCurrentPageUrl();
756 }
757
758 // Get the currently running JS page information in NG structure.
759 RefPtr<Framework::RevSourceMap> DeclarativeFrontend::GetCurrentPageSourceMap() const
760 {
761 CHECK_NULL_RETURN(delegate_, nullptr);
762 return delegate_->GetCurrentPageSourceMap();
763 }
764
765 // Get the currently running JS page information in NG structure.
766 RefPtr<Framework::RevSourceMap> DeclarativeFrontend::GetFaAppSourceMap() const
767 {
768 CHECK_NULL_RETURN(delegate_, nullptr);
769 return delegate_->GetFaAppSourceMap();
770 }
771
772 void DeclarativeFrontend::GetStageSourceMap(
773 std::unordered_map<std::string, RefPtr<Framework::RevSourceMap>>& sourceMap) const
774 {
775 if (delegate_) {
776 delegate_->GetStageSourceMap(sourceMap);
777 }
778 }
779
780 RefPtr<NG::PageRouterManager> DeclarativeFrontend::GetPageRouterManager() const
781 {
782 CHECK_NULL_RETURN(delegate_, nullptr);
783 return delegate_->GetPageRouterManager();
784 }
785
786 std::pair<RouterRecoverRecord, UIContentErrorCode> DeclarativeFrontend::RestoreRouterStack(
787 const std::string& contentInfo, ContentInfoType type)
788 {
789 if (delegate_) {
790 return delegate_->RestoreRouterStack(contentInfo, type);
791 }
792 return std::make_pair(RouterRecoverRecord(), UIContentErrorCode::NULL_POINTER);
793 }
794
795 std::string DeclarativeFrontend::GetContentInfo(ContentInfoType type) const
796 {
797 if (delegate_) {
798 return delegate_->GetContentInfo(type);
799 }
800 return "";
801 }
802
803 int32_t DeclarativeFrontend::GetRouterSize() const
804 {
805 if (delegate_) {
806 return delegate_->GetStackSize();
807 }
808 return -1;
809 }
810
811 void DeclarativeFrontend::SendCallbackMessage(const std::string& callbackId, const std::string& data) const
812 {
813 if (delegate_) {
814 delegate_->OnJSCallback(callbackId, data);
815 }
816 }
817
818 void DeclarativeFrontend::SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher>& dispatcher) const
819 {
820 if (delegate_) {
821 delegate_->SetJsMessageDispatcher(dispatcher);
822 }
823 }
824
825 void DeclarativeFrontend::TransferComponentResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
826 {
827 if (delegate_) {
828 delegate_->TransferComponentResponseData(callbackId, code, std::move(data));
829 }
830 }
831
832 void DeclarativeFrontend::TransferJsResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
833 {
834 if (delegate_) {
835 delegate_->TransferJsResponseData(callbackId, code, std::move(data));
836 }
837 }
838
839 napi_value DeclarativeFrontend::GetContextValue()
840 {
841 if (jsEngine_) {
842 return jsEngine_->GetContextValue();
843 }
844 return nullptr;
845 }
846
847 napi_value DeclarativeFrontend::GetFrameNodeValueByNodeId(int32_t nodeId)
848 {
849 if (jsEngine_) {
850 return jsEngine_->GetFrameNodeValueByNodeId(nodeId);
851 }
852 return nullptr;
853 }
854
855 #if defined(PREVIEW)
856 void DeclarativeFrontend::TransferJsResponseDataPreview(int callbackId, int32_t code, ResponseData responseData) const
857 {
858 delegate_->TransferJsResponseDataPreview(callbackId, code, responseData);
859 }
860
861 RefPtr<Component> DeclarativeFrontend::GetNewComponentWithJsCode(const std::string& jsCode, const std::string& viewID)
862 {
863 if (jsEngine_) {
864 return jsEngine_->GetNewComponentWithJsCode(jsCode, viewID);
865 }
866 return nullptr;
867 }
868 #endif
869
870 void DeclarativeFrontend::TransferJsPluginGetError(int callbackId, int32_t errorCode, std::string&& errorMessage) const
871 {
872 if (delegate_) {
873 delegate_->TransferJsPluginGetError(callbackId, errorCode, std::move(errorMessage));
874 }
875 }
876
877 void DeclarativeFrontend::TransferJsEventData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const
878 {
879 if (delegate_) {
880 delegate_->TransferJsEventData(callbackId, code, std::move(data));
881 }
882 }
883
884 void DeclarativeFrontend::LoadPluginJsCode(std::string&& jsCode) const
885 {
886 if (delegate_) {
887 delegate_->LoadPluginJsCode(std::move(jsCode));
888 }
889 }
890
891 void DeclarativeFrontend::LoadPluginJsByteCode(std::vector<uint8_t>&& jsCode, std::vector<int32_t>&& jsCodeLen) const
892 {
893 if (delegate_) {
894 delegate_->LoadPluginJsByteCode(std::move(jsCode), std::move(jsCodeLen));
895 }
896 }
897
898 void DeclarativeFrontend::UpdateState(Frontend::State state)
899 {
900 if (!delegate_ || state == Frontend::State::ON_CREATE) {
901 return;
902 }
903 bool needPostJsTask = true;
904 auto container = Container::Current();
905 CHECK_NULL_VOID(container);
906 const auto& setting = container->GetSettings();
907 needPostJsTask = !(setting.usePlatformAsUIThread && setting.useUIAsJSThread);
908 if (needPostJsTask) {
909 delegate_->UpdateApplicationState(delegate_->GetAppID(), state);
910 return;
911 }
912 if (jsEngine_) {
913 jsEngine_->UpdateApplicationState(delegate_->GetAppID(), state);
914 }
915 }
916
917 void DeclarativeFrontend::OnWindowDisplayModeChanged(bool isShownInMultiWindow, const std::string& data)
918 {
919 delegate_->OnWindowDisplayModeChanged(isShownInMultiWindow, data);
920 }
921
922 void DeclarativeFrontend::OnSaveAbilityState(std::string& data)
923 {
924 if (delegate_) {
925 delegate_->OnSaveAbilityState(data);
926 }
927 }
928
929 void DeclarativeFrontend::OnRestoreAbilityState(const std::string& data)
930 {
931 if (delegate_) {
932 delegate_->OnRestoreAbilityState(data);
933 }
934 }
935
936 void DeclarativeFrontend::OnNewWant(const std::string& data)
937 {
938 if (delegate_) {
939 delegate_->OnNewWant(data);
940 }
941 }
942
943 RefPtr<AccessibilityManager> DeclarativeFrontend::GetAccessibilityManager() const
944 {
945 if (!delegate_) {
946 return nullptr;
947 }
948 return delegate_->GetJSAccessibilityManager();
949 }
950
951 WindowConfig& DeclarativeFrontend::GetWindowConfig()
952 {
953 if (!delegate_) {
954 static WindowConfig windowConfig;
955 return windowConfig;
956 }
957 return delegate_->GetWindowConfig();
958 }
959
960 bool DeclarativeFrontend::OnBackPressed()
961 {
962 if (!delegate_) {
963 return false;
964 }
965 return delegate_->OnPageBackPress();
966 }
967
968 void DeclarativeFrontend::OnShow()
969 {
970 if (delegate_) {
971 foregroundFrontend_ = true;
972 delegate_->OnForeground();
973 }
974 }
975
976 void DeclarativeFrontend::OnHide()
977 {
978 if (delegate_) {
979 delegate_->OnBackGround();
980 foregroundFrontend_ = false;
981 }
982 }
983
984 void DeclarativeFrontend::OnConfigurationUpdated(const std::string& data)
985 {
986 if (delegate_) {
987 delegate_->OnConfigurationUpdated(data);
988 }
989 }
990
991 void DeclarativeFrontend::OnActive()
992 {
993 if (delegate_) {
994 foregroundFrontend_ = true;
995 delegate_->InitializeAccessibilityCallback();
996 }
997 }
998
999 void DeclarativeFrontend::OnInactive() {}
1000
1001 bool DeclarativeFrontend::OnStartContinuation()
1002 {
1003 if (!delegate_) {
1004 return false;
1005 }
1006 return delegate_->OnStartContinuation();
1007 }
1008
1009 void DeclarativeFrontend::OnCompleteContinuation(int32_t code)
1010 {
1011 if (delegate_) {
1012 delegate_->OnCompleteContinuation(code);
1013 }
1014 }
1015
1016 void DeclarativeFrontend::OnMemoryLevel(const int32_t level)
1017 {
1018 if (delegate_) {
1019 delegate_->OnMemoryLevel(level);
1020 }
1021 }
1022
1023 void DeclarativeFrontend::OnSaveData(std::string& data)
1024 {
1025 if (delegate_) {
1026 delegate_->OnSaveData(data);
1027 }
1028 }
1029
1030 void DeclarativeFrontend::GetPluginsUsed(std::string& data)
1031 {
1032 if (delegate_) {
1033 delegate_->GetPluginsUsed(data);
1034 }
1035 }
1036
1037 bool DeclarativeFrontend::OnRestoreData(const std::string& data)
1038 {
1039 if (!delegate_) {
1040 return false;
1041 }
1042 return delegate_->OnRestoreData(data);
1043 }
1044
1045 void DeclarativeFrontend::OnRemoteTerminated()
1046 {
1047 if (delegate_) {
1048 delegate_->OnRemoteTerminated();
1049 }
1050 }
1051
1052 void DeclarativeFrontend::OnNewRequest(const std::string& data)
1053 {
1054 if (delegate_) {
1055 delegate_->OnNewRequest(data);
1056 }
1057 }
1058
1059 void DeclarativeFrontend::CallRouterBack()
1060 {
1061 if (delegate_) {
1062 if (delegate_->GetStackSize() == 1 && isSubWindow_) {
1063 return;
1064 }
1065 delegate_->CallPopPage();
1066 }
1067 }
1068
1069 void DeclarativeFrontend::OnSurfaceChanged(int32_t width, int32_t height)
1070 {
1071 if (delegate_) {
1072 delegate_->OnSurfaceChanged();
1073 }
1074 }
1075
1076 void DeclarativeFrontend::OnLayoutCompleted(const std::string& componentId)
1077 {
1078 if (delegate_) {
1079 delegate_->OnLayoutCompleted(componentId);
1080 }
1081 }
1082
1083 void DeclarativeFrontend::OnDrawCompleted(const std::string& componentId)
1084 {
1085 if (delegate_) {
1086 delegate_->OnDrawCompleted(componentId);
1087 }
1088 }
1089
1090 void DeclarativeFrontend::HotReload()
1091 {
1092 auto manager = GetPageRouterManager();
1093 CHECK_NULL_VOID(manager);
1094 manager->FlushFrontend();
1095 }
1096
1097 void DeclarativeFrontend::FlushReload()
1098 {
1099 if (jsEngine_) {
1100 jsEngine_->FlushReload();
1101 }
1102 }
1103
1104 void DeclarativeFrontend::DumpFrontend() const
1105 {
1106 if (!delegate_ || !DumpLog::GetInstance().GetDumpFile()) {
1107 return;
1108 }
1109
1110 bool unrestore = false;
1111 std::string name;
1112 std::string path;
1113 std::string params;
1114 int32_t stackSize = delegate_->GetStackSize();
1115 DumpLog::GetInstance().Print(0, "Router stack size " + std::to_string(stackSize));
1116 for (int32_t i = 1; i <= stackSize; ++i) {
1117 delegate_->GetRouterStateByIndex(i, name, path, params);
1118 unrestore = delegate_->IsUnrestoreByIndex(i);
1119 DumpLog::GetInstance().Print(1, "Page[" + std::to_string(i) + "], name: " + name);
1120 DumpLog::GetInstance().Print(2, "Path: " + path);
1121 DumpLog::GetInstance().Print(2, "Params: " + params);
1122 DumpLog::GetInstance().Print(2, "Unrestore: " + std::string(unrestore ? "yes" : "no"));
1123 if (i != stackSize) {
1124 continue;
1125 }
1126 DumpLog::GetInstance().Print(2, "Components: " + std::to_string(delegate_->GetComponentsCount()));
1127 }
1128 }
1129
1130 std::string DeclarativeFrontend::GetPagePath() const
1131 {
1132 if (!delegate_) {
1133 return "";
1134 }
1135 int32_t routerIndex = 0;
1136 std::string routerName;
1137 std::string routerPath;
1138 delegate_->GetState(routerIndex, routerName, routerPath);
1139 return routerPath + routerName;
1140 }
1141
1142 void DeclarativeFrontend::TriggerGarbageCollection()
1143 {
1144 if (jsEngine_) {
1145 jsEngine_->RunGarbageCollection();
1146 }
1147 }
1148
1149 void DeclarativeFrontend::DumpHeapSnapshot(bool isPrivate)
1150 {
1151 if (jsEngine_) {
1152 jsEngine_->DumpHeapSnapshot(isPrivate);
1153 }
1154 }
1155
1156 void DeclarativeFrontend::NotifyUIIdle()
1157 {
1158 if (jsEngine_) {
1159 jsEngine_->NotifyUIIdle();
1160 }
1161 }
1162
1163 void DeclarativeFrontend::SetColorMode(ColorMode colorMode)
1164 {
1165 if (delegate_) {
1166 delegate_->SetColorMode(colorMode);
1167 }
1168 }
1169
1170 void DeclarativeFrontend::RebuildAllPages()
1171 {
1172 if (delegate_) {
1173 delegate_->RebuildAllPages();
1174 }
1175 }
1176
1177 void DeclarativeFrontend::NotifyAppStorage(const std::string& key, const std::string& value)
1178 {
1179 if (!delegate_) {
1180 return;
1181 }
1182 delegate_->NotifyAppStorage(jsEngine_, key, value);
1183 }
1184
1185 void DeclarativeEventHandler::HandleAsyncEvent(const EventMarker& eventMarker)
1186 {
1187 LOGI("HandleAsyncEvent pageId: %{private}d, eventId: %{private}s, eventType: %{private}s",
1188 eventMarker.GetData().pageId, eventMarker.GetData().eventId.c_str(), eventMarker.GetData().eventType.c_str());
1189 std::string param = eventMarker.GetData().GetEventParam();
1190 if (eventMarker.GetData().isDeclarativeUi) {
1191 if (delegate_) {
1192 delegate_->GetUiTask().PostTask([eventMarker] { eventMarker.CallUiFunction(); }, "ArkUICallUiFunction");
1193 }
1194 } else {
1195 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param.append("null"), std::string(""));
1196 }
1197
1198 AccessibilityEvent accessibilityEvent;
1199 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1200 accessibilityEvent.eventType = eventMarker.GetData().eventType;
1201 delegate_->FireAccessibilityEvent(accessibilityEvent);
1202 }
1203
1204 void DeclarativeEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info)
1205 {
1206 std::string eventParam;
1207 if (eventMarker.GetData().eventType.find("touch") != std::string::npos) {
1208 TouchInfoToString(info, eventParam);
1209 } else if (eventMarker.GetData().eventType.find("mouse") != std::string::npos) {
1210 MouseInfoToString(info, eventParam);
1211 } else if (eventMarker.GetData().eventType == "swipe") {
1212 SwipeInfoToString(info, eventParam);
1213 }
1214 std::string param = eventMarker.GetData().GetEventParam();
1215 if (eventParam.empty()) {
1216 param.append("null");
1217 } else {
1218 param.append(eventParam);
1219 }
1220
1221 if (eventMarker.GetData().isDeclarativeUi) {
1222 if (delegate_) {
1223 auto cinfo = CopyEventInfo(info);
1224 delegate_->GetUiTask().PostTask(
1225 [eventMarker, cinfo] { eventMarker.CallUiArgFunction(cinfo.get()); }, "ArkUICallUiArgFunction");
1226 }
1227 } else {
1228 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
1229 }
1230
1231 AccessibilityEvent accessibilityEvent;
1232 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1233 accessibilityEvent.eventType = eventMarker.GetData().eventType;
1234 delegate_->FireAccessibilityEvent(accessibilityEvent);
1235 }
1236
1237 void DeclarativeEventHandler::HandleAsyncEvent(
1238 const EventMarker& eventMarker, const std::shared_ptr<BaseEventInfo>& info)
1239 {
1240 if (eventMarker.GetData().isDeclarativeUi) {
1241 if (delegate_) {
1242 delegate_->GetUiTask().PostTask(
1243 [eventMarker, info] { eventMarker.CallUiArgFunction(info.get()); }, "ArkUICallUiArgFunction");
1244 }
1245 }
1246 }
1247
1248 void DeclarativeEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result)
1249 {
1250 std::string param = std::string("\"")
1251 .append(eventMarker.GetData().eventType)
1252 .append("\",{\"code\":")
1253 .append(std::to_string(static_cast<int32_t>(info.code)))
1254 .append(",\"action\":")
1255 .append(std::to_string(static_cast<int32_t>(info.action)))
1256 .append(",\"repeatCount\":")
1257 .append(std::to_string(static_cast<int32_t>(info.repeatTime)))
1258 .append(",\"timestamp\":")
1259 .append(std::to_string(info.timeStamp.time_since_epoch().count()))
1260 .append(",\"key\":\"")
1261 .append(info.key)
1262 .append("\"},");
1263
1264 result = delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, "");
1265
1266 AccessibilityEvent accessibilityEvent;
1267 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1268 accessibilityEvent.eventType = std::to_string(static_cast<int32_t>(info.code));
1269 delegate_->FireAccessibilityEvent(accessibilityEvent);
1270 }
1271
1272 void DeclarativeEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, int32_t param)
1273 {
1274 AccessibilityEvent accessibilityEvent;
1275 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1276 accessibilityEvent.eventType = eventMarker.GetData().eventType;
1277 delegate_->FireAccessibilityEvent(accessibilityEvent);
1278 }
1279
1280 void DeclarativeEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info)
1281 {
1282 AccessibilityEvent accessibilityEvent;
1283 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1284 accessibilityEvent.eventType = eventMarker.GetData().eventType;
1285 delegate_->FireAccessibilityEvent(accessibilityEvent);
1286 }
1287
1288 void DeclarativeEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param)
1289 {
1290 if (eventMarker.GetData().isDeclarativeUi) {
1291 std::string fixParam(param);
1292 std::string::size_type startPos = param.find_first_of("{");
1293 std::string::size_type endPos = param.find_last_of("}");
1294 if (startPos != std::string::npos && endPos != std::string::npos && startPos < endPos) {
1295 fixParam = fixParam.substr(startPos, endPos - startPos + 1);
1296 }
1297 if (delegate_) {
1298 delegate_->GetUiTask().PostTask(
1299 [eventMarker, fixParam] { eventMarker.CallUiStrFunction(fixParam); }, "ArkUICallUiStrFunction");
1300 }
1301 } else {
1302 delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
1303 }
1304
1305 AccessibilityEvent accessibilityEvent;
1306 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1307 accessibilityEvent.eventType = eventMarker.GetData().eventType;
1308 delegate_->FireAccessibilityEvent(accessibilityEvent);
1309 }
1310
1311 void DeclarativeEventHandler::HandleSyncEvent(const EventMarker& eventMarker, bool& result)
1312 {
1313 AccessibilityEvent accessibilityEvent;
1314 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1315 accessibilityEvent.eventType = eventMarker.GetData().eventType;
1316 delegate_->FireAccessibilityEvent(accessibilityEvent);
1317 }
1318
1319 void DeclarativeEventHandler::HandleSyncEvent(
1320 const EventMarker& eventMarker, const std::shared_ptr<BaseEventInfo>& info)
1321 {
1322 if (delegate_) {
1323 delegate_->GetUiTask().PostSyncTask(
1324 [eventMarker, info] { eventMarker.CallUiArgFunction(info.get()); }, "ArkUICallUiArgFunction");
1325 }
1326 }
1327
1328 void DeclarativeEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result)
1329 {
1330 AccessibilityEvent accessibilityEvent;
1331 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1332 accessibilityEvent.eventType = eventMarker.GetData().eventType;
1333 delegate_->FireAccessibilityEvent(accessibilityEvent);
1334 }
1335
1336 void DeclarativeEventHandler::HandleSyncEvent(
1337 const EventMarker& eventMarker, const std::string& param, std::string& result)
1338 {
1339 AccessibilityEvent accessibilityEvent;
1340 accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1341 accessibilityEvent.eventType = eventMarker.GetData().eventType;
1342 delegate_->FireAccessibilityEvent(accessibilityEvent);
1343 delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, std::string(""), result);
1344 }
1345
1346 void DeclarativeEventHandler::HandleSyncEvent(
1347 const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId, const bool isDestroy)
1348 {
1349 if (delegate_) {
1350 delegate_->FireExternalEvent(eventMarker.GetData().eventId, componentId, nodeId, isDestroy);
1351 }
1352 }
1353
1354 } // namespace OHOS::Ace
1355