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