• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "frameworks/bridge/declarative_frontend/declarative_frontend.h"
17 
18 #include <memory>
19 
20 #include "base/log/dump_log.h"
21 #include "base/log/event_report.h"
22 #include "base/utils/utils.h"
23 #include "core/common/ace_page.h"
24 #include "core/common/container.h"
25 #include "core/common/thread_checker.h"
26 #include "core/components/navigator/navigator_component.h"
27 #include "frameworks/bridge/card_frontend/form_frontend_delegate_declarative.h"
28 #include "frameworks/bridge/declarative_frontend/engine/quickjs/qjs_declarative_engine.h"
29 
30 namespace OHOS::Ace {
31 namespace {
32 
33 /*
34  * NOTE:
35  * This function is needed to copy the values from BaseEventInfo
36  * It is observed, that the owner of BaseEventInfo will delete the pointer before it is ultimately
37  * processed by the EventMarker callback. In order to avoid this, a copy of all data needs to be made.
38  */
CopyEventInfo(const BaseEventInfo & info)39 std::shared_ptr<BaseEventInfo> CopyEventInfo(const BaseEventInfo& info)
40 {
41     const auto* touchInfo = TypeInfoHelper::DynamicCast<TouchEventInfo>(&info);
42     if (touchInfo != nullptr) {
43         return std::make_shared<TouchEventInfo>(*touchInfo);
44     }
45 
46     const auto* dragStartInfo = TypeInfoHelper::DynamicCast<DragStartInfo>(&info);
47     if (dragStartInfo != nullptr) {
48         return std::make_shared<DragStartInfo>(*dragStartInfo);
49     }
50 
51     const auto* dragUpdateInfo = TypeInfoHelper::DynamicCast<DragUpdateInfo>(&info);
52     if (dragUpdateInfo != nullptr) {
53         return std::make_shared<DragUpdateInfo>(*dragUpdateInfo);
54     }
55 
56     const auto* dragEndInfo = TypeInfoHelper::DynamicCast<DragEndInfo>(&info);
57     if (dragEndInfo != nullptr) {
58         return std::make_shared<DragEndInfo>(*dragEndInfo);
59     }
60 
61     const auto* clickInfo = TypeInfoHelper::DynamicCast<ClickInfo>(&info);
62     if (clickInfo != nullptr) {
63         return std::make_shared<ClickInfo>(*clickInfo);
64     }
65     return nullptr;
66 }
67 
TouchInfoToString(const BaseEventInfo & info,std::string & eventParam)68 void TouchInfoToString(const BaseEventInfo& info, std::string& eventParam)
69 {
70     eventParam.append("{\"touches\":[{");
71     const auto touchInfo = TypeInfoHelper::DynamicCast<TouchEventInfo>(&info);
72     if (touchInfo) {
73         auto touchList = touchInfo->GetTouches();
74         for (const auto& location : touchList) {
75             auto globalLocation = location.GetGlobalLocation();
76             eventParam.append("\"globalX\":")
77                 .append(std::to_string(globalLocation.GetX()))
78                 .append(",\"globalY\":")
79                 .append(std::to_string(globalLocation.GetY()))
80                 .append(",");
81             auto localLocation = location.GetLocalLocation();
82             eventParam.append("\"localX\":")
83                 .append(std::to_string(localLocation.GetX()))
84                 .append(",\"localY\":")
85                 .append(std::to_string(localLocation.GetY()))
86                 .append(",");
87             eventParam.append("\"size\":").append(std::to_string(location.GetSize())).append(",");
88         }
89         if (eventParam.back() == ',') {
90             eventParam.pop_back();
91         }
92         eventParam.append("}],\"changedTouches\":[{");
93         auto changeTouch = touchInfo->GetChangedTouches();
94         for (const auto& change : changeTouch) {
95             auto globalLocation = change.GetGlobalLocation();
96             eventParam.append("\"globalX\":")
97                 .append(std::to_string(globalLocation.GetX()))
98                 .append(",\"globalY\":")
99                 .append(std::to_string(globalLocation.GetY()))
100                 .append(",");
101             auto localLocation = change.GetLocalLocation();
102             eventParam.append("\"localX\":")
103                 .append(std::to_string(localLocation.GetX()))
104                 .append(",\"localY\":")
105                 .append(std::to_string(localLocation.GetY()))
106                 .append(",");
107             eventParam.append("\"size\":").append(std::to_string(change.GetSize())).append(",");
108         }
109         if (eventParam.back() == ',') {
110             eventParam.pop_back();
111         }
112     }
113     eventParam.append("}]}");
114 }
115 
MouseInfoToString(const BaseEventInfo & info,std::string & eventParam)116 void MouseInfoToString(const BaseEventInfo& info, std::string& eventParam)
117 {
118     const auto mouseInfo = TypeInfoHelper::DynamicCast<MouseEventInfo>(&info);
119     eventParam.append("{\"mouse\":{");
120     if (mouseInfo) {
121         auto globalMouse = mouseInfo->GetGlobalMouse();
122         eventParam.append("\"globalX\":")
123             .append(std::to_string(globalMouse.x))
124             .append(",\"globalY\":")
125             .append(std::to_string(globalMouse.y))
126             .append(",\"globalZ\":")
127             .append(std::to_string(globalMouse.z))
128             .append(",\"localX\":")
129             .append(std::to_string(globalMouse.x))
130             .append(",\"localY\":")
131             .append(std::to_string(globalMouse.y))
132             .append(",\"localZ\":")
133             .append(std::to_string(globalMouse.z))
134             .append(",\"deltaX\":")
135             .append(std::to_string(globalMouse.deltaX))
136             .append(",\"deltaY\":")
137             .append(std::to_string(globalMouse.deltaY))
138             .append(",\"deltaZ\":")
139             .append(std::to_string(globalMouse.deltaZ))
140             .append(",\"scrollX\":")
141             .append(std::to_string(globalMouse.scrollX))
142             .append(",\"scrollY\":")
143             .append(std::to_string(globalMouse.scrollY))
144             .append(",\"scrollZ\":")
145             .append(std::to_string(globalMouse.scrollZ))
146             .append(",\"action\":")
147             .append(std::to_string(static_cast<int32_t>(globalMouse.action)))
148             .append(",\"button\":")
149             .append(std::to_string(static_cast<int32_t>(globalMouse.button)))
150             .append(",\"pressedButtons\":")
151             .append(std::to_string(globalMouse.pressedButtons));
152     }
153     eventParam.append("}}");
154 }
155 
SwipeInfoToString(const BaseEventInfo & info,std::string & eventParam)156 void SwipeInfoToString(const BaseEventInfo& info, std::string& eventParam)
157 {
158     const auto& swipeInfo = TypeInfoHelper::DynamicCast<SwipeEventInfo>(&info);
159     eventParam = swipeInfo->ToJsonParamInfo();
160 }
161 
162 } // namespace
163 
~DeclarativeFrontend()164 DeclarativeFrontend::~DeclarativeFrontend() noexcept
165 {
166     LOG_DESTROY();
167 }
168 
Destroy()169 void DeclarativeFrontend::Destroy()
170 {
171     CHECK_RUN_ON(JS);
172     LOGI("DeclarativeFrontend Destroy begin.");
173     // To guarantee the jsEngine_ and delegate_ released in js thread
174     delegate_.Reset();
175     handler_.Reset();
176     if (jsEngine_) {
177         jsEngine_->Destroy();
178     }
179     jsEngine_.Reset();
180     LOGI("DeclarativeFrontend Destroy end.");
181 }
182 
Initialize(FrontendType type,const RefPtr<TaskExecutor> & taskExecutor)183 bool DeclarativeFrontend::Initialize(FrontendType type, const RefPtr<TaskExecutor>& taskExecutor)
184 {
185     LOGD("DeclarativeFrontend initialize begin.");
186     type_ = type;
187     ACE_DCHECK(type_ == FrontendType::DECLARATIVE_JS);
188     InitializeFrontendDelegate(taskExecutor);
189 
190     bool needPostJsTask = true;
191     auto container = Container::Current();
192     if (container) {
193         const auto& setting = container->GetSettings();
194         needPostJsTask = !(setting.usePlatformAsUIThread && setting.useUIAsJSThread);
195     }
196     auto initJSEngineTask = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_), delegate = delegate_] {
197         auto jsEngine = weakEngine.Upgrade();
198         if (!jsEngine) {
199             return;
200         }
201         jsEngine->Initialize(delegate);
202     };
203     if (needPostJsTask) {
204         taskExecutor->PostTask(initJSEngineTask, TaskExecutor::TaskType::JS);
205     } else {
206         initJSEngineTask();
207     }
208 
209     LOGD("DeclarativeFrontend initialize end.");
210     return true;
211 }
212 
AttachPipelineContext(const RefPtr<PipelineBase> & context)213 void DeclarativeFrontend::AttachPipelineContext(const RefPtr<PipelineBase>& context)
214 {
215     LOGD("DeclarativeFrontend AttachPipelineContext.");
216     if (!delegate_) {
217         return;
218     }
219     handler_ = AceType::MakeRefPtr<DeclarativeEventHandler>(delegate_);
220     auto pipelineContext = AceType::DynamicCast<PipelineContext>(context);
221     if (pipelineContext) {
222         pipelineContext->RegisterEventHandler(handler_);
223     }
224     delegate_->AttachPipelineContext(context);
225 }
226 
AttachSubPipelineContext(const RefPtr<PipelineContext> & context)227 void DeclarativeFrontend::AttachSubPipelineContext(const RefPtr<PipelineContext>& context)
228 {
229     LOGI("DeclarativeFrontend AttachSubPipelineContext.");
230     if (!context) {
231         return;
232     }
233     context->RegisterEventHandler(handler_);
234 }
235 
SetAssetManager(const RefPtr<AssetManager> & assetManager)236 void DeclarativeFrontend::SetAssetManager(const RefPtr<AssetManager>& assetManager)
237 {
238     LOGI("DeclarativeFrontend SetAssetManager.");
239     if (delegate_) {
240         delegate_->SetAssetManager(assetManager);
241     }
242 }
243 
InitializeFrontendDelegate(const RefPtr<TaskExecutor> & taskExecutor)244 void DeclarativeFrontend::InitializeFrontendDelegate(const RefPtr<TaskExecutor>& taskExecutor)
245 {
246     const auto& loadCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const std::string& url,
247                                    const RefPtr<Framework::JsAcePage>& jsPage, bool isMainPage) {
248         auto jsEngine = weakEngine.Upgrade();
249         if (!jsEngine) {
250             return;
251         }
252         jsEngine->LoadJs(url, jsPage, isMainPage);
253     };
254 
255     const auto& setPluginMessageTransferCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
256                                                        const RefPtr<JsMessageDispatcher>& dispatcher) {
257         auto jsEngine = weakEngine.Upgrade();
258         if (!jsEngine) {
259             return;
260         }
261         jsEngine->SetJsMessageDispatcher(dispatcher);
262     };
263 
264     const auto& asyncEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
265                                          const std::string& eventId, const std::string& param) {
266         auto jsEngine = weakEngine.Upgrade();
267         if (!jsEngine) {
268             return;
269         }
270         jsEngine->FireAsyncEvent(eventId, param);
271     };
272 
273     const auto& syncEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
274                                         const std::string& eventId, const std::string& param) {
275         auto jsEngine = weakEngine.Upgrade();
276         if (!jsEngine) {
277             return;
278         }
279         jsEngine->FireSyncEvent(eventId, param);
280     };
281 
282     const auto& updatePageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
283                                          const RefPtr<Framework::JsAcePage>& jsPage) {
284         auto jsEngine = weakEngine.Upgrade();
285         if (!jsEngine) {
286             return;
287         }
288         jsEngine->UpdateRunningPage(jsPage);
289         jsEngine->UpdateStagingPage(jsPage);
290     };
291 
292     const auto& resetStagingPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
293         auto jsEngine = weakEngine.Upgrade();
294         if (!jsEngine) {
295             return;
296         }
297         jsEngine->ResetStagingPage();
298     };
299 
300     const auto& destroyPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](int32_t pageId) {
301         auto jsEngine = weakEngine.Upgrade();
302         if (!jsEngine) {
303             return;
304         }
305         jsEngine->DestroyPageInstance(pageId);
306     };
307 
308     const auto& destroyApplicationCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
309                                                  const std::string& packageName) {
310         auto jsEngine = weakEngine.Upgrade();
311         if (!jsEngine) {
312             return;
313         }
314         jsEngine->DestroyApplication(packageName);
315     };
316 
317     const auto& updateApplicationStateCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
318                                                      const std::string& packageName, Frontend::State state) {
319         auto jsEngine = weakEngine.Upgrade();
320         if (!jsEngine) {
321             return;
322         }
323         jsEngine->UpdateApplicationState(packageName, state);
324     };
325 
326     const auto& onWindowDisplayModeChangedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
327                                                          bool isShownInMultiWindow, const std::string& data) {
328         auto jsEngine = weakEngine.Upgrade();
329         if (!jsEngine) {
330             return;
331         }
332         jsEngine->OnWindowDisplayModeChanged(isShownInMultiWindow, data);
333     };
334 
335     const auto& onSaveAbilityStateCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](std::string& data) {
336         auto jsEngine = weakEngine.Upgrade();
337         if (!jsEngine) {
338             LOGE("the js engine is nullptr");
339             return;
340         }
341         jsEngine->OnSaveAbilityState(data);
342     };
343     const auto& onRestoreAbilityStateCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
344                                                     const std::string& data) {
345         auto jsEngine = weakEngine.Upgrade();
346         if (!jsEngine) {
347             LOGE("the js engine is nullptr");
348             return;
349         }
350         jsEngine->OnRestoreAbilityState(data);
351     };
352 
353     const auto& onNewWantCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const std::string& data) {
354         auto jsEngine = weakEngine.Upgrade();
355         if (!jsEngine) {
356             LOGE("the js engine is nullptr");
357             return;
358         }
359         jsEngine->OnNewWant(data);
360     };
361 
362     const auto& onConfigurationUpdatedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
363                                                      const std::string& data) {
364         auto jsEngine = weakEngine.Upgrade();
365         if (!jsEngine) {
366             return;
367         }
368         jsEngine->OnConfigurationUpdated(data);
369     };
370 
371     const auto& timerCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
372                                     const std::string& callbackId, const std::string& delay, bool isInterval) {
373         auto jsEngine = weakEngine.Upgrade();
374         if (!jsEngine) {
375             return;
376         }
377         jsEngine->TimerCallback(callbackId, delay, isInterval);
378     };
379 
380     const auto& mediaQueryCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
381                                          const std::string& callbackId, const std::string& args) {
382         auto jsEngine = weakEngine.Upgrade();
383         if (!jsEngine) {
384             return;
385         }
386         jsEngine->MediaQueryCallback(callbackId, args);
387     };
388 
389     const auto& requestAnimationCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
390                                                const std::string& callbackId, uint64_t timeStamp) {
391         auto jsEngine = weakEngine.Upgrade();
392         if (!jsEngine) {
393             return;
394         }
395         jsEngine->RequestAnimationCallback(callbackId, timeStamp);
396     };
397 
398     const auto& jsCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
399                                  const std::string& callbackId, const std::string& args) {
400         auto jsEngine = weakEngine.Upgrade();
401         if (!jsEngine) {
402             return;
403         }
404         jsEngine->JsCallback(callbackId, args);
405     };
406 
407     const auto& onMemoryLevelCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const int32_t level) {
408         auto jsEngine = weakEngine.Upgrade();
409         if (!jsEngine) {
410             return;
411         }
412         jsEngine->OnMemoryLevel(level);
413     };
414 
415     const auto& onStartContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() -> bool {
416         auto jsEngine = weakEngine.Upgrade();
417         if (!jsEngine) {
418             return false;
419         }
420         return jsEngine->OnStartContinuation();
421     };
422     const auto& onCompleteContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](int32_t code) {
423         auto jsEngine = weakEngine.Upgrade();
424         if (!jsEngine) {
425             return;
426         }
427         jsEngine->OnCompleteContinuation(code);
428     };
429     const auto& onRemoteTerminatedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
430         auto jsEngine = weakEngine.Upgrade();
431         if (!jsEngine) {
432             return;
433         }
434         jsEngine->OnRemoteTerminated();
435     };
436     const auto& onSaveDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](std::string& savedData) {
437         auto jsEngine = weakEngine.Upgrade();
438         if (!jsEngine) {
439             return;
440         }
441         jsEngine->OnSaveData(savedData);
442     };
443     const auto& onRestoreDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
444                                             const std::string& data) -> bool {
445         auto jsEngine = weakEngine.Upgrade();
446         if (!jsEngine) {
447             return false;
448         }
449         return jsEngine->OnRestoreData(data);
450     };
451 
452     const auto& externalEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
453                                             const std::string& componentId, const uint32_t nodeId,
454                                             const bool isDestroy) {
455         auto jsEngine = weakEngine.Upgrade();
456         if (!jsEngine) {
457             return;
458         }
459         jsEngine->FireExternalEvent(componentId, nodeId, isDestroy);
460     };
461 
462     if (isFormRender_) {
463         LOGI("Init Form Delegate");
464         delegate_ = AceType::MakeRefPtr<Framework::FormFrontendDelegateDeclarative>(taskExecutor, loadCallback,
465             setPluginMessageTransferCallback, asyncEventCallback, syncEventCallback, updatePageCallback,
466             resetStagingPageCallback, destroyPageCallback, destroyApplicationCallback, updateApplicationStateCallback,
467             timerCallback, mediaQueryCallback, requestAnimationCallback, jsCallback,
468             onWindowDisplayModeChangedCallBack, onConfigurationUpdatedCallBack, onSaveAbilityStateCallBack,
469             onRestoreAbilityStateCallBack, onNewWantCallBack,
470             onMemoryLevelCallBack, onStartContinuationCallBack, onCompleteContinuationCallBack,
471             onRemoteTerminatedCallBack, onSaveDataCallBack, onRestoreDataCallBack, externalEventCallback);
472     } else {
473         delegate_ = AceType::MakeRefPtr<Framework::FrontendDelegateDeclarative>(taskExecutor, loadCallback,
474             setPluginMessageTransferCallback, asyncEventCallback, syncEventCallback, updatePageCallback,
475             resetStagingPageCallback, destroyPageCallback, destroyApplicationCallback, updateApplicationStateCallback,
476             timerCallback, mediaQueryCallback, requestAnimationCallback, jsCallback,
477             onWindowDisplayModeChangedCallBack, onConfigurationUpdatedCallBack, onSaveAbilityStateCallBack,
478             onRestoreAbilityStateCallBack, onNewWantCallBack, onMemoryLevelCallBack, onStartContinuationCallBack,
479             onCompleteContinuationCallBack, onRemoteTerminatedCallBack,
480             onSaveDataCallBack, onRestoreDataCallBack, externalEventCallback);
481     }
482 
483     if (disallowPopLastPage_) {
484         delegate_->DisallowPopLastPage();
485     }
486     if (!jsEngine_) {
487         LOGE("the js engine is nullptr");
488         EventReport::SendAppStartException(AppStartExcepType::JS_ENGINE_CREATE_ERR);
489         return;
490     }
491     delegate_->SetGroupJsBridge(jsEngine_->GetGroupJsBridge());
492     if (Container::IsCurrentUseNewPipeline()) {
493         auto loadPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const std::string& url,
494             const std::function<void(const std::string&, int32_t)>& errorCallback) {
495             auto jsEngine = weakEngine.Upgrade();
496             if (!jsEngine) {
497                 return false;
498             }
499             return jsEngine->LoadPageSource(url, errorCallback);
500         };
501         delegate_->InitializeRouterManager(std::move(loadPageCallback));
502     }
503 }
504 
RunPage(int32_t pageId,const std::string & url,const std::string & params)505 void DeclarativeFrontend::RunPage(int32_t pageId, const std::string& url, const std::string& params)
506 {
507     auto container = Container::Current();
508     auto isStageModel = container ? container->IsUseStageModel() : false;
509     if (!isStageModel && Container::IsCurrentUseNewPipeline()) {
510         // In NG structure and fa mode, first load app.js
511         auto taskExecutor = container ? container->GetTaskExecutor() : nullptr;
512         CHECK_NULL_VOID(taskExecutor);
513         taskExecutor->PostTask(
514             [weak = AceType::WeakClaim(this)]() {
515                 auto frontend = weak.Upgrade();
516                 CHECK_NULL_VOID(frontend);
517                 CHECK_NULL_VOID(frontend->jsEngine_);
518                 frontend->jsEngine_->LoadFaAppSource();
519             },
520             TaskExecutor::TaskType::JS);
521     }
522     // Not use this pageId from backend, manage it in FrontendDelegateDeclarative.
523     if (delegate_) {
524         if (isFormRender_) {
525             auto delegate = AceType::DynamicCast<Framework::FormFrontendDelegateDeclarative>(delegate_);
526             delegate->RunCard(url, params, pageProfile_, 0);
527         } else {
528             delegate_->RunPage(url, params, pageProfile_);
529         }
530     }
531 }
532 
ReplacePage(const std::string & url,const std::string & params)533 void DeclarativeFrontend::ReplacePage(const std::string& url, const std::string& params)
534 {
535     if (delegate_) {
536         delegate_->Replace(url, params);
537     }
538 }
539 
PushPage(const std::string & url,const std::string & params)540 void DeclarativeFrontend::PushPage(const std::string& url, const std::string& params)
541 {
542     if (delegate_) {
543         delegate_->Push(url, params);
544     }
545 }
546 
NavigatePage(uint8_t type,const PageTarget & target,const std::string & params)547 void DeclarativeFrontend::NavigatePage(uint8_t type, const PageTarget& target, const std::string& params)
548 {
549     if (!delegate_) {
550         return;
551     }
552     switch (static_cast<NavigatorType>(type)) {
553         case NavigatorType::PUSH:
554             delegate_->Push(target, params);
555             break;
556         case NavigatorType::REPLACE:
557             delegate_->Replace(target, params);
558             break;
559         case NavigatorType::BACK:
560             delegate_->BackWithTarget(target, params);
561             break;
562         default:
563             LOGE("Navigator type is invalid!");
564             delegate_->BackWithTarget(target, params);
565     }
566 }
567 
GetCurrentPageUrl() const568 std::string DeclarativeFrontend::GetCurrentPageUrl() const
569 {
570     CHECK_NULL_RETURN(delegate_, "");
571     return delegate_->GetCurrentPageUrl();
572 }
573 
574 // Get the currently running JS page information in NG structure.
GetCurrentPageSourceMap() const575 RefPtr<Framework::RevSourceMap> DeclarativeFrontend::GetCurrentPageSourceMap() const
576 {
577     CHECK_NULL_RETURN(delegate_, nullptr);
578     return delegate_->GetCurrentPageSourceMap();
579 }
580 
581 // Get the currently running JS page information in NG structure.
GetFaAppSourceMap() const582 RefPtr<Framework::RevSourceMap> DeclarativeFrontend::GetFaAppSourceMap() const
583 {
584     CHECK_NULL_RETURN(delegate_, nullptr);
585     return delegate_->GetFaAppSourceMap();
586 }
587 
GetStageSourceMap(std::unordered_map<std::string,RefPtr<Framework::RevSourceMap>> & sourceMap) const588 void DeclarativeFrontend::GetStageSourceMap(
589     std::unordered_map<std::string, RefPtr<Framework::RevSourceMap>>& sourceMap) const
590 {
591     if (delegate_) {
592         delegate_->GetStageSourceMap(sourceMap);
593     }
594 }
595 
GetPageRouterManager() const596 RefPtr<NG::PageRouterManager> DeclarativeFrontend::GetPageRouterManager() const
597 {
598     CHECK_NULL_RETURN(delegate_, nullptr);
599     return delegate_->GetPageRouterManager();
600 }
601 
RestoreRouterStack(const std::string & contentInfo)602 std::string DeclarativeFrontend::RestoreRouterStack(const std::string& contentInfo)
603 {
604     if (delegate_) {
605         return delegate_->RestoreRouterStack(contentInfo);
606     }
607     return "";
608 }
609 
GetContentInfo() const610 std::string DeclarativeFrontend::GetContentInfo() const
611 {
612     if (delegate_) {
613         return delegate_->GetContentInfo();
614     }
615     return "";
616 }
617 
GetRouterSize() const618 int32_t DeclarativeFrontend::GetRouterSize() const
619 {
620     if (delegate_) {
621         return delegate_->GetStackSize();
622     }
623     return -1;
624 }
625 
SendCallbackMessage(const std::string & callbackId,const std::string & data) const626 void DeclarativeFrontend::SendCallbackMessage(const std::string& callbackId, const std::string& data) const
627 {
628     if (delegate_) {
629         delegate_->OnJSCallback(callbackId, data);
630     }
631 }
632 
SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher> & dispatcher) const633 void DeclarativeFrontend::SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher>& dispatcher) const
634 {
635     if (delegate_) {
636         delegate_->SetJsMessageDispatcher(dispatcher);
637     }
638 }
639 
TransferComponentResponseData(int callbackId,int32_t code,std::vector<uint8_t> && data) const640 void DeclarativeFrontend::TransferComponentResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
641 {
642     if (delegate_) {
643         delegate_->TransferComponentResponseData(callbackId, code, std::move(data));
644     }
645 }
646 
TransferJsResponseData(int callbackId,int32_t code,std::vector<uint8_t> && data) const647 void DeclarativeFrontend::TransferJsResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
648 {
649     if (delegate_) {
650         delegate_->TransferJsResponseData(callbackId, code, std::move(data));
651     }
652 }
653 
654 #if defined(PREVIEW)
TransferJsResponseDataPreview(int callbackId,int32_t code,ResponseData responseData) const655 void DeclarativeFrontend::TransferJsResponseDataPreview(int callbackId, int32_t code, ResponseData responseData) const
656 {
657     delegate_->TransferJsResponseDataPreview(callbackId, code, responseData);
658 }
659 
GetNewComponentWithJsCode(const std::string & jsCode,const std::string & viewID)660 RefPtr<Component> DeclarativeFrontend::GetNewComponentWithJsCode(const std::string& jsCode, const std::string& viewID)
661 {
662     if (jsEngine_) {
663         return jsEngine_->GetNewComponentWithJsCode(jsCode, viewID);
664     }
665     return nullptr;
666 }
667 #endif
668 
TransferJsPluginGetError(int callbackId,int32_t errorCode,std::string && errorMessage) const669 void DeclarativeFrontend::TransferJsPluginGetError(int callbackId, int32_t errorCode, std::string&& errorMessage) const
670 {
671     if (delegate_) {
672         delegate_->TransferJsPluginGetError(callbackId, errorCode, std::move(errorMessage));
673     }
674 }
675 
TransferJsEventData(int32_t callbackId,int32_t code,std::vector<uint8_t> && data) const676 void DeclarativeFrontend::TransferJsEventData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const
677 {
678     if (delegate_) {
679         delegate_->TransferJsEventData(callbackId, code, std::move(data));
680     }
681 }
682 
LoadPluginJsCode(std::string && jsCode) const683 void DeclarativeFrontend::LoadPluginJsCode(std::string&& jsCode) const
684 {
685     if (delegate_) {
686         delegate_->LoadPluginJsCode(std::move(jsCode));
687     }
688 }
689 
LoadPluginJsByteCode(std::vector<uint8_t> && jsCode,std::vector<int32_t> && jsCodeLen) const690 void DeclarativeFrontend::LoadPluginJsByteCode(std::vector<uint8_t>&& jsCode, std::vector<int32_t>&& jsCodeLen) const
691 {
692     if (delegate_) {
693         delegate_->LoadPluginJsByteCode(std::move(jsCode), std::move(jsCodeLen));
694     }
695 }
696 
UpdateState(Frontend::State state)697 void DeclarativeFrontend::UpdateState(Frontend::State state)
698 {
699     if (!delegate_ || state == Frontend::State::ON_CREATE) {
700         return;
701     }
702     bool needPostJsTask = true;
703     auto container = Container::Current();
704     CHECK_NULL_VOID(container);
705     const auto& setting = container->GetSettings();
706     needPostJsTask = !(setting.usePlatformAsUIThread && setting.useUIAsJSThread);
707     if (needPostJsTask) {
708         delegate_->UpdateApplicationState(delegate_->GetAppID(), state);
709         return;
710     }
711     if (jsEngine_) {
712         jsEngine_->UpdateApplicationState(delegate_->GetAppID(), state);
713     }
714 }
715 
OnWindowDisplayModeChanged(bool isShownInMultiWindow,const std::string & data)716 void DeclarativeFrontend::OnWindowDisplayModeChanged(bool isShownInMultiWindow, const std::string& data)
717 {
718     delegate_->OnWindowDisplayModeChanged(isShownInMultiWindow, data);
719 }
720 
OnSaveAbilityState(std::string & data)721 void DeclarativeFrontend::OnSaveAbilityState(std::string& data)
722 {
723     if (delegate_) {
724         delegate_->OnSaveAbilityState(data);
725     }
726 }
727 
OnRestoreAbilityState(const std::string & data)728 void DeclarativeFrontend::OnRestoreAbilityState(const std::string& data)
729 {
730     if (delegate_) {
731         delegate_->OnRestoreAbilityState(data);
732     }
733 }
734 
OnNewWant(const std::string & data)735 void DeclarativeFrontend::OnNewWant(const std::string& data)
736 {
737     if (delegate_) {
738         delegate_->OnNewWant(data);
739     }
740 }
741 
GetAccessibilityManager() const742 RefPtr<AccessibilityManager> DeclarativeFrontend::GetAccessibilityManager() const
743 {
744     if (!delegate_) {
745         LOGE("GetAccessibilityManager delegate is null");
746         return nullptr;
747     }
748     return delegate_->GetJSAccessibilityManager();
749 }
750 
GetWindowConfig()751 WindowConfig& DeclarativeFrontend::GetWindowConfig()
752 {
753     if (!delegate_) {
754         static WindowConfig windowConfig;
755         LOGW("delegate is null, return default config");
756         return windowConfig;
757     }
758     return delegate_->GetWindowConfig();
759 }
760 
OnBackPressed()761 bool DeclarativeFrontend::OnBackPressed()
762 {
763     if (!delegate_) {
764         LOGW("delegate is null, return false");
765         return false;
766     }
767     return delegate_->OnPageBackPress();
768 }
769 
OnShow()770 void DeclarativeFrontend::OnShow()
771 {
772     if (delegate_) {
773         foregroundFrontend_ = true;
774         delegate_->OnForeground();
775     }
776 }
777 
OnHide()778 void DeclarativeFrontend::OnHide()
779 {
780     if (delegate_) {
781         delegate_->OnBackGround();
782         foregroundFrontend_ = false;
783     }
784 }
785 
OnConfigurationUpdated(const std::string & data)786 void DeclarativeFrontend::OnConfigurationUpdated(const std::string& data)
787 {
788     if (delegate_) {
789         delegate_->OnConfigurationUpdated(data);
790     }
791 }
792 
OnActive()793 void DeclarativeFrontend::OnActive()
794 {
795     if (delegate_) {
796         foregroundFrontend_ = true;
797         delegate_->InitializeAccessibilityCallback();
798     }
799 }
800 
OnInactive()801 void DeclarativeFrontend::OnInactive() {}
802 
OnStartContinuation()803 bool DeclarativeFrontend::OnStartContinuation()
804 {
805     if (!delegate_) {
806         LOGW("delegate is null, return false");
807         return false;
808     }
809     return delegate_->OnStartContinuation();
810 }
811 
OnCompleteContinuation(int32_t code)812 void DeclarativeFrontend::OnCompleteContinuation(int32_t code)
813 {
814     if (delegate_) {
815         delegate_->OnCompleteContinuation(code);
816     }
817 }
818 
OnMemoryLevel(const int32_t level)819 void DeclarativeFrontend::OnMemoryLevel(const int32_t level)
820 {
821     if (delegate_) {
822         delegate_->OnMemoryLevel(level);
823     }
824 }
825 
OnSaveData(std::string & data)826 void DeclarativeFrontend::OnSaveData(std::string& data)
827 {
828     if (delegate_) {
829         delegate_->OnSaveData(data);
830     }
831 }
832 
GetPluginsUsed(std::string & data)833 void DeclarativeFrontend::GetPluginsUsed(std::string& data)
834 {
835     if (delegate_) {
836         delegate_->GetPluginsUsed(data);
837     }
838 }
839 
OnRestoreData(const std::string & data)840 bool DeclarativeFrontend::OnRestoreData(const std::string& data)
841 {
842     if (!delegate_) {
843         LOGW("delegate is null, return false");
844         return false;
845     }
846     return delegate_->OnRestoreData(data);
847 }
848 
OnRemoteTerminated()849 void DeclarativeFrontend::OnRemoteTerminated()
850 {
851     if (delegate_) {
852         delegate_->OnRemoteTerminated();
853     }
854 }
855 
OnNewRequest(const std::string & data)856 void DeclarativeFrontend::OnNewRequest(const std::string& data)
857 {
858     if (delegate_) {
859         delegate_->OnNewRequest(data);
860     }
861 }
862 
CallRouterBack()863 void DeclarativeFrontend::CallRouterBack()
864 {
865     if (delegate_) {
866         if (delegate_->GetStackSize() == 1 && isSubWindow_) {
867             LOGW("Can't back because this is the last page of sub window!");
868             return;
869         }
870         delegate_->CallPopPage();
871     }
872 }
873 
OnSurfaceChanged(int32_t width,int32_t height)874 void DeclarativeFrontend::OnSurfaceChanged(int32_t width, int32_t height)
875 {
876     if (delegate_) {
877         delegate_->OnSurfaceChanged();
878     }
879 }
880 
HotReload()881 void DeclarativeFrontend::HotReload()
882 {
883     auto manager = GetPageRouterManager();
884     CHECK_NULL_VOID(manager);
885     manager->FlushFrontend();
886 }
887 
FlushReload()888 void DeclarativeFrontend::FlushReload()
889 {
890     if (jsEngine_) {
891         jsEngine_->FlushReload();
892     }
893 }
894 
DumpFrontend() const895 void DeclarativeFrontend::DumpFrontend() const
896 {
897     if (!delegate_) {
898         return;
899     }
900     int32_t routerIndex = 0;
901     std::string routerName;
902     std::string routerPath;
903     delegate_->GetState(routerIndex, routerName, routerPath);
904 
905     if (DumpLog::GetInstance().GetDumpFile()) {
906         DumpLog::GetInstance().AddDesc("Components: " + std::to_string(delegate_->GetComponentsCount()));
907         DumpLog::GetInstance().AddDesc("Path: " + routerPath);
908         DumpLog::GetInstance().AddDesc("Length: " + std::to_string(routerIndex));
909         DumpLog::GetInstance().Print(0, routerName, 0);
910     }
911 }
912 
GetPagePath() const913 std::string DeclarativeFrontend::GetPagePath() const
914 {
915     if (!delegate_) {
916         return "";
917     }
918     int32_t routerIndex = 0;
919     std::string routerName;
920     std::string routerPath;
921     delegate_->GetState(routerIndex, routerName, routerPath);
922     return routerPath + routerName;
923 }
924 
TriggerGarbageCollection()925 void DeclarativeFrontend::TriggerGarbageCollection()
926 {
927     if (jsEngine_) {
928         jsEngine_->RunGarbageCollection();
929     }
930 }
931 
DumpHeapSnapshot(bool isPrivate)932 void DeclarativeFrontend::DumpHeapSnapshot(bool isPrivate)
933 {
934     if (jsEngine_) {
935         jsEngine_->DumpHeapSnapshot(isPrivate);
936     }
937 }
938 
SetColorMode(ColorMode colorMode)939 void DeclarativeFrontend::SetColorMode(ColorMode colorMode)
940 {
941     if (delegate_) {
942         delegate_->SetColorMode(colorMode);
943     }
944 }
945 
RebuildAllPages()946 void DeclarativeFrontend::RebuildAllPages()
947 {
948     if (delegate_) {
949         delegate_->RebuildAllPages();
950     }
951 }
952 
NotifyAppStorage(const std::string & key,const std::string & value)953 void DeclarativeFrontend::NotifyAppStorage(const std::string& key, const std::string& value)
954 {
955     if (!delegate_) {
956         LOGW("delegate is null, return false");
957         return;
958     }
959     delegate_->NotifyAppStorage(jsEngine_, key, value);
960 }
961 
HandleAsyncEvent(const EventMarker & eventMarker)962 void DeclarativeEventHandler::HandleAsyncEvent(const EventMarker& eventMarker)
963 {
964     LOGI("HandleAsyncEvent pageId: %{private}d, eventId: %{private}s, eventType: %{private}s",
965         eventMarker.GetData().pageId, eventMarker.GetData().eventId.c_str(), eventMarker.GetData().eventType.c_str());
966     std::string param = eventMarker.GetData().GetEventParam();
967     if (eventMarker.GetData().isDeclarativeUi) {
968         if (delegate_) {
969             delegate_->GetUiTask().PostTask([eventMarker] { eventMarker.CallUiFunction(); });
970         }
971     } else {
972         delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param.append("null"), std::string(""));
973     }
974 
975     AccessibilityEvent accessibilityEvent;
976     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
977     accessibilityEvent.eventType = eventMarker.GetData().eventType;
978     delegate_->FireAccessibilityEvent(accessibilityEvent);
979 }
980 
HandleAsyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info)981 void DeclarativeEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info)
982 {
983     std::string eventParam;
984     if (eventMarker.GetData().eventType.find("touch") != std::string::npos) {
985         TouchInfoToString(info, eventParam);
986     } else if (eventMarker.GetData().eventType.find("mouse") != std::string::npos) {
987         MouseInfoToString(info, eventParam);
988     } else if (eventMarker.GetData().eventType == "swipe") {
989         SwipeInfoToString(info, eventParam);
990     }
991 
992     LOGD("HandleAsyncEvent pageId: %{public}d, eventId: %{public}s, eventType: %{public}s",
993         eventMarker.GetData().pageId, eventMarker.GetData().eventId.c_str(), eventMarker.GetData().eventType.c_str());
994     std::string param = eventMarker.GetData().GetEventParam();
995     if (eventParam.empty()) {
996         param.append("null");
997     } else {
998         param.append(eventParam);
999     }
1000 
1001     if (eventMarker.GetData().isDeclarativeUi) {
1002         if (delegate_) {
1003             auto cinfo = CopyEventInfo(info);
1004             delegate_->GetUiTask().PostTask([eventMarker, cinfo] { eventMarker.CallUiArgFunction(cinfo.get()); });
1005         }
1006     } else {
1007         delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
1008     }
1009 
1010     AccessibilityEvent accessibilityEvent;
1011     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1012     accessibilityEvent.eventType = eventMarker.GetData().eventType;
1013     delegate_->FireAccessibilityEvent(accessibilityEvent);
1014 }
1015 
HandleAsyncEvent(const EventMarker & eventMarker,const std::shared_ptr<BaseEventInfo> & info)1016 void DeclarativeEventHandler::HandleAsyncEvent(
1017     const EventMarker& eventMarker, const std::shared_ptr<BaseEventInfo>& info)
1018 {
1019     if (eventMarker.GetData().isDeclarativeUi) {
1020         if (delegate_) {
1021             delegate_->GetUiTask().PostTask([eventMarker, info] { eventMarker.CallUiArgFunction(info.get()); });
1022         }
1023     }
1024 }
1025 
HandleSyncEvent(const EventMarker & eventMarker,const KeyEvent & info,bool & result)1026 void DeclarativeEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result)
1027 {
1028     LOGD("HandleSyncEvent pageId: %{public}d, eventId: %{public}s, eventType: %{public}s", eventMarker.GetData().pageId,
1029         eventMarker.GetData().eventId.c_str(), eventMarker.GetData().eventType.c_str());
1030     std::string param = std::string("\"")
1031                             .append(eventMarker.GetData().eventType)
1032                             .append("\",{\"code\":")
1033                             .append(std::to_string(static_cast<int32_t>(info.code)))
1034                             .append(",\"action\":")
1035                             .append(std::to_string(static_cast<int32_t>(info.action)))
1036                             .append(",\"repeatCount\":")
1037                             .append(std::to_string(static_cast<int32_t>(info.repeatTime)))
1038                             .append(",\"timestamp\":")
1039                             .append(std::to_string(info.timeStamp.time_since_epoch().count()))
1040                             .append(",\"key\":\"")
1041                             .append(info.key)
1042                             .append("\"},");
1043 
1044     result = delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, "");
1045 
1046     AccessibilityEvent accessibilityEvent;
1047     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1048     accessibilityEvent.eventType = std::to_string(static_cast<int32_t>(info.code));
1049     delegate_->FireAccessibilityEvent(accessibilityEvent);
1050 }
1051 
HandleAsyncEvent(const EventMarker & eventMarker,int32_t param)1052 void DeclarativeEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, int32_t param)
1053 {
1054     LOGW("js event handler does not support this event type!");
1055     AccessibilityEvent accessibilityEvent;
1056     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1057     accessibilityEvent.eventType = eventMarker.GetData().eventType;
1058     delegate_->FireAccessibilityEvent(accessibilityEvent);
1059 }
1060 
HandleAsyncEvent(const EventMarker & eventMarker,const KeyEvent & info)1061 void DeclarativeEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info)
1062 {
1063     LOGW("js event handler does not support this event type!");
1064     AccessibilityEvent accessibilityEvent;
1065     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1066     accessibilityEvent.eventType = eventMarker.GetData().eventType;
1067     delegate_->FireAccessibilityEvent(accessibilityEvent);
1068 }
1069 
HandleAsyncEvent(const EventMarker & eventMarker,const std::string & param)1070 void DeclarativeEventHandler::HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param)
1071 {
1072     LOGD("HandleAsyncEvent pageId: %{public}d, eventId: %{public}s", eventMarker.GetData().pageId,
1073         eventMarker.GetData().eventId.c_str());
1074 
1075     if (eventMarker.GetData().isDeclarativeUi) {
1076         std::string fixParam(param);
1077         std::string::size_type startPos = param.find_first_of("{");
1078         std::string::size_type endPos = param.find_last_of("}");
1079         if (startPos != std::string::npos && endPos != std::string::npos && startPos < endPos) {
1080             fixParam = fixParam.substr(startPos, endPos - startPos + 1);
1081         }
1082         if (delegate_) {
1083             delegate_->GetUiTask().PostTask([eventMarker, fixParam] { eventMarker.CallUiStrFunction(fixParam); });
1084         }
1085     } else {
1086         delegate_->FireAsyncEvent(eventMarker.GetData().eventId, param, "");
1087     }
1088 
1089     AccessibilityEvent accessibilityEvent;
1090     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1091     accessibilityEvent.eventType = eventMarker.GetData().eventType;
1092     delegate_->FireAccessibilityEvent(accessibilityEvent);
1093 }
1094 
HandleSyncEvent(const EventMarker & eventMarker,bool & result)1095 void DeclarativeEventHandler::HandleSyncEvent(const EventMarker& eventMarker, bool& result)
1096 {
1097     LOGW("js event handler does not support this event type!");
1098     AccessibilityEvent accessibilityEvent;
1099     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1100     accessibilityEvent.eventType = eventMarker.GetData().eventType;
1101     delegate_->FireAccessibilityEvent(accessibilityEvent);
1102 }
1103 
HandleSyncEvent(const EventMarker & eventMarker,const std::shared_ptr<BaseEventInfo> & info)1104 void DeclarativeEventHandler::HandleSyncEvent(
1105     const EventMarker& eventMarker, const std::shared_ptr<BaseEventInfo>& info)
1106 {
1107     if (delegate_) {
1108         delegate_->GetUiTask().PostSyncTask([eventMarker, info] { eventMarker.CallUiArgFunction(info.get()); });
1109     }
1110 }
1111 
HandleSyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info,bool & result)1112 void DeclarativeEventHandler::HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result)
1113 {
1114     LOGW("js event handler does not support this event type!");
1115     AccessibilityEvent accessibilityEvent;
1116     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1117     accessibilityEvent.eventType = eventMarker.GetData().eventType;
1118     delegate_->FireAccessibilityEvent(accessibilityEvent);
1119 }
1120 
HandleSyncEvent(const EventMarker & eventMarker,const std::string & param,std::string & result)1121 void DeclarativeEventHandler::HandleSyncEvent(
1122     const EventMarker& eventMarker, const std::string& param, std::string& result)
1123 {
1124     LOGW("js event handler does not support this event type!");
1125     AccessibilityEvent accessibilityEvent;
1126     accessibilityEvent.nodeId = StringUtils::StringToInt(eventMarker.GetData().eventId);
1127     accessibilityEvent.eventType = eventMarker.GetData().eventType;
1128     delegate_->FireAccessibilityEvent(accessibilityEvent);
1129     delegate_->FireSyncEvent(eventMarker.GetData().eventId, param, std::string(""), result);
1130 }
1131 
HandleSyncEvent(const EventMarker & eventMarker,const std::string & componentId,const int32_t nodeId,const bool isDestroy)1132 void DeclarativeEventHandler::HandleSyncEvent(
1133     const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId, const bool isDestroy)
1134 {
1135     if (delegate_) {
1136         delegate_->FireExternalEvent(eventMarker.GetData().eventId, componentId, nodeId, isDestroy);
1137     }
1138 }
1139 
1140 } // namespace OHOS::Ace
1141