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