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