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