• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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/ng/declarative_frontend_ng.h"
17 
18 #include "base/log/dump_log.h"
19 #include "core/common/recorder/node_data_cache.h"
20 #include "frameworks/bridge/declarative_frontend/ng/page_router_manager_factory.h"
21 
22 namespace OHOS::Ace {
23 
~DeclarativeFrontendNG()24 DeclarativeFrontendNG::~DeclarativeFrontendNG() noexcept
25 {
26     LOGI("DeclarativeFrontend destroyed");
27 }
28 
Destroy()29 void DeclarativeFrontendNG::Destroy()
30 {
31     // The call doesn't change the page pop status
32     Recorder::NodeDataCache::Get().OnBeforePagePop(true);
33     CHECK_RUN_ON(JS);
34     // To guarantee the jsEngine_ and delegate_ released in js thread
35     delegate_.Reset();
36     jsEngine_->Destroy();
37     jsEngine_.Reset();
38 }
39 
Initialize(FrontendType type,const RefPtr<TaskExecutor> & taskExecutor)40 bool DeclarativeFrontendNG::Initialize(FrontendType type, const RefPtr<TaskExecutor>& taskExecutor)
41 {
42     type_ = type;
43     taskExecutor_ = taskExecutor;
44     ACE_DCHECK(type_ == FrontendType::DECLARATIVE_JS);
45     InitializeDelegate(taskExecutor);
46     bool needPostJsTask = true;
47     auto container = Container::Current();
48     if (container) {
49         const auto& setting = container->GetSettings();
50         needPostJsTask = !(setting.usePlatformAsUIThread && setting.useUIAsJSThread);
51     }
52     auto initJSEngineTask = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_), delegate = delegate_] {
53         auto jsEngine = weakEngine.Upgrade();
54         if (!jsEngine) {
55             return;
56         }
57         jsEngine->Initialize(delegate);
58     };
59     if (needPostJsTask) {
60         taskExecutor->PostTask(initJSEngineTask, TaskExecutor::TaskType::JS, "ArkUIInitJsEngine");
61     } else {
62         initJSEngineTask();
63     }
64     return true;
65 }
66 
AttachPipelineContext(const RefPtr<PipelineBase> & context)67 void DeclarativeFrontendNG::AttachPipelineContext(const RefPtr<PipelineBase>& context)
68 {
69     if (delegate_) {
70         delegate_->AttachPipelineContext(context);
71     }
72 }
73 
AttachSubPipelineContext(const RefPtr<PipelineBase> & context)74 void DeclarativeFrontendNG::AttachSubPipelineContext(const RefPtr<PipelineBase>& context)
75 {
76     if (!delegate_) {
77         return;
78     }
79     delegate_->AttachSubPipelineContext(context);
80 }
81 
SetAssetManager(const RefPtr<AssetManager> & assetManager)82 void DeclarativeFrontendNG::SetAssetManager(const RefPtr<AssetManager>& assetManager)
83 {
84     if (delegate_) {
85         delegate_->SetAssetManager(assetManager);
86     }
87 }
88 
InitializeDelegate(const RefPtr<TaskExecutor> & taskExecutor)89 void DeclarativeFrontendNG::InitializeDelegate(const RefPtr<TaskExecutor>& taskExecutor)
90 {
91     auto pageRouterManager = NG::PageRouterManagerFactory::CreateManager();
92     auto loadPageCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const std::string& url,
93                                 const std::function<void(const std::string&, int32_t)>& errorCallback) {
94         auto jsEngine = weakEngine.Upgrade();
95         if (!jsEngine) {
96             return false;
97         }
98         return jsEngine->LoadPageSource(url, errorCallback);
99     };
100 
101     auto loadPageByBufferCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
102                                         const std::shared_ptr<std::vector<uint8_t>>& content,
103                                         const std::function<void(const std::string&, int32_t)>& errorCallback,
104                                         const std::string& contentName) {
105         auto jsEngine = weakEngine.Upgrade();
106         if (!jsEngine) {
107             return false;
108         }
109         return jsEngine->LoadPageSource(content, errorCallback, contentName);
110     };
111 
112     auto mediaQueryCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
113                                          const std::string& callbackId, const std::string& args) {
114         auto jsEngine = weakEngine.Upgrade();
115         if (!jsEngine) {
116             return;
117         }
118         jsEngine->MediaQueryCallback(callbackId, args);
119     };
120 
121     auto layoutInspectorCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
122                                        const std::string& componentId) {
123         auto jsEngine = weakEngine.Upgrade();
124         if (!jsEngine) {
125             return;
126         }
127         jsEngine->LayoutInspectorCallback(componentId);
128     };
129 
130     auto drawInspectorCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
131                                      const std::string& componentId) {
132         auto jsEngine = weakEngine.Upgrade();
133         if (!jsEngine) {
134             return;
135         }
136         jsEngine->DrawInspectorCallback(componentId);
137     };
138 
139     auto onStartContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() -> bool {
140         auto jsEngine = weakEngine.Upgrade();
141         if (!jsEngine) {
142             return false;
143         }
144         return jsEngine->OnStartContinuation();
145     };
146 
147     auto onCompleteContinuationCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](int32_t code) {
148         auto jsEngine = weakEngine.Upgrade();
149         if (!jsEngine) {
150             return;
151         }
152         jsEngine->OnCompleteContinuation(code);
153     };
154 
155     auto onSaveDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](std::string& savedData) {
156         auto jsEngine = weakEngine.Upgrade();
157         if (!jsEngine) {
158             return;
159         }
160         jsEngine->OnSaveData(savedData);
161     };
162 
163     auto onRemoteTerminatedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
164         auto jsEngine = weakEngine.Upgrade();
165         if (!jsEngine) {
166             return;
167         }
168         jsEngine->OnRemoteTerminated();
169     };
170 
171     auto onRestoreDataCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
172                                             const std::string& data) -> bool {
173         auto jsEngine = weakEngine.Upgrade();
174         if (!jsEngine) {
175             return false;
176         }
177         return jsEngine->OnRestoreData(data);
178     };
179 
180     auto destroyApplicationCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
181                                                  const std::string& packageName) {
182         auto jsEngine = weakEngine.Upgrade();
183         if (!jsEngine) {
184             return;
185         }
186         jsEngine->DestroyApplication(packageName);
187     };
188 
189     auto updateApplicationStateCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
190                                                      const std::string& packageName, Frontend::State state) {
191         auto jsEngine = weakEngine.Upgrade();
192         if (!jsEngine) {
193             return;
194         }
195         jsEngine->UpdateApplicationState(packageName, state);
196     };
197 
198     auto onWindowDisplayModeChangedCallBack = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
199                                                          bool isShownInMultiWindow, const std::string& data) {
200         auto jsEngine = weakEngine.Upgrade();
201         if (!jsEngine) {
202             return;
203         }
204         jsEngine->OnWindowDisplayModeChanged(isShownInMultiWindow, data);
205     };
206 
207     auto externalEventCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
208                                             const std::string& componentId, const uint32_t nodeId,
209                                             const bool isDestroy) {
210         auto jsEngine = weakEngine.Upgrade();
211         if (!jsEngine) {
212             return;
213         }
214         jsEngine->FireExternalEvent(componentId, nodeId, isDestroy);
215     };
216 
217     auto timerCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
218                                     const std::string& callbackId, const std::string& delay, bool isInterval) {
219         auto jsEngine = weakEngine.Upgrade();
220         if (!jsEngine) {
221             return;
222         }
223         jsEngine->TimerCallback(callbackId, delay, isInterval);
224     };
225 
226     auto loadNamedRouterCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
227                                        const std::string& namedRouter, bool isTriggeredByJs) {
228         auto jsEngine = weakEngine.Upgrade();
229         if (!jsEngine) {
230             return false;
231         }
232         return jsEngine->LoadNamedRouterSource(namedRouter, isTriggeredByJs);
233     };
234 
235     auto updateRootComponentCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)]() {
236         auto jsEngine = weakEngine.Upgrade();
237         if (!jsEngine) {
238             return false;
239         }
240         return jsEngine->UpdateRootComponent();
241     };
242 
243     pageRouterManager->SetLoadJsCallback(std::move(loadPageCallback));
244     pageRouterManager->SetLoadJsByBufferCallback(std::move(loadPageByBufferCallback));
245     pageRouterManager->SetLoadNamedRouterCallback(std::move(loadNamedRouterCallback));
246     pageRouterManager->SetUpdateRootComponentCallback(std::move(updateRootComponentCallback));
247 
248     delegate_ = AceType::MakeRefPtr<Framework::FrontendDelegateDeclarativeNG>(taskExecutor);
249     delegate_->SetMediaQueryCallback(std::move(mediaQueryCallback));
250     delegate_->SetLayoutInspectorCallback(std::move(layoutInspectorCallback));
251     delegate_->SetDrawInspectorCallback(std::move(drawInspectorCallback));
252     delegate_->SetOnStartContinuationCallBack(std::move(onStartContinuationCallBack));
253     delegate_->SetOnCompleteContinuationCallBack(std::move(onCompleteContinuationCallBack));
254     delegate_->SetOnSaveDataCallBack(std::move(onSaveDataCallBack));
255     delegate_->SetOnRemoteTerminatedCallBack(std::move(onRemoteTerminatedCallBack));
256     delegate_->SetOnRestoreDataCallBack(std::move(onRestoreDataCallBack));
257     delegate_->SetDestroyApplicationCallback(std::move(destroyApplicationCallback));
258     delegate_->SetUpdateApplicationStateCallback(std::move(updateApplicationStateCallback));
259     delegate_->SetOnWindowDisplayModeChangedCallback(std::move(onWindowDisplayModeChangedCallBack));
260     delegate_->SetExternalEventCallback(std::move(externalEventCallback));
261     delegate_->SetTimerCallback(std::move(timerCallback));
262 
263     delegate_->SetPageRouterManager(pageRouterManager);
264     if (jsEngine_) {
265         delegate_->SetGroupJsBridge(jsEngine_->GetGroupJsBridge());
266     }
267     auto moduleNamecallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](const std::string& pageName)->
268     std::string {
269         auto jsEngine = weakEngine.Upgrade();
270         if (!jsEngine) {
271             return "";
272         }
273         return jsEngine->SearchRouterRegisterMap(pageName);
274     };
275     auto navigationLoadCallback = [weakEngine = WeakPtr<Framework::JsEngine>(jsEngine_)](
276         const std::string bundleName, const std::string& moduleName, const std::string& pageSourceFile,
277         bool isSingleton) -> int32_t {
278         auto jsEngine = weakEngine.Upgrade();
279         if (!jsEngine) {
280             return -1;
281         }
282         return jsEngine->LoadNavDestinationSource(bundleName, moduleName, pageSourceFile, isSingleton);
283     };
284     auto container = Container::Current();
285     if (container) {
286         auto pageUrlChecker = container->GetPageUrlChecker();
287         // ArkTSCard container no SetPageUrlChecker
288         if (pageUrlChecker != nullptr) {
289             pageUrlChecker->SetModuleNameCallback(std::move(moduleNamecallback));
290         }
291         auto navigationRoute = container->GetNavigationRoute();
292         if (navigationRoute) {
293             navigationRoute->SetLoadPageCallback(std::move(navigationLoadCallback));
294         }
295     }
296 }
297 
GetPageRouterManager() const298 RefPtr<NG::PageRouterManager> DeclarativeFrontendNG::GetPageRouterManager() const
299 {
300     CHECK_NULL_RETURN(delegate_, nullptr);
301     return delegate_->GetPageRouterManager();
302 }
303 
UpdateState(Frontend::State state)304 void DeclarativeFrontendNG::UpdateState(Frontend::State state)
305 {
306     if (!delegate_ || state == Frontend::State::ON_CREATE) {
307         return;
308     }
309     bool needPostJsTask = true;
310     auto container = Container::Current();
311     CHECK_NULL_VOID(container);
312     const auto& setting = container->GetSettings();
313     needPostJsTask = !(setting.usePlatformAsUIThread && setting.useUIAsJSThread);
314     if (needPostJsTask) {
315         delegate_->UpdateApplicationState(delegate_->GetAppID(), state);
316         return;
317     }
318     if (jsEngine_) {
319         jsEngine_->UpdateApplicationState(delegate_->GetAppID(), state);
320     }
321 }
322 
OnConfigurationUpdated(const std::string & data)323 void DeclarativeFrontendNG::OnConfigurationUpdated(const std::string& data)
324 {
325     if (delegate_) {
326         delegate_->OnConfigurationUpdated(data);
327     }
328 }
329 
OnActive()330 void DeclarativeFrontendNG::OnActive()
331 {
332     if (delegate_) {
333         foregroundFrontend_ = true;
334         delegate_->InitializeAccessibilityCallback();
335     }
336 }
337 
OnCompleteContinuation(int32_t code)338 void DeclarativeFrontendNG::OnCompleteContinuation(int32_t code)
339 {
340     if (delegate_) {
341         delegate_->OnCompleteContinuation(code);
342     }
343 }
344 
OnSaveData(std::string & data)345 void DeclarativeFrontendNG::OnSaveData(std::string& data)
346 {
347     if (delegate_) {
348         delegate_->OnSaveData(data);
349     }
350 }
351 
OnRemoteTerminated()352 void DeclarativeFrontendNG::OnRemoteTerminated()
353 {
354     if (delegate_) {
355         delegate_->OnRemoteTerminated();
356     }
357 }
358 
NotifyAppStorage(const std::string & key,const std::string & value)359 void DeclarativeFrontendNG::NotifyAppStorage(const std::string& key, const std::string& value)
360 {
361     if (!delegate_) {
362         return;
363     }
364     delegate_->NotifyAppStorage(jsEngine_, key, value);
365 }
366 
GetRouterSize() const367 int32_t DeclarativeFrontendNG::GetRouterSize() const
368 {
369     if (delegate_) {
370         return delegate_->GetStackSize();
371     }
372     return -1;
373 }
374 
OnStartContinuation()375 bool DeclarativeFrontendNG::OnStartContinuation()
376 {
377     if (!delegate_) {
378         return false;
379     }
380     return delegate_->OnStartContinuation();
381 }
382 
OnRestoreData(const std::string & data)383 bool DeclarativeFrontendNG::OnRestoreData(const std::string& data)
384 {
385     if (!delegate_) {
386         return false;
387     }
388     return delegate_->OnRestoreData(data);
389 }
390 
RunPage(const std::string & url,const std::string & params)391 UIContentErrorCode DeclarativeFrontendNG::RunPage(const std::string& url, const std::string& params)
392 {
393     auto container = Container::Current();
394     auto isStageModel = container ? container->IsUseStageModel() : false;
395     if (!isStageModel) {
396         // In NG structure and fa mode, first load app.js
397         auto taskExecutor = container ? container->GetTaskExecutor() : nullptr;
398         CHECK_NULL_RETURN(taskExecutor, UIContentErrorCode::NULL_POINTER);
399         taskExecutor->PostTask(
400             [weak = AceType::WeakClaim(this)]() {
401                 auto frontend = weak.Upgrade();
402                 CHECK_NULL_VOID(frontend);
403                 CHECK_NULL_VOID(frontend->jsEngine_);
404                 frontend->jsEngine_->LoadFaAppSource();
405             },
406             TaskExecutor::TaskType::JS, "ArkUILoadFaAppSource");
407     }
408     // Not use this pageId from backend, manage it in FrontendDelegateDeclarativeNg.
409     if (delegate_) {
410         delegate_->RunPage(url, params, pageProfile_);
411         return UIContentErrorCode::NO_ERRORS;
412     }
413 
414     return UIContentErrorCode::NULL_POINTER;
415 }
416 
RunPage(const std::shared_ptr<std::vector<uint8_t>> & content,const std::string & params)417 UIContentErrorCode DeclarativeFrontendNG::RunPage(
418     const std::shared_ptr<std::vector<uint8_t>>& content, const std::string& params)
419 {
420     auto container = Container::Current();
421     auto isStageModel = container ? container->IsUseStageModel() : false;
422     if (!isStageModel) {
423         LOGE("RunPage by buffer must be run under stage model.");
424         return UIContentErrorCode::NO_STAGE;
425     }
426 
427     if (delegate_) {
428         delegate_->RunPage(content, params, pageProfile_);
429         return UIContentErrorCode::NO_ERRORS;
430     }
431 
432     return UIContentErrorCode::NULL_POINTER;
433 }
434 
RunPageByNamedRouter(const std::string & name,const std::string & params)435 UIContentErrorCode DeclarativeFrontendNG::RunPageByNamedRouter(const std::string& name, const std::string& params)
436 {
437     if (delegate_) {
438         delegate_->RunPage(name, params, pageProfile_, true);
439         return UIContentErrorCode::NO_ERRORS;
440     }
441     return UIContentErrorCode::NULL_POINTER;
442 }
443 
ReplacePage(const std::string & url,const std::string & params)444 void DeclarativeFrontendNG::ReplacePage(const std::string& url, const std::string& params)
445 {
446     if (delegate_) {
447         delegate_->Replace(url, params);
448     }
449 }
450 
PushPage(const std::string & url,const std::string & params)451 void DeclarativeFrontendNG::PushPage(const std::string& url, const std::string& params)
452 {
453     if (delegate_) {
454         delegate_->Push(url, params);
455     }
456 }
457 
458 
GetContextValue()459 napi_value DeclarativeFrontendNG::GetContextValue()
460 {
461     return jsEngine_->GetContextValue();
462 }
463 
GetFrameNodeValueByNodeId(int32_t nodeId)464 napi_value DeclarativeFrontendNG::GetFrameNodeValueByNodeId(int32_t nodeId)
465 {
466     return jsEngine_->GetFrameNodeValueByNodeId(nodeId);
467 }
468 
NavigatePage(uint8_t type,const PageTarget & target,const std::string & params)469 void DeclarativeFrontendNG::NavigatePage(uint8_t type, const PageTarget& target, const std::string& params)
470 {
471     if (delegate_) {
472         delegate_->NavigatePage(type, target, params);
473     }
474 }
475 
OnWindowDisplayModeChanged(bool isShownInMultiWindow,const std::string & data)476 void DeclarativeFrontendNG::OnWindowDisplayModeChanged(bool isShownInMultiWindow, const std::string& data)
477 {
478     delegate_->OnWindowDisplayModeChanged(isShownInMultiWindow, data);
479 }
480 
GetAccessibilityManager() const481 RefPtr<AccessibilityManager> DeclarativeFrontendNG::GetAccessibilityManager() const
482 {
483     if (!delegate_) {
484         return nullptr;
485     }
486     return delegate_->GetJSAccessibilityManager();
487 }
488 
GetWindowConfig()489 WindowConfig& DeclarativeFrontendNG::GetWindowConfig()
490 {
491     if (!delegate_) {
492         static WindowConfig windowConfig;
493         return windowConfig;
494     }
495     return delegate_->GetWindowConfig();
496 }
497 
OnBackPressed()498 bool DeclarativeFrontendNG::OnBackPressed()
499 {
500     CHECK_NULL_RETURN(delegate_, false);
501     return delegate_->OnPageBackPress();
502 }
503 
OnShow()504 void DeclarativeFrontendNG::OnShow()
505 {
506     foregroundFrontend_ = true;
507     CHECK_NULL_VOID(delegate_);
508     delegate_->OnPageShow();
509 }
510 
OnHide()511 void DeclarativeFrontendNG::OnHide()
512 {
513     foregroundFrontend_ = false;
514     CHECK_NULL_VOID(delegate_);
515     delegate_->OnPageHide();
516 }
517 
CallRouterBack()518 void DeclarativeFrontendNG::CallRouterBack()
519 {
520     if (delegate_) {
521         if (delegate_->GetStackSize() == 1 && isSubWindow_) {
522             LOGW("Can't back because this is the last page of sub window!");
523             return;
524         }
525         delegate_->Back("", "");
526     }
527 }
528 
OnSurfaceChanged(int32_t width,int32_t height)529 void DeclarativeFrontendNG::OnSurfaceChanged(int32_t width, int32_t height)
530 {
531     // TODO: update media query infos
532     if (delegate_) {
533         delegate_->OnSurfaceChanged();
534     }
535 }
536 
OnLayoutCompleted(const std::string & componentId)537 void DeclarativeFrontendNG::OnLayoutCompleted(const std::string& componentId)
538 {
539     if (delegate_) {
540         delegate_->OnLayoutCompleted(componentId);
541     }
542 }
543 
OnDrawCompleted(const std::string & componentId)544 void DeclarativeFrontendNG::OnDrawCompleted(const std::string& componentId)
545 {
546     if (delegate_) {
547         delegate_->OnDrawCompleted(componentId);
548     }
549 }
550 
DumpFrontend() const551 void DeclarativeFrontendNG::DumpFrontend() const
552 {
553     if (!delegate_) {
554         return;
555     }
556     int32_t routerIndex = 0;
557     std::string routerName;
558     std::string routerPath;
559     delegate_->GetState(routerIndex, routerName, routerPath);
560 
561     if (DumpLog::GetInstance().GetDumpFile()) {
562         DumpLog::GetInstance().AddDesc("Components: " + std::to_string(delegate_->GetComponentsCount()));
563         DumpLog::GetInstance().AddDesc("Path: " + routerPath);
564         DumpLog::GetInstance().AddDesc("Length: " + std::to_string(routerIndex));
565         DumpLog::GetInstance().Print(0, routerName, 0);
566     }
567 }
568 
GetPagePath() const569 std::string DeclarativeFrontendNG::GetPagePath() const
570 {
571     if (!delegate_) {
572         return "";
573     }
574     int32_t routerIndex = 0;
575     std::string routerName;
576     std::string routerPath;
577     delegate_->GetState(routerIndex, routerName, routerPath);
578     return routerPath + routerName;
579 }
580 
TriggerGarbageCollection()581 void DeclarativeFrontendNG::TriggerGarbageCollection()
582 {
583     if (jsEngine_) {
584         jsEngine_->RunGarbageCollection();
585     }
586 }
587 
DumpHeapSnapshot(bool isPrivate)588 void DeclarativeFrontendNG::DumpHeapSnapshot(bool isPrivate)
589 {
590     if (jsEngine_) {
591         jsEngine_->DumpHeapSnapshot(isPrivate);
592     }
593 }
594 
NotifyUIIdle()595 void DeclarativeFrontendNG::NotifyUIIdle()
596 {
597     if (jsEngine_) {
598         jsEngine_->NotifyUIIdle();
599     }
600 }
601 
RestoreRouterStack(const std::string & contentInfo,ContentInfoType type)602 std::pair<RouterRecoverRecord, UIContentErrorCode> DeclarativeFrontendNG::RestoreRouterStack(
603     const std::string& contentInfo, ContentInfoType type)
604 {
605     if (delegate_) {
606         return delegate_->RestoreRouterStack(contentInfo, type);
607     }
608     return std::make_pair(RouterRecoverRecord(), UIContentErrorCode::NULL_POINTER);
609 }
610 
GetContentInfo(ContentInfoType type) const611 std::string DeclarativeFrontendNG::GetContentInfo(ContentInfoType type) const
612 {
613     if (delegate_) {
614         return delegate_->GetContentInfo(type);
615     }
616     return "";
617 }
618 
SetColorMode(ColorMode colorMode)619 void DeclarativeFrontendNG::SetColorMode(ColorMode colorMode)
620 {
621     // TODO: update media query infos
622     if (delegate_) {
623         delegate_->SetColorMode(colorMode);
624     }
625 }
626 
RebuildAllPages()627 void DeclarativeFrontendNG::RebuildAllPages()
628 {
629     if (delegate_) {
630         delegate_->RebuildAllPages();
631     }
632 }
633 
FlushReload()634 void DeclarativeFrontendNG::FlushReload()
635 {
636     if (jsEngine_) {
637         jsEngine_->FlushReload();
638     }
639 }
640 
HotReload()641 void DeclarativeFrontendNG::HotReload()
642 {
643     auto manager = GetPageRouterManager();
644     CHECK_NULL_VOID(manager);
645     manager->FlushFrontend();
646 }
647 
GetCurrentPageUrl() const648 std::string DeclarativeFrontendNG::GetCurrentPageUrl() const
649 {
650     auto pageRouterManager = GetPageRouterManager();
651     if (pageRouterManager) {
652         return pageRouterManager->GetCurrentPageUrl();
653     }
654     return "";
655 }
656 } // namespace OHOS::Ace
657