• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-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/ng/frontend_delegate_declarative_ng.h"
17 
18 #include "base/i18n/localization.h"
19 #include "base/log/ace_trace.h"
20 #include "base/log/event_report.h"
21 #include "base/resource/ace_res_config.h"
22 #include "base/subwindow/subwindow_manager.h"
23 #include "base/thread/background_task_executor.h"
24 #include "base/utils/measure_util.h"
25 #include "base/utils/utils.h"
26 #include "core/common/ace_application_info.h"
27 #include "core/common/container.h"
28 #include "core/common/thread_checker.h"
29 #include "core/components_ng/base/view_stack_model.h"
30 #include "core/components_ng/pattern/overlay/overlay_manager.h"
31 #include "core/components_ng/pattern/stage/page_pattern.h"
32 #include "core/components_ng/render/adapter/component_snapshot.h"
33 #include "core/pipeline_ng/pipeline_context.h"
34 #include "frameworks/bridge/common/utils/utils.h"
35 
36 namespace OHOS::Ace::Framework {
37 
38 namespace {
39 
40 const char MANIFEST_JSON[] = "manifest.json";
41 const char PAGES_JSON[] = "main_pages.json";
42 constexpr int32_t TOAST_TIME_MAX = 10000;    // ms
43 constexpr int32_t TOAST_TIME_DEFAULT = 1500; // ms
44 constexpr int32_t CALLBACK_ERRORCODE_CANCEL = 1;
45 constexpr int32_t CALLBACK_DATACODE_ZERO = 0;
46 
47 // helper function to run OverlayManager task
48 // ensures that the task runs in subwindow instead of main Window
MainWindowOverlay(std::function<void (RefPtr<NG::OverlayManager>)> && task)49 void MainWindowOverlay(std::function<void(RefPtr<NG::OverlayManager>)>&& task)
50 {
51     auto currentId = Container::CurrentId();
52     ContainerScope scope(currentId);
53     auto context = NG::PipelineContext::GetCurrentContext();
54     CHECK_NULL_VOID(context);
55     auto overlayManager = context->GetOverlayManager();
56     context->GetTaskExecutor()->PostTask(
57         [task = std::move(task), weak = WeakPtr<NG::OverlayManager>(overlayManager)] {
58             auto overlayManager = weak.Upgrade();
59             task(overlayManager);
60         },
61         TaskExecutor::TaskType::UI);
62 }
63 } // namespace
64 
FrontendDelegateDeclarativeNG(const RefPtr<TaskExecutor> & taskExecutor)65 FrontendDelegateDeclarativeNG::FrontendDelegateDeclarativeNG(const RefPtr<TaskExecutor>& taskExecutor)
66     : taskExecutor_(taskExecutor), manifestParser_(AceType::MakeRefPtr<Framework::ManifestParser>()),
67       mediaQueryInfo_(AceType::MakeRefPtr<MediaQueryInfo>()),
68       jsAccessibilityManager_(AccessibilityNodeManager::Create())
69 {}
70 
SetMediaQueryCallback(MediaQueryCallback && mediaQueryCallback)71 void FrontendDelegateDeclarativeNG::SetMediaQueryCallback(MediaQueryCallback&& mediaQueryCallback)
72 {
73     mediaQueryCallback_ = mediaQueryCallback;
74 }
75 
SetLayoutInspectorCallback(const LayoutInspectorCallback & layoutInspectorCallback)76 void FrontendDelegateDeclarativeNG::SetLayoutInspectorCallback(const LayoutInspectorCallback& layoutInspectorCallback)
77 {
78     layoutInspectorCallback_ = layoutInspectorCallback;
79 }
80 
SetDrawInspectorCallback(const DrawInspectorCallback & drawInspectorCallback)81 void FrontendDelegateDeclarativeNG::SetDrawInspectorCallback(const DrawInspectorCallback& drawInspectorCallback)
82 {
83     drawInspectorCallback_ = drawInspectorCallback;
84 }
85 
SetOnStartContinuationCallBack(OnStartContinuationCallBack && onStartContinuationCallBack)86 void FrontendDelegateDeclarativeNG::SetOnStartContinuationCallBack(
87     OnStartContinuationCallBack&& onStartContinuationCallBack)
88 {
89     onStartContinuationCallBack_ = onStartContinuationCallBack;
90 }
91 
SetOnCompleteContinuationCallBack(OnCompleteContinuationCallBack && onCompleteContinuationCallBack)92 void FrontendDelegateDeclarativeNG::SetOnCompleteContinuationCallBack(
93     OnCompleteContinuationCallBack&& onCompleteContinuationCallBack)
94 {
95     onCompleteContinuationCallBack_ = onCompleteContinuationCallBack;
96 }
97 
SetOnSaveDataCallBack(OnSaveDataCallBack && onSaveDataCallBack)98 void FrontendDelegateDeclarativeNG::SetOnSaveDataCallBack(OnSaveDataCallBack&& onSaveDataCallBack)
99 {
100     onSaveDataCallBack_ = onSaveDataCallBack;
101 }
102 
SetOnRemoteTerminatedCallBack(OnRemoteTerminatedCallBack && onRemoteTerminatedCallBack)103 void FrontendDelegateDeclarativeNG::SetOnRemoteTerminatedCallBack(
104     OnRemoteTerminatedCallBack&& onRemoteTerminatedCallBack)
105 {
106     onRemoteTerminatedCallBack_ = onRemoteTerminatedCallBack;
107 }
108 
SetOnRestoreDataCallBack(OnRestoreDataCallBack && onRestoreDataCallBack)109 void FrontendDelegateDeclarativeNG::SetOnRestoreDataCallBack(OnRestoreDataCallBack&& onRestoreDataCallBack)
110 {
111     onRestoreDataCallBack_ = onRestoreDataCallBack;
112 }
113 
SetDestroyApplicationCallback(DestroyApplicationCallback && destroyApplicationCallback)114 void FrontendDelegateDeclarativeNG::SetDestroyApplicationCallback(
115     DestroyApplicationCallback&& destroyApplicationCallback)
116 {
117     destroyApplication_ = destroyApplicationCallback;
118 }
119 
SetUpdateApplicationStateCallback(UpdateApplicationStateCallback && updateApplicationStateCallback)120 void FrontendDelegateDeclarativeNG::SetUpdateApplicationStateCallback(
121     UpdateApplicationStateCallback&& updateApplicationStateCallback)
122 {
123     updateApplicationState_ = updateApplicationStateCallback;
124 }
125 
SetOnWindowDisplayModeChangedCallback(OnWindowDisplayModeChangedCallBack && onWindowDisplayModeChangedCallBack)126 void FrontendDelegateDeclarativeNG::SetOnWindowDisplayModeChangedCallback(
127     OnWindowDisplayModeChangedCallBack&& onWindowDisplayModeChangedCallBack)
128 {
129     onWindowDisplayModeChanged_ = onWindowDisplayModeChangedCallBack;
130 }
131 
SetExternalEventCallback(ExternalEventCallback && externalEventCallback)132 void FrontendDelegateDeclarativeNG::SetExternalEventCallback(ExternalEventCallback&& externalEventCallback)
133 {
134     externalEvent_ = externalEventCallback;
135 }
136 
SetTimerCallback(TimerCallback && timerCallback)137 void FrontendDelegateDeclarativeNG::SetTimerCallback(TimerCallback&& timerCallback)
138 {
139     timer_ = timerCallback;
140 }
141 
AttachPipelineContext(const RefPtr<PipelineBase> & context)142 void FrontendDelegateDeclarativeNG::AttachPipelineContext(const RefPtr<PipelineBase>& context)
143 {
144     if (!context) {
145         return;
146     }
147     context->SetOnPageShow([weak = AceType::WeakClaim(this)] {
148         auto delegate = weak.Upgrade();
149         if (delegate) {
150             delegate->OnPageShow();
151         }
152     });
153 
154     pipelineContextHolder_.Attach(context);
155     jsAccessibilityManager_->SetPipelineContext(context);
156     jsAccessibilityManager_->InitializeCallback();
157 }
158 
AttachSubPipelineContext(const RefPtr<PipelineBase> & context)159 void FrontendDelegateDeclarativeNG::AttachSubPipelineContext(const RefPtr<PipelineBase>& context)
160 {
161     if (!context) {
162         return;
163     }
164     jsAccessibilityManager_->AddSubPipelineContext(context);
165 }
166 
RunPage(const std::string & url,const std::string & params,const std::string & profile)167 void FrontendDelegateDeclarativeNG::RunPage(
168     const std::string& url, const std::string& params, const std::string& profile)
169 {
170     ACE_SCOPED_TRACE("FrontendDelegateDeclarativeNG::RunPage");
171 
172     LOGI("Frontend delegate declarative run page, url=%{public}s", url.c_str());
173     std::string jsonContent;
174     if (GetAssetContent(MANIFEST_JSON, jsonContent)) {
175         manifestParser_->Parse(jsonContent);
176         manifestParser_->Printer();
177     } else if (!profile.empty() && GetAssetContent(profile, jsonContent)) {
178         manifestParser_->Parse(jsonContent);
179     } else if (GetAssetContent(PAGES_JSON, jsonContent)) {
180         manifestParser_->Parse(jsonContent);
181     }
182     std::string mainPagePath;
183     if (!url.empty()) {
184         mainPagePath = manifestParser_->GetRouter()->GetPagePath(url);
185     } else {
186         mainPagePath = manifestParser_->GetRouter()->GetEntry();
187     }
188     taskExecutor_->PostTask(
189         [manifestParser = manifestParser_, delegate = Claim(this),
190             weakPtr = WeakPtr<NG::PageRouterManager>(pageRouterManager_), url, params]() {
191             auto pageRouterManager = weakPtr.Upgrade();
192             CHECK_NULL_VOID(pageRouterManager);
193             pageRouterManager->SetManifestParser(manifestParser);
194             pageRouterManager->RunPage(url, params);
195             auto pipeline = delegate->GetPipelineContext();
196             // TODO: get platform version from context, and should stored in AceApplicationInfo.
197             if (manifestParser->GetMinPlatformVersion() > 0) {
198                 pipeline->SetMinPlatformVersion(manifestParser->GetMinPlatformVersion());
199             }
200         },
201         TaskExecutor::TaskType::JS);
202 }
203 
RunPage(const std::shared_ptr<std::vector<uint8_t>> & content,const std::string & params,const std::string & profile)204 void FrontendDelegateDeclarativeNG::RunPage(
205     const std::shared_ptr<std::vector<uint8_t>>& content, const std::string& params, const std::string& profile)
206 {
207     ACE_SCOPED_TRACE("FrontendDelegateDeclarativeNG::RunPage %zu", content->size());
208     taskExecutor_->PostTask(
209         [delegate = Claim(this), weakPtr = WeakPtr<NG::PageRouterManager>(pageRouterManager_), content, params]() {
210             auto pageRouterManager = weakPtr.Upgrade();
211             CHECK_NULL_VOID(pageRouterManager);
212             pageRouterManager->RunPage(content, params);
213             auto pipeline = delegate->GetPipelineContext();
214         },
215         TaskExecutor::TaskType::JS);
216 }
217 
OnConfigurationUpdated(const std::string & data)218 void FrontendDelegateDeclarativeNG::OnConfigurationUpdated(const std::string& data)
219 {
220     // only support mediaQueryUpdate
221     OnMediaQueryUpdate();
222 }
223 
OnStartContinuation()224 bool FrontendDelegateDeclarativeNG::OnStartContinuation()
225 {
226     bool ret = false;
227     taskExecutor_->PostSyncTask(
228         [weak = AceType::WeakClaim(this), &ret] {
229             auto delegate = weak.Upgrade();
230             if (delegate && delegate->onStartContinuationCallBack_) {
231                 ret = delegate->onStartContinuationCallBack_();
232             }
233         },
234         TaskExecutor::TaskType::JS);
235     return ret;
236 }
237 
OnCompleteContinuation(int32_t code)238 void FrontendDelegateDeclarativeNG::OnCompleteContinuation(int32_t code)
239 {
240     taskExecutor_->PostSyncTask(
241         [weak = AceType::WeakClaim(this), code] {
242             auto delegate = weak.Upgrade();
243             if (delegate && delegate->onCompleteContinuationCallBack_) {
244                 delegate->onCompleteContinuationCallBack_(code);
245             }
246         },
247         TaskExecutor::TaskType::JS);
248 }
249 
OnRemoteTerminated()250 void FrontendDelegateDeclarativeNG::OnRemoteTerminated()
251 {
252     taskExecutor_->PostSyncTask(
253         [weak = AceType::WeakClaim(this)] {
254             auto delegate = weak.Upgrade();
255             if (delegate && delegate->onRemoteTerminatedCallBack_) {
256                 delegate->onRemoteTerminatedCallBack_();
257             }
258         },
259         TaskExecutor::TaskType::JS);
260 }
261 
OnSaveData(std::string & data)262 void FrontendDelegateDeclarativeNG::OnSaveData(std::string& data)
263 {
264     std::string savedData;
265     taskExecutor_->PostSyncTask(
266         [weak = AceType::WeakClaim(this), &savedData] {
267             auto delegate = weak.Upgrade();
268             if (delegate && delegate->onSaveDataCallBack_) {
269                 delegate->onSaveDataCallBack_(savedData);
270             }
271         },
272         TaskExecutor::TaskType::JS);
273     std::string pageUri = GetCurrentPageUrl();
274     data = std::string("{\"url\":\"").append(pageUri).append("\",\"__remoteData\":").append(savedData).append("}");
275 }
276 
OnRestoreData(const std::string & data)277 bool FrontendDelegateDeclarativeNG::OnRestoreData(const std::string& data)
278 {
279     bool ret = false;
280     taskExecutor_->PostSyncTask(
281         [weak = AceType::WeakClaim(this), &data, &ret] {
282             auto delegate = weak.Upgrade();
283             if (delegate && delegate->onRestoreDataCallBack_) {
284                 ret = delegate->onRestoreDataCallBack_(data);
285             }
286         },
287         TaskExecutor::TaskType::JS);
288     return ret;
289 }
290 
OnApplicationDestroy(const std::string & packageName)291 void FrontendDelegateDeclarativeNG::OnApplicationDestroy(const std::string& packageName)
292 {
293     taskExecutor_->PostSyncTask(
294         [destroyApplication = destroyApplication_, packageName] { destroyApplication(packageName); },
295         TaskExecutor::TaskType::JS);
296 }
297 
UpdateApplicationState(const std::string & packageName,Frontend::State state)298 void FrontendDelegateDeclarativeNG::UpdateApplicationState(const std::string& packageName, Frontend::State state)
299 {
300     taskExecutor_->PostTask([updateApplicationState = updateApplicationState_, packageName,
301                                 state] { updateApplicationState(packageName, state); },
302         TaskExecutor::TaskType::JS);
303 }
304 
OnWindowDisplayModeChanged(bool isShownInMultiWindow,const std::string & data)305 void FrontendDelegateDeclarativeNG::OnWindowDisplayModeChanged(bool isShownInMultiWindow, const std::string& data)
306 {
307     taskExecutor_->PostTask([onWindowDisplayModeChanged = onWindowDisplayModeChanged_, isShownInMultiWindow,
308                                 data] { onWindowDisplayModeChanged(isShownInMultiWindow, data); },
309         TaskExecutor::TaskType::JS);
310 }
311 
NotifyAppStorage(const WeakPtr<Framework::JsEngine> & jsEngineWeak,const std::string & key,const std::string & value)312 void FrontendDelegateDeclarativeNG::NotifyAppStorage(
313     const WeakPtr<Framework::JsEngine>& jsEngineWeak, const std::string& key, const std::string& value)
314 {
315     taskExecutor_->PostTask(
316         [jsEngineWeak, key, value] {
317             auto jsEngine = jsEngineWeak.Upgrade();
318             if (!jsEngine) {
319                 return;
320             }
321             jsEngine->NotifyAppStorage(key, value);
322         },
323         TaskExecutor::TaskType::JS);
324 }
325 
FireAccessibilityEvent(const AccessibilityEvent & accessibilityEvent)326 void FrontendDelegateDeclarativeNG::FireAccessibilityEvent(const AccessibilityEvent& accessibilityEvent)
327 {
328     jsAccessibilityManager_->SendAccessibilityAsyncEvent(accessibilityEvent);
329 }
330 
InitializeAccessibilityCallback()331 void FrontendDelegateDeclarativeNG::InitializeAccessibilityCallback()
332 {
333     jsAccessibilityManager_->InitializeCallback();
334 }
335 
FireExternalEvent(const std::string &,const std::string & componentId,const uint32_t nodeId,const bool isDestroy)336 void FrontendDelegateDeclarativeNG::FireExternalEvent(
337     const std::string& /* eventId */, const std::string& componentId, const uint32_t nodeId, const bool isDestroy)
338 {
339     taskExecutor_->PostSyncTask(
340         [weak = AceType::WeakClaim(this), componentId, nodeId, isDestroy] {
341             auto delegate = weak.Upgrade();
342             if (delegate) {
343                 delegate->externalEvent_(componentId, nodeId, isDestroy);
344             }
345         },
346         TaskExecutor::TaskType::JS);
347 }
348 
WaitTimer(const std::string & callbackId,const std::string & delay,bool isInterval,bool isFirst)349 void FrontendDelegateDeclarativeNG::WaitTimer(
350     const std::string& callbackId, const std::string& delay, bool isInterval, bool isFirst)
351 {
352     if (!isFirst) {
353         auto timeoutTaskIter = timeoutTaskMap_.find(callbackId);
354         // If not find the callbackId in map, means this timer already was removed,
355         // no need create a new cancelableTimer again.
356         if (timeoutTaskIter == timeoutTaskMap_.end()) {
357             return;
358         }
359     }
360 
361     int32_t delayTime = StringToInt(delay);
362     // CancelableCallback class can only be executed once.
363     CancelableCallback<void()> cancelableTimer;
364     cancelableTimer.Reset([callbackId, delay, isInterval, call = timer_] { call(callbackId, delay, isInterval); });
365     auto result = timeoutTaskMap_.try_emplace(callbackId, cancelableTimer);
366     if (!result.second) {
367         result.first->second = cancelableTimer;
368     }
369     taskExecutor_->PostDelayedTask(cancelableTimer, TaskExecutor::TaskType::JS, delayTime);
370 }
371 
ClearTimer(const std::string & callbackId)372 void FrontendDelegateDeclarativeNG::ClearTimer(const std::string& callbackId)
373 {
374     auto timeoutTaskIter = timeoutTaskMap_.find(callbackId);
375     if (timeoutTaskIter != timeoutTaskMap_.end()) {
376         timeoutTaskIter->second.Cancel();
377         timeoutTaskMap_.erase(timeoutTaskIter);
378     }
379 }
380 
Push(const std::string & uri,const std::string & params)381 void FrontendDelegateDeclarativeNG::Push(const std::string& uri, const std::string& params)
382 {
383     CHECK_NULL_VOID(pageRouterManager_);
384     pageRouterManager_->Push(NG::RouterPageInfo({ uri, params }));
385     OnMediaQueryUpdate();
386 }
387 
PushWithMode(const std::string & uri,const std::string & params,uint32_t routerMode)388 void FrontendDelegateDeclarativeNG::PushWithMode(const std::string& uri, const std::string& params, uint32_t routerMode)
389 {
390     CHECK_NULL_VOID(pageRouterManager_);
391     pageRouterManager_->Push(NG::RouterPageInfo({ uri, params, static_cast<NG::RouterMode>(routerMode) }));
392     OnMediaQueryUpdate();
393 }
394 
PushWithCallback(const std::string & uri,const std::string & params,const std::function<void (const std::string &,int32_t)> & errorCallback,uint32_t routerMode)395 void FrontendDelegateDeclarativeNG::PushWithCallback(const std::string& uri, const std::string& params,
396     const std::function<void(const std::string&, int32_t)>& errorCallback, uint32_t routerMode)
397 {
398     CHECK_NULL_VOID(pageRouterManager_);
399     pageRouterManager_->Push(
400         NG::RouterPageInfo({ uri, params, static_cast<NG::RouterMode>(routerMode), errorCallback }));
401     OnMediaQueryUpdate();
402 }
403 
PushNamedRoute(const std::string & uri,const std::string & params,const std::function<void (const std::string &,int32_t)> & errorCallback,uint32_t routerMode)404 void FrontendDelegateDeclarativeNG::PushNamedRoute(const std::string& uri, const std::string& params,
405     const std::function<void(const std::string&, int32_t)>& errorCallback, uint32_t routerMode)
406 {
407     CHECK_NULL_VOID(pageRouterManager_);
408     pageRouterManager_->PushNamedRoute(
409         NG::RouterPageInfo({ uri, params, static_cast<NG::RouterMode>(routerMode), errorCallback }));
410     OnMediaQueryUpdate();
411 }
412 
Replace(const std::string & uri,const std::string & params)413 void FrontendDelegateDeclarativeNG::Replace(const std::string& uri, const std::string& params)
414 {
415     CHECK_NULL_VOID(pageRouterManager_);
416     pageRouterManager_->Replace(NG::RouterPageInfo({ uri, params }));
417 }
418 
ReplaceWithMode(const std::string & uri,const std::string & params,uint32_t routerMode)419 void FrontendDelegateDeclarativeNG::ReplaceWithMode(
420     const std::string& uri, const std::string& params, uint32_t routerMode)
421 {
422     CHECK_NULL_VOID(pageRouterManager_);
423     pageRouterManager_->Replace(NG::RouterPageInfo({ uri, params, static_cast<NG::RouterMode>(routerMode) }));
424     OnMediaQueryUpdate();
425 }
426 
ReplaceWithCallback(const std::string & uri,const std::string & params,const std::function<void (const std::string &,int32_t)> & errorCallback,uint32_t routerMode)427 void FrontendDelegateDeclarativeNG::ReplaceWithCallback(const std::string& uri, const std::string& params,
428     const std::function<void(const std::string&, int32_t)>& errorCallback, uint32_t routerMode)
429 {
430     CHECK_NULL_VOID(pageRouterManager_);
431     pageRouterManager_->Replace(
432         NG::RouterPageInfo({ uri, params, static_cast<NG::RouterMode>(routerMode), errorCallback }));
433     OnMediaQueryUpdate();
434 }
435 
ReplaceNamedRoute(const std::string & uri,const std::string & params,const std::function<void (const std::string &,int32_t)> & errorCallback,uint32_t routerMode)436 void FrontendDelegateDeclarativeNG::ReplaceNamedRoute(const std::string& uri, const std::string& params,
437     const std::function<void(const std::string&, int32_t)>& errorCallback, uint32_t routerMode)
438 {
439     CHECK_NULL_VOID(pageRouterManager_);
440     pageRouterManager_->ReplaceNamedRoute(
441         NG::RouterPageInfo({ uri, params, static_cast<NG::RouterMode>(routerMode), errorCallback }));
442     OnMediaQueryUpdate();
443 }
444 
Back(const std::string & uri,const std::string & params)445 void FrontendDelegateDeclarativeNG::Back(const std::string& uri, const std::string& params)
446 {
447     CHECK_NULL_VOID(pageRouterManager_);
448     pageRouterManager_->BackWithTarget(NG::RouterPageInfo({ uri, params }));
449 }
450 
Clear()451 void FrontendDelegateDeclarativeNG::Clear()
452 {
453     CHECK_NULL_VOID(pageRouterManager_);
454     pageRouterManager_->Clear();
455 }
456 
GetStackSize() const457 int32_t FrontendDelegateDeclarativeNG::GetStackSize() const
458 {
459     CHECK_NULL_RETURN(pageRouterManager_, 0);
460     return pageRouterManager_->GetStackSize();
461 }
462 
GetState(int32_t & index,std::string & name,std::string & path)463 void FrontendDelegateDeclarativeNG::GetState(int32_t& index, std::string& name, std::string& path)
464 {
465     CHECK_NULL_VOID(pageRouterManager_);
466     pageRouterManager_->GetState(index, name, path);
467 }
468 
GetParams()469 std::string FrontendDelegateDeclarativeNG::GetParams()
470 {
471     CHECK_NULL_RETURN(pageRouterManager_, "");
472     return pageRouterManager_->GetParams();
473 }
474 
NavigatePage(uint8_t type,const PageTarget & target,const std::string & params)475 void FrontendDelegateDeclarativeNG::NavigatePage(uint8_t type, const PageTarget& target, const std::string& params)
476 {
477     switch (static_cast<NavigatorType>(type)) {
478         case NavigatorType::PUSH:
479             Push(target.url, params);
480             break;
481         case NavigatorType::REPLACE:
482             Replace(target.url, params);
483             break;
484         case NavigatorType::BACK:
485             Back(target.url, params);
486             break;
487         default:
488             Back(target.url, params);
489     }
490 }
491 
PostJsTask(std::function<void ()> && task)492 void FrontendDelegateDeclarativeNG::PostJsTask(std::function<void()>&& task)
493 {
494     taskExecutor_->PostTask(task, TaskExecutor::TaskType::JS);
495 }
496 
GetAppID() const497 const std::string& FrontendDelegateDeclarativeNG::GetAppID() const
498 {
499     return manifestParser_->GetAppInfo()->GetAppID();
500 }
501 
GetAppName() const502 const std::string& FrontendDelegateDeclarativeNG::GetAppName() const
503 {
504     return manifestParser_->GetAppInfo()->GetAppName();
505 }
506 
GetVersionName() const507 const std::string& FrontendDelegateDeclarativeNG::GetVersionName() const
508 {
509     return manifestParser_->GetAppInfo()->GetVersionName();
510 }
511 
GetVersionCode() const512 int32_t FrontendDelegateDeclarativeNG::GetVersionCode() const
513 {
514     return manifestParser_->GetAppInfo()->GetVersionCode();
515 }
516 
PostSyncTaskToPage(std::function<void ()> && task)517 void FrontendDelegateDeclarativeNG::PostSyncTaskToPage(std::function<void()>&& task)
518 {
519     pipelineContextHolder_.Get(); // Wait until Pipeline Context is attached.
520     taskExecutor_->PostSyncTask(task, TaskExecutor::TaskType::UI);
521 }
522 
GetAssetContent(const std::string & url,std::string & content)523 bool FrontendDelegateDeclarativeNG::GetAssetContent(const std::string& url, std::string& content)
524 {
525     return GetAssetContentImpl(assetManager_, url, content);
526 }
527 
GetAssetContent(const std::string & url,std::vector<uint8_t> & content)528 bool FrontendDelegateDeclarativeNG::GetAssetContent(const std::string& url, std::vector<uint8_t>& content)
529 {
530     return GetAssetContentImpl(assetManager_, url, content);
531 }
532 
GetAssetPath(const std::string & url)533 std::string FrontendDelegateDeclarativeNG::GetAssetPath(const std::string& url)
534 {
535     return GetAssetPathImpl(assetManager_, url);
536 }
537 
ChangeLocale(const std::string & language,const std::string & countryOrRegion)538 void FrontendDelegateDeclarativeNG::ChangeLocale(const std::string& language, const std::string& countryOrRegion)
539 {
540     taskExecutor_->PostTask(
541         [language, countryOrRegion]() { AceApplicationInfo::GetInstance().ChangeLocale(language, countryOrRegion); },
542         TaskExecutor::TaskType::PLATFORM);
543 }
544 
RegisterFont(const std::string & familyName,const std::string & familySrc,const std::string & bundleName,const std::string & moduleName)545 void FrontendDelegateDeclarativeNG::RegisterFont(const std::string& familyName, const std::string& familySrc,
546     const std::string& bundleName, const std::string& moduleName)
547 {
548     pipelineContextHolder_.Get()->RegisterFont(familyName, familySrc, bundleName, moduleName);
549 }
550 
GetSystemFontList(std::vector<std::string> & fontList)551 void FrontendDelegateDeclarativeNG::GetSystemFontList(std::vector<std::string>& fontList)
552 {
553     pipelineContextHolder_.Get()->GetSystemFontList(fontList);
554 }
555 
GetSystemFont(const std::string & fontName,FontInfo & fontInfo)556 bool FrontendDelegateDeclarativeNG::GetSystemFont(const std::string& fontName, FontInfo& fontInfo)
557 {
558     return pipelineContextHolder_.Get()->GetSystemFont(fontName, fontInfo);
559 }
560 
GetUIFontConfig(FontConfigJsonInfo & fontConfigJsonInfo)561 void FrontendDelegateDeclarativeNG::GetUIFontConfig(FontConfigJsonInfo& fontConfigJsonInfo)
562 {
563     pipelineContextHolder_.Get()->GetUIFontConfig(fontConfigJsonInfo);
564 }
565 
MeasureText(const MeasureContext & context)566 double FrontendDelegateDeclarativeNG::MeasureText(const MeasureContext& context)
567 {
568     return MeasureUtil::MeasureText(context);
569 }
570 
MeasureTextSize(const MeasureContext & context)571 Size FrontendDelegateDeclarativeNG::MeasureTextSize(const MeasureContext& context)
572 {
573     return MeasureUtil::MeasureTextSize(context);
574 }
575 
GetAnimationJsTask()576 SingleTaskExecutor FrontendDelegateDeclarativeNG::GetAnimationJsTask()
577 {
578     return SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::JS);
579 }
580 
GetUiTask()581 SingleTaskExecutor FrontendDelegateDeclarativeNG::GetUiTask()
582 {
583     return SingleTaskExecutor::Make(taskExecutor_, TaskExecutor::TaskType::UI);
584 }
585 
GetPipelineContext()586 RefPtr<PipelineBase> FrontendDelegateDeclarativeNG::GetPipelineContext()
587 {
588     return pipelineContextHolder_.Get();
589 }
590 
OnPageBackPress()591 bool FrontendDelegateDeclarativeNG::OnPageBackPress()
592 {
593     CHECK_NULL_RETURN(pageRouterManager_, false);
594     auto pageNode = pageRouterManager_->GetCurrentPageNode();
595     CHECK_NULL_RETURN(pageNode, false);
596     auto pagePattern = pageNode->GetPattern<NG::PagePattern>();
597     CHECK_NULL_RETURN(pagePattern, false);
598     if (pagePattern->OnBackPressed()) {
599         return true;
600     }
601     return pageRouterManager_->Pop();
602 }
603 
OnSurfaceChanged()604 void FrontendDelegateDeclarativeNG::OnSurfaceChanged()
605 {
606     if (mediaQueryInfo_->GetIsInit()) {
607         mediaQueryInfo_->SetIsInit(false);
608     }
609     mediaQueryInfo_->EnsureListenerIdValid();
610     OnMediaQueryUpdate();
611 }
612 
ShowDialog(const std::string & title,const std::string & message,const std::vector<ButtonInfo> & buttons,bool autoCancel,std::function<void (int32_t,int32_t)> && callback,const std::set<std::string> & callbacks)613 void FrontendDelegateDeclarativeNG::ShowDialog(const std::string& title, const std::string& message,
614     const std::vector<ButtonInfo>& buttons, bool autoCancel, std::function<void(int32_t, int32_t)>&& callback,
615     const std::set<std::string>& callbacks)
616 {
617     TAG_LOGD(AceLogTag::ACE_OVERLAY, "show dialog enter");
618     DialogProperties dialogProperties = {
619         .title = title,
620         .content = message,
621         .autoCancel = autoCancel,
622         .buttons = buttons,
623     };
624     ShowDialogInner(dialogProperties, std::move(callback), callbacks);
625 }
626 
ShowDialog(const std::string & title,const std::string & message,const std::vector<ButtonInfo> & buttons,bool autoCancel,std::function<void (int32_t,int32_t)> && callback,const std::set<std::string> & callbacks,std::function<void (bool)> && onStatusChanged)627 void FrontendDelegateDeclarativeNG::ShowDialog(const std::string& title, const std::string& message,
628     const std::vector<ButtonInfo>& buttons, bool autoCancel, std::function<void(int32_t, int32_t)>&& callback,
629     const std::set<std::string>& callbacks, std::function<void(bool)>&& onStatusChanged)
630 {
631     TAG_LOGD(AceLogTag::ACE_OVERLAY, "show dialog enter");
632     DialogProperties dialogProperties = {
633         .title = title,
634         .content = message,
635         .autoCancel = autoCancel,
636         .buttons = buttons,
637         .onStatusChanged = std::move(onStatusChanged),
638     };
639     ShowDialogInner(dialogProperties, std::move(callback), callbacks);
640 }
641 
ShowDialog(const PromptDialogAttr & dialogAttr,const std::vector<ButtonInfo> & buttons,std::function<void (int32_t,int32_t)> && callback,const std::set<std::string> & callbacks)642 void FrontendDelegateDeclarativeNG::ShowDialog(const PromptDialogAttr& dialogAttr,
643     const std::vector<ButtonInfo>& buttons, std::function<void(int32_t, int32_t)>&& callback,
644     const std::set<std::string>& callbacks)
645 {
646     TAG_LOGD(AceLogTag::ACE_OVERLAY, "show dialog enter");
647     DialogProperties dialogProperties = {
648         .title = dialogAttr.title,
649         .content = dialogAttr.message,
650         .autoCancel = dialogAttr.autoCancel,
651         .buttons = buttons,
652         .isShowInSubWindow = dialogAttr.showInSubWindow,
653         .isModal = dialogAttr.isModal,
654         .maskRect = dialogAttr.maskRect,
655     };
656     if (dialogAttr.alignment.has_value()) {
657         dialogProperties.alignment = dialogAttr.alignment.value();
658     }
659     if (dialogAttr.offset.has_value()) {
660         dialogProperties.offset = dialogAttr.offset.value();
661     }
662     ShowDialogInner(dialogProperties, std::move(callback), callbacks);
663 }
664 
ShowDialog(const PromptDialogAttr & dialogAttr,const std::vector<ButtonInfo> & buttons,std::function<void (int32_t,int32_t)> && callback,const std::set<std::string> & callbacks,std::function<void (bool)> && onStatusChanged)665 void FrontendDelegateDeclarativeNG::ShowDialog(const PromptDialogAttr& dialogAttr,
666     const std::vector<ButtonInfo>& buttons, std::function<void(int32_t, int32_t)>&& callback,
667     const std::set<std::string>& callbacks, std::function<void(bool)>&& onStatusChanged)
668 {
669     TAG_LOGD(AceLogTag::ACE_OVERLAY, "show dialog enter");
670     DialogProperties dialogProperties = {
671         .title = dialogAttr.title,
672         .content = dialogAttr.message,
673         .autoCancel = dialogAttr.autoCancel,
674         .buttons = buttons,
675         .isShowInSubWindow = dialogAttr.showInSubWindow,
676         .isModal = dialogAttr.isModal,
677         .onStatusChanged = std::move(onStatusChanged),
678         .maskRect = dialogAttr.maskRect,
679     };
680     if (dialogAttr.alignment.has_value()) {
681         dialogProperties.alignment = dialogAttr.alignment.value();
682     }
683     if (dialogAttr.offset.has_value()) {
684         dialogProperties.offset = dialogAttr.offset.value();
685     }
686     ShowDialogInner(dialogProperties, std::move(callback), callbacks);
687 }
688 
ShowActionMenu(const std::string & title,const std::vector<ButtonInfo> & button,std::function<void (int32_t,int32_t)> && callback)689 void FrontendDelegateDeclarativeNG::ShowActionMenu(
690     const std::string& title, const std::vector<ButtonInfo>& button, std::function<void(int32_t, int32_t)>&& callback)
691 {
692     TAG_LOGD(AceLogTag::ACE_OVERLAY, "show action menu enter");
693     DialogProperties dialogProperties = {
694         .title = title,
695         .autoCancel = true,
696         .isMenu = true,
697         .buttons = button,
698     };
699     ShowActionMenuInner(dialogProperties, button, std::move(callback));
700 }
701 
ShowActionMenu(const std::string & title,const std::vector<ButtonInfo> & button,std::function<void (int32_t,int32_t)> && callback,std::function<void (bool)> && onStatusChanged)702 void FrontendDelegateDeclarativeNG::ShowActionMenu(const std::string& title, const std::vector<ButtonInfo>& button,
703     std::function<void(int32_t, int32_t)>&& callback, std::function<void(bool)>&& onStatusChanged)
704 {
705     TAG_LOGD(AceLogTag::ACE_OVERLAY, "show action menu enter");
706     DialogProperties dialogProperties = {
707         .title = title,
708         .autoCancel = true,
709         .isMenu = true,
710         .buttons = button,
711         .onStatusChanged = std::move(onStatusChanged),
712     };
713     ShowActionMenuInner(dialogProperties, button, std::move(callback));
714 }
715 
OnMediaQueryUpdate(bool isSynchronous)716 void FrontendDelegateDeclarativeNG::OnMediaQueryUpdate(bool isSynchronous)
717 {
718     auto containerId = Container::CurrentId();
719     if (containerId < 0) {
720         auto container = Container::GetActive();
721         if (container) {
722             containerId = container->GetInstanceId();
723         }
724     }
725     bool isInSubwindow = containerId >= 1000000;
726     if (isInSubwindow) {
727         return;
728     }
729     if (mediaQueryInfo_->GetIsInit()) {
730         return;
731     }
732 
733     taskExecutor_->PostTask(
734         [weak = AceType::WeakClaim(this)] {
735             auto delegate = weak.Upgrade();
736             if (!delegate) {
737                 return;
738             }
739             const auto& info = delegate->mediaQueryInfo_->GetMediaQueryInfo();
740 
741             // request js media query
742             const auto& listenerId = delegate->mediaQueryInfo_->GetListenerId();
743             delegate->mediaQueryCallback_(listenerId, info);
744             delegate->mediaQueryInfo_->ResetListenerId();
745         },
746         TaskExecutor::TaskType::JS);
747 }
748 
OnLayoutCompleted(const std::string & componentId)749 void FrontendDelegateDeclarativeNG::OnLayoutCompleted(const std::string& componentId)
750 {
751     taskExecutor_->PostTask(
752         [weak = AceType::WeakClaim(this), componentId] {
753             auto delegate = weak.Upgrade();
754             if (!delegate) {
755                 return;
756             }
757             delegate->layoutInspectorCallback_(componentId);
758         },
759         TaskExecutor::TaskType::JS);
760 }
761 
OnDrawCompleted(const std::string & componentId)762 void FrontendDelegateDeclarativeNG::OnDrawCompleted(const std::string& componentId)
763 {
764     taskExecutor_->PostTask(
765         [weak = AceType::WeakClaim(this), componentId] {
766             auto delegate = weak.Upgrade();
767             if (!delegate) {
768                 return;
769             }
770             delegate->drawInspectorCallback_(componentId);
771         },
772         TaskExecutor::TaskType::JS);
773 }
774 
SetColorMode(ColorMode colorMode)775 void FrontendDelegateDeclarativeNG::SetColorMode(ColorMode colorMode)
776 {
777     OnMediaQueryUpdate();
778 }
779 
OnForeground()780 void FrontendDelegateDeclarativeNG::OnForeground()
781 {
782     if (!isFirstNotifyShow_) {
783         OnPageShow();
784     }
785     isFirstNotifyShow_ = false;
786 }
787 
GetCurrentPageUrl()788 std::string FrontendDelegateDeclarativeNG::GetCurrentPageUrl()
789 {
790     CHECK_NULL_RETURN(pageRouterManager_, "");
791     return pageRouterManager_->GetCurrentPageUrl();
792 }
793 
794 // Get the currently running JS page information in NG structure.
GetCurrentPageSourceMap()795 RefPtr<RevSourceMap> FrontendDelegateDeclarativeNG::GetCurrentPageSourceMap()
796 {
797     CHECK_NULL_RETURN(pageRouterManager_, nullptr);
798     return pageRouterManager_->GetCurrentPageSourceMap(assetManager_);
799 }
800 
801 // Get the currently running JS page information in NG structure.
GetFaAppSourceMap()802 RefPtr<RevSourceMap> FrontendDelegateDeclarativeNG::GetFaAppSourceMap()
803 {
804     if (appSourceMap_) {
805         return appSourceMap_;
806     }
807     std::string appMap;
808     if (GetAssetContent("app.js.map", appMap)) {
809         appSourceMap_ = AceType::MakeRefPtr<RevSourceMap>();
810         appSourceMap_->Init(appMap);
811     }
812     return appSourceMap_;
813 }
814 
GetStageSourceMap(std::unordered_map<std::string,RefPtr<Framework::RevSourceMap>> & sourceMaps)815 void FrontendDelegateDeclarativeNG::GetStageSourceMap(
816     std::unordered_map<std::string, RefPtr<Framework::RevSourceMap>>& sourceMaps)
817 {
818     std::string maps;
819     if (GetAssetContent(MERGE_SOURCEMAPS_PATH, maps)) {
820         auto SourceMap = AceType::MakeRefPtr<RevSourceMap>();
821         SourceMap->StageModeSourceMapSplit(maps, sourceMaps);
822     }
823 }
824 
CallPopPage()825 void FrontendDelegateDeclarativeNG::CallPopPage()
826 {
827     Back("", "");
828 }
829 
PostponePageTransition()830 void FrontendDelegateDeclarativeNG::PostponePageTransition()
831 {
832     taskExecutor_->PostTask(
833         [weak = AceType::WeakClaim(this)] {
834             auto delegate = weak.Upgrade();
835             if (!delegate) {
836                 return;
837             }
838             auto pipelineContext = delegate->pipelineContextHolder_.Get();
839             pipelineContext->PostponePageTransition();
840         },
841         TaskExecutor::TaskType::UI);
842 }
843 
LaunchPageTransition()844 void FrontendDelegateDeclarativeNG::LaunchPageTransition()
845 {
846     taskExecutor_->PostTask(
847         [weak = AceType::WeakClaim(this)] {
848             auto delegate = weak.Upgrade();
849             if (!delegate) {
850                 return;
851             }
852             auto pipelineContext = delegate->pipelineContextHolder_.Get();
853             pipelineContext->LaunchPageTransition();
854         },
855         TaskExecutor::TaskType::UI);
856 }
857 
GetComponentsCount()858 size_t FrontendDelegateDeclarativeNG::GetComponentsCount()
859 {
860     CHECK_NULL_RETURN(pageRouterManager_, 0);
861     auto pageNode = pageRouterManager_->GetCurrentPageNode();
862     CHECK_NULL_RETURN(pageNode, 0);
863     return pageNode->GetAllDepthChildrenCount();
864 }
865 
ShowToast(const std::string & message,int32_t duration,const std::string & bottom,const NG::ToastShowMode & showMode)866 void FrontendDelegateDeclarativeNG::ShowToast(
867     const std::string& message, int32_t duration, const std::string& bottom, const NG::ToastShowMode& showMode)
868 {
869     TAG_LOGD(AceLogTag::ACE_OVERLAY, "show toast enter");
870     int32_t durationTime = std::clamp(duration, TOAST_TIME_DEFAULT, TOAST_TIME_MAX);
871     bool isRightToLeft = AceApplicationInfo::GetInstance().IsRightToLeft();
872     auto task = [durationTime, message, bottom, isRightToLeft, showMode, containerId = Container::CurrentId()](
873                     const RefPtr<NG::OverlayManager>& overlayManager) {
874         CHECK_NULL_VOID(overlayManager);
875         ContainerScope scope(containerId);
876         overlayManager->ShowToast(message, durationTime, bottom, isRightToLeft, showMode);
877     };
878     MainWindowOverlay(std::move(task));
879 }
880 
ShowDialogInner(DialogProperties & dialogProperties,std::function<void (int32_t,int32_t)> && callback,const std::set<std::string> & callbacks)881 void FrontendDelegateDeclarativeNG::ShowDialogInner(DialogProperties& dialogProperties,
882     std::function<void(int32_t, int32_t)>&& callback, const std::set<std::string>& callbacks)
883 {
884     TAG_LOGD(AceLogTag::ACE_OVERLAY, "show dialog inner enter");
885     dialogProperties.onSuccess = std::move(callback);
886     dialogProperties.onCancel = [callback, taskExecutor = taskExecutor_] {
887         taskExecutor->PostTask(
888             [callback]() { callback(CALLBACK_ERRORCODE_CANCEL, CALLBACK_DATACODE_ZERO); }, TaskExecutor::TaskType::JS);
889     };
890     auto task = [dialogProperties](const RefPtr<NG::OverlayManager>& overlayManager) {
891         RefPtr<NG::FrameNode> dialog;
892         CHECK_NULL_VOID(overlayManager);
893         LOGI("Begin to show dialog ");
894         if (dialogProperties.isShowInSubWindow) {
895             dialog = SubwindowManager::GetInstance()->ShowDialogNG(dialogProperties, nullptr);
896             CHECK_NULL_VOID(dialog);
897             if (dialogProperties.isModal) {
898                 DialogProperties Maskarg;
899                 Maskarg.isMask = true;
900                 Maskarg.autoCancel = dialogProperties.autoCancel;
901                 auto mask = overlayManager->ShowDialog(Maskarg, nullptr, false);
902                 CHECK_NULL_VOID(mask);
903             }
904         } else {
905             dialog = overlayManager->ShowDialog(
906                 dialogProperties, nullptr, AceApplicationInfo::GetInstance().IsRightToLeft());
907             CHECK_NULL_VOID(dialog);
908         }
909     };
910     MainWindowOverlay(std::move(task));
911     return;
912 }
913 
ShowActionMenuInner(DialogProperties & dialogProperties,const std::vector<ButtonInfo> & button,std::function<void (int32_t,int32_t)> && callback)914 void FrontendDelegateDeclarativeNG::ShowActionMenuInner(DialogProperties& dialogProperties,
915     const std::vector<ButtonInfo>& button, std::function<void(int32_t, int32_t)>&& callback)
916 {
917     TAG_LOGD(AceLogTag::ACE_OVERLAY, "show action menu inner enter");
918     ButtonInfo buttonInfo = { .text = Localization::GetInstance()->GetEntryLetters("common.cancel"), .textColor = "" };
919     dialogProperties.buttons.emplace_back(buttonInfo);
920     dialogProperties.onSuccess = std::move(callback);
921     dialogProperties.onCancel = [callback, taskExecutor = taskExecutor_] {
922         taskExecutor->PostTask(
923             [callback]() { callback(CALLBACK_ERRORCODE_CANCEL, CALLBACK_DATACODE_ZERO); }, TaskExecutor::TaskType::JS);
924     };
925     auto context = DynamicCast<NG::PipelineContext>(pipelineContextHolder_.Get());
926     auto overlayManager = context ? context->GetOverlayManager() : nullptr;
927     taskExecutor_->PostTask(
928         [dialogProperties, weak = WeakPtr<NG::OverlayManager>(overlayManager)] {
929             auto overlayManager = weak.Upgrade();
930             CHECK_NULL_VOID(overlayManager);
931             overlayManager->ShowDialog(dialogProperties, nullptr, AceApplicationInfo::GetInstance().IsRightToLeft());
932         },
933         TaskExecutor::TaskType::UI);
934     return;
935 }
936 
EnableAlertBeforeBackPage(const std::string & message,std::function<void (int32_t)> && callback)937 void FrontendDelegateDeclarativeNG::EnableAlertBeforeBackPage(
938     const std::string& message, std::function<void(int32_t)>&& callback)
939 {
940     CHECK_NULL_VOID(pageRouterManager_);
941     pageRouterManager_->EnableAlertBeforeBackPage(message, std::move(callback));
942     return;
943 }
944 
DisableAlertBeforeBackPage()945 void FrontendDelegateDeclarativeNG::DisableAlertBeforeBackPage()
946 {
947     CHECK_NULL_VOID(pageRouterManager_);
948     pageRouterManager_->DisableAlertBeforeBackPage();
949     return;
950 }
951 
RebuildAllPages()952 void FrontendDelegateDeclarativeNG::RebuildAllPages()
953 {
954     CHECK_NULL_VOID(pageRouterManager_);
955     auto url = pageRouterManager_->GetCurrentPageUrl();
956     pageRouterManager_->Clear();
957     pageRouterManager_->RunPage(url, "");
958     return;
959 }
960 
OnPageShow()961 void FrontendDelegateDeclarativeNG::OnPageShow()
962 {
963     CHECK_NULL_VOID(pageRouterManager_);
964     auto pageNode = pageRouterManager_->GetCurrentPageNode();
965     CHECK_NULL_VOID(pageNode);
966     auto pagePattern = pageNode->GetPattern<NG::PagePattern>();
967     CHECK_NULL_VOID(pagePattern);
968     pagePattern->OnShow();
969 }
970 
OnPageHide()971 void FrontendDelegateDeclarativeNG::OnPageHide()
972 {
973     CHECK_NULL_VOID(pageRouterManager_);
974     auto pageNode = pageRouterManager_->GetCurrentPageNode();
975     CHECK_NULL_VOID(pageNode);
976     auto pagePattern = pageNode->GetPattern<NG::PagePattern>();
977     CHECK_NULL_VOID(pagePattern);
978     pagePattern->OnHide();
979 }
980 
GetSnapshot(const std::string & componentId,NG::ComponentSnapshot::JsCallback && callback)981 void FrontendDelegateDeclarativeNG::GetSnapshot(
982     const std::string& componentId, NG::ComponentSnapshot::JsCallback&& callback)
983 {
984 #ifdef ENABLE_ROSEN_BACKEND
985     NG::ComponentSnapshot::Get(componentId, std::move(callback));
986 #endif
987 }
988 
GetContentInfo()989 std::string FrontendDelegateDeclarativeNG::GetContentInfo()
990 {
991     auto jsonContentInfo = JsonUtil::Create(true);
992 
993     CHECK_NULL_RETURN(pageRouterManager_, "");
994     jsonContentInfo->Put("stackInfo", pageRouterManager_->GetStackInfo());
995 
996     auto pipelineContext = pipelineContextHolder_.Get();
997     CHECK_NULL_RETURN(pipelineContext, jsonContentInfo->ToString());
998     jsonContentInfo->Put("nodeInfo", pipelineContext->GetStoredNodeInfo());
999 
1000     return jsonContentInfo->ToString();
1001 }
1002 
CreateSnapshot(std::function<void ()> && customBuilder,NG::ComponentSnapshot::JsCallback && callback,bool enableInspector)1003 void FrontendDelegateDeclarativeNG::CreateSnapshot(
1004     std::function<void()>&& customBuilder, NG::ComponentSnapshot::JsCallback&& callback, bool enableInspector)
1005 {
1006 #ifdef ENABLE_ROSEN_BACKEND
1007     ViewStackModel::GetInstance()->NewScope();
1008     CHECK_NULL_VOID(customBuilder);
1009     customBuilder();
1010     auto customNode = ViewStackModel::GetInstance()->Finish();
1011 
1012     NG::ComponentSnapshot::Create(customNode, std::move(callback), enableInspector);
1013 #endif
1014 }
1015 
1016 } // namespace OHOS::Ace::Framework
1017