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