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