• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "frameworks/bridge/declarative_frontend/jsview/js_navdestination.h"
17 
18 #include "base/log/ace_scoring_log.h"
19 #include "base/memory/ace_type.h"
20 #include "base/utils/utils.h"
21 #include "base/system_bar/system_bar_style.h"
22 #include "bridge/declarative_frontend/engine/functions/js_function.h"
23 #include "bridge/declarative_frontend/engine/js_converter.h"
24 #include "bridge/declarative_frontend/engine/js_execution_scope_defines.h"
25 #include "bridge/declarative_frontend/engine/js_ref_ptr.h"
26 #include "bridge/declarative_frontend/engine/js_types.h"
27 #include "bridge/declarative_frontend/jsview/js_navdestination_context.h"
28 #include "bridge/declarative_frontend/jsview/js_navigation.h"
29 #include "bridge/declarative_frontend/jsview/js_navigation_utils.h"
30 #include "bridge/declarative_frontend/jsview/js_utils.h"
31 #include "core/components_ng/base/view_stack_model.h"
32 #include "core/components_ng/base/view_stack_processor.h"
33 #include "core/components_ng/pattern/navigation/navigation_options.h"
34 #include "core/components_ng/pattern/navrouter/navdestination_model_ng.h"
35 
36 namespace OHOS::Ace {
37 std::unique_ptr<NavDestinationModel> NavDestinationModel::instance_ = nullptr;
38 std::mutex NavDestinationModel::mutex_;
39 
GetInstance()40 NavDestinationModel* NavDestinationModel::GetInstance()
41 {
42     if (!instance_) {
43         std::lock_guard<std::mutex> lock(mutex_);
44         instance_.reset(new NG::NavDestinationModelNG());
45     }
46     return instance_.get();
47 }
48 
49 } // namespace OHOS::Ace
50 
51 namespace OHOS::Ace::Framework {
52 
53 namespace {
54 constexpr uint32_t SAFE_AREA_TYPE_LIMIT = 3;
55 constexpr uint32_t SAFE_AREA_EDGE_LIMIT = 4;
56 constexpr uint32_t SAFE_AREA_EDGE_SYSTEM = 0;
57 constexpr uint32_t SAFE_AREA_EDGE_TOP = 0;
58 constexpr uint32_t SAFE_AREA_EDGE_BOTTOM = 1;
59 constexpr int32_t PARAMATER_LENGTH_ONE = 1;
60 constexpr int32_t PARAMATER_LENGTH_TWO = 2;
61 constexpr uint32_t FIRST_INDEX = 0;
62 constexpr uint32_t SECOND_INDEX = 1;
63 
ParseCommonTitle(const JSRef<JSObject> & jsObj)64 bool ParseCommonTitle(const JSRef<JSObject>& jsObj)
65 {
66     JSRef<JSVal> subtitle = jsObj->GetProperty("sub");
67     JSRef<JSVal> title = jsObj->GetProperty("main");
68     bool hasSub = subtitle->IsString();
69     bool hasMain = title->IsString();
70     if (hasSub || hasMain) {
71         return NG::NavDestinationModelNG::GetInstance()->ParseCommonTitle(
72             hasSub, hasMain, subtitle->ToString(), title->ToString());
73     }
74     return false;
75 }
76 
77 } // namespace
78 
Create()79 void JSNavDestination::Create()
80 {
81     NavDestinationModel::GetInstance()->Create();
82 }
83 
Create(const JSCallbackInfo & info)84 void JSNavDestination::Create(const JSCallbackInfo& info)
85 {
86     if (info.Length() <= 0) {
87         NavDestinationModel::GetInstance()->Create();
88         return;
89     }
90 
91     std::string moduleName;
92     std::string pagePath;
93     if (info.Length() == 1) {
94         // input format: builder/pathInfo
95         if (info[0]->IsFunction()) {
96             // first parameter = builder
97             auto builderFunctionJS = info[0];
98             auto builderFunc = [context = info.GetExecutionContext(), builder = std::move(builderFunctionJS)]() {
99                 JAVASCRIPT_EXECUTION_SCOPE(context)
100                 JSRef<JSFunc>::Cast(builder)->Call(JSRef<JSObject>());
101             };
102             auto ctx = AceType::MakeRefPtr<NG::NavDestinationContext>();
103             auto navPathInfo = AceType::MakeRefPtr<JSNavPathInfo>();
104             ctx->SetNavPathInfo(navPathInfo);
105             NavDestinationModel::GetInstance()->Create(std::move(builderFunc), std::move(ctx));
106             return;
107         } else if (info[0]->IsObject()) {
108             // first parameter = pathInfo{'moduleName': stringA, 'pagePath': stringB}
109             auto infoObj = JSRef<JSObject>::Cast(info[0]);
110             if (!infoObj->GetProperty(NG::NAVIGATION_MODULE_NAME)->IsString() ||
111                 !infoObj->GetProperty(NG::NAVIGATION_PAGE_PATH)->IsString()) {
112                 TAG_LOGE(AceLogTag::ACE_NAVIGATION, "navDestination current pageInfo is invalid");
113                 return;
114             }
115             moduleName = infoObj->GetProperty(NG::NAVIGATION_MODULE_NAME)->ToString();
116             pagePath = infoObj->GetProperty(NG::NAVIGATION_PAGE_PATH)->ToString();
117             NavDestinationModel::GetInstance()->Create();
118             NavDestinationModel::GetInstance()->SetNavDestinationPathInfo(moduleName, pagePath);
119             return;
120         }
121         TAG_LOGE(AceLogTag::ACE_NAVIGATION,
122             "current input info is neither buildFunction or navDestination usefulInfo");
123         return;
124     } else if (info.Length() == 2) {
125         // parameter = builder(maybe empty) + pathInfo
126         if (!info[0]->IsFunction() || !info[1]->IsObject()) {
127             TAG_LOGE(AceLogTag::ACE_NAVIGATION, "buider or pageInfo is invalid");
128             return;
129         }
130         auto builderFunctionJS = info[0];
131         auto builderFunc = [context = info.GetExecutionContext(), builder = std::move(builderFunctionJS)]() {
132             JAVASCRIPT_EXECUTION_SCOPE(context)
133             JSRef<JSFunc>::Cast(builder)->Call(JSRef<JSObject>());
134         };
135         auto ctx = AceType::MakeRefPtr<NG::NavDestinationContext>();
136         auto navPathInfo = AceType::MakeRefPtr<JSNavPathInfo>();
137         ctx->SetNavPathInfo(navPathInfo);
138 
139         auto infoObj = JSRef<JSObject>::Cast(info[1]);
140         if (!infoObj->GetProperty(NG::NAVIGATION_MODULE_NAME)->IsString() ||
141             !infoObj->GetProperty(NG::NAVIGATION_PAGE_PATH)->IsString()) {
142             TAG_LOGE(AceLogTag::ACE_NAVIGATION, "navDestination current pageInfo is invalid");
143             return;
144         }
145         moduleName = infoObj->GetProperty(NG::NAVIGATION_MODULE_NAME)->ToString();
146         pagePath = infoObj->GetProperty(NG::NAVIGATION_PAGE_PATH)->ToString();
147         NavDestinationModel::GetInstance()->Create(std::move(builderFunc), std::move(ctx));
148         NavDestinationModel::GetInstance()->SetNavDestinationPathInfo(moduleName, pagePath);
149     }
150 }
151 
SetHideTitleBar(const JSCallbackInfo & info)152 void JSNavDestination::SetHideTitleBar(const JSCallbackInfo& info)
153 {
154     bool isHide = false;
155     if (info.Length() > 0 && info[0]->IsBoolean()) {
156         isHide = info[0]->ToBoolean();
157     }
158     bool isAnimated = false;
159     if (info.Length() > 1 && info[1]->IsBoolean()) {
160         isAnimated = info[1]->ToBoolean();
161     }
162     NavDestinationModel::GetInstance()->SetHideTitleBar(isHide, isAnimated);
163 }
164 
SetTitle(const JSCallbackInfo & info)165 void JSNavDestination::SetTitle(const JSCallbackInfo& info)
166 {
167     // Resource and string type.
168     std::string title;
169     if (ParseJsString(info[0], title)) {
170         NavDestinationModel::GetInstance()->ParseCommonTitle(false, true, "", title);
171     } else if (info[0]->IsObject()) {
172         JSRef<JSObject> jsObj = JSRef<JSObject>::Cast(info[0]);
173         do {
174             // NavigationCommonTitle
175             if (ParseCommonTitle(jsObj)) {
176                 break;
177             }
178             // CustomBuilder | NavigationCustomTitle
179             CalcDimension titleHeight;
180             if (!jsObj->HasProperty("height")) {
181                 NavDestinationModel::GetInstance()->SetTitleHeight(titleHeight, false);
182                 break;
183             }
184             JSRef<JSVal> height = jsObj->GetProperty("height");
185             bool isValid = JSContainerBase::ParseJsDimensionVpNG(height, titleHeight);
186             if (height->IsString()) {
187                 std::string heightValue;
188                 ParseJsString(height, heightValue);
189                 if (heightValue == NG::TITLE_MAIN_WITH_SUB) {
190                     NavDestinationModel::GetInstance()->SetTitleHeight(NG::DOUBLE_LINE_TITLEBAR_HEIGHT);
191                     break;
192                 }
193                 if (heightValue == NG::TITLE_MAIN) {
194                     NavDestinationModel::GetInstance()->SetTitleHeight(NG::SINGLE_LINE_TITLEBAR_HEIGHT);
195                     break;
196                 }
197             }
198             if (!isValid || titleHeight.Value() < 0) {
199                 NavDestinationModel::GetInstance()->SetTitleHeight(Dimension(), true);
200                 break;
201             }
202             NavDestinationModel::GetInstance()->SetTitleHeight(titleHeight);
203         } while (0);
204         JSRef<JSVal> builderObject = jsObj->GetProperty("builder");
205         if (builderObject->IsFunction()) {
206             ViewStackModel::GetInstance()->NewScope();
207             JsFunction jsBuilderFunc(info.This(), JSRef<JSFunc>::Cast(builderObject));
208             ACE_SCORING_EVENT("Navdestination.title.builder");
209             jsBuilderFunc.Execute();
210             auto customNode = ViewStackModel::GetInstance()->Finish();
211             NavDestinationModel::GetInstance()->SetCustomTitle(customNode);
212         }
213     } else {
214         NavDestinationModel::GetInstance()->ParseCommonTitle(false, false, "", "");
215     }
216 
217     NG::NavigationTitlebarOptions options;
218     JSNavigationUtils::ParseTitleBarOptions(info, false, options);
219     NavDestinationModel::GetInstance()->SetTitlebarOptions(std::move(options));
220 }
221 
SetBackButtonIcon(const JSCallbackInfo & info)222 void JSNavDestination::SetBackButtonIcon(const JSCallbackInfo& info)
223 {
224     // srcType、pixmap、string
225     if (info.Length() < 1) {
226         return;
227     }
228     std::string src;
229     auto noPixMap = ParseJsMedia(info[0], src);
230 
231     RefPtr<PixelMap> pixMap = nullptr;
232     auto isValidImage = false;
233 #if defined(PIXEL_MAP_SUPPORTED)
234     if (!noPixMap) {
235         pixMap = CreatePixelMapFromNapiValue(info[0]);
236     }
237 #endif
238     if (noPixMap || pixMap != nullptr) {
239         isValidImage = true;
240     }
241     std::vector<std::string> nameList;
242     NG::ImageOption imageOption;
243     std::string bundleName;
244     std::string moduleName;
245     GetJsMediaBundleInfo(info[0], bundleName, moduleName);
246     nameList.emplace_back(bundleName);
247     nameList.emplace_back(moduleName);
248     imageOption.noPixMap = noPixMap;
249     imageOption.isValidImage = isValidImage;
250     std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol = nullptr;
251     auto isSymbol = info[0]->IsObject() && src.empty() && pixMap == nullptr;
252     if (isSymbol) {
253         SetSymbolOptionApply(info, iconSymbol, info[0]);
254     }
255 
256     NavDestinationModel::GetInstance()->SetBackButtonIcon(iconSymbol, src, imageOption, pixMap, nameList);
257 }
258 
SetOnShown(const JSCallbackInfo & info)259 void JSNavDestination::SetOnShown(const JSCallbackInfo& info)
260 {
261     if (!info[0]->IsFunction()) {
262         return;
263     }
264 
265     auto onShownCallback = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
266     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
267     auto onShown = [execCtx = info.GetExecutionContext(), func = std::move(onShownCallback), node = targetNode]() {
268         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
269         ACE_SCORING_EVENT("NavDestination.onShown");
270         PipelineContext::SetCallBackNode(node);
271         JSRef<JSVal> params[1];
272         params[0] = JSRef<JSVal>::Make(ToJSValue("undefined"));
273         func->ExecuteJS(1, params);
274     };
275     NavDestinationModel::GetInstance()->SetOnShown(std::move(onShown));
276     info.ReturnSelf();
277 }
278 
SetOnHidden(const JSCallbackInfo & info)279 void JSNavDestination::SetOnHidden(const JSCallbackInfo& info)
280 {
281     if (!info[0]->IsFunction()) {
282         return;
283     }
284     auto onHiddenCallback = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
285     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
286     auto onHidden = [execCtx = info.GetExecutionContext(), func = std::move(onHiddenCallback), node = targetNode]() {
287         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
288         ACE_SCORING_EVENT("NavDestination.onHidden");
289         PipelineContext::SetCallBackNode(node);
290         func->ExecuteJS();
291     };
292     NavDestinationModel::GetInstance()->SetOnHidden(std::move(onHidden));
293     info.ReturnSelf();
294 }
295 
SetOnBackPressed(const JSCallbackInfo & info)296 void JSNavDestination::SetOnBackPressed(const JSCallbackInfo& info)
297 {
298     if (!info[0]->IsFunction()) {
299         return;
300     }
301     auto onBackPressedCallback = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
302     auto onBackPressed = [execCtx = info.GetExecutionContext(), func = std::move(onBackPressedCallback)]() -> bool {
303         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx, false);
304         ACE_SCORING_EVENT("NavDestination.onBackPressed");
305         return (func->ExecuteJS())->ToBoolean();
306     };
307     NavDestinationModel::GetInstance()->SetOnBackPressed(std::move(onBackPressed));
308     info.ReturnSelf();
309 }
310 
SetOnReady(const JSCallbackInfo & info)311 void JSNavDestination::SetOnReady(const JSCallbackInfo& info)
312 {
313     if (!info[0]->IsFunction()) {
314         return;
315     }
316     auto onReadyCallback = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
317     auto onReady = [execCtx = info.GetExecutionContext(), func = std::move(onReadyCallback)](
318                        RefPtr<NG::NavDestinationContext> context) {
319         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
320         auto jsContext = JSClass<JSNavDestinationContext>::NewInstance();
321         auto jsNavDestinationContext = Referenced::Claim(jsContext->Unwrap<JSNavDestinationContext>());
322         CHECK_NULL_VOID(jsNavDestinationContext);
323         jsNavDestinationContext->SetNavDestinationContext(context);
324         ACE_SCORING_EVENT("NavDestination.onReady");
325         JSRef<JSVal> params[1];
326         params[0] = jsContext;
327         func->ExecuteJS(1, params);
328     };
329     NavDestinationModel::GetInstance()->SetOnReady(std::move(onReady));
330     info.ReturnSelf();
331 }
332 
SetMode(const JSCallbackInfo & info)333 void JSNavDestination::SetMode(const JSCallbackInfo& info)
334 {
335     if (!info[0]->IsNumber()) {
336         // set default back ground color
337         NavDestinationModel::GetInstance()->SetNavDestinationMode(NG::NavDestinationMode::STANDARD);
338         return;
339     }
340     auto mode = info[0]->ToNumber<int32_t>();
341     NavDestinationModel::GetInstance()->SetNavDestinationMode(static_cast<NG::NavDestinationMode>(mode));
342 }
343 
SetMenus(const JSCallbackInfo & info)344 void JSNavDestination::SetMenus(const JSCallbackInfo& info)
345 {
346     if (info.Length() < 1) {
347         return;
348     }
349 
350     if (info[0]->IsUndefined() || info[0]->IsArray()) {
351         std::vector<NG::BarItem> menuItems;
352         if (info[0]->IsUndefined()) {
353             menuItems = {};
354         } else {
355             auto targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
356             JSNavigationUtils::ParseBarItems(targetNode, info, JSRef<JSArray>::Cast(info[0]), menuItems);
357         }
358         NavDestinationModel::GetInstance()->SetMenuItems(std::move(menuItems));
359         return;
360     } else if (info[0]->IsObject()) {
361         auto builderObject = JSRef<JSObject>::Cast(info[0])->GetProperty("builder");
362         if (builderObject->IsFunction()) {
363             ViewStackModel::GetInstance()->NewScope();
364             JsFunction jsBuilderFunc(info.This(), JSRef<JSObject>::Cast(builderObject));
365             ACE_SCORING_EVENT("NavDestiNation.menu.builder");
366             jsBuilderFunc.Execute();
367             auto customNode = ViewStackModel::GetInstance()->Finish();
368             NavDestinationModel::GetInstance()->SetCustomMenu(customNode);
369         }
370     }
371 }
372 
SetBackgroundColor(const JSCallbackInfo & info)373 void JSNavDestination::SetBackgroundColor(const JSCallbackInfo& info)
374 {
375     Color backgroundColor;
376     bool isValid = ParseJsColor(info[0], backgroundColor);
377 
378     NavDestinationModel::GetInstance()->SetBackgroundColor(backgroundColor, isValid);
379 }
380 
SetWillAppear(const JSCallbackInfo & info)381 void JSNavDestination::SetWillAppear(const JSCallbackInfo& info)
382 {
383     if (!info[0]->IsFunction()) {
384         return;
385     }
386 
387     auto willAppear = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
388     auto onWillAppear = [execCtx = info.GetExecutionContext(), func = std::move(willAppear)]() {
389         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
390         ACE_SCORING_EVENT("NavDestination.WillAppear");
391         func->ExecuteJS();
392     };
393     NavDestinationModel::GetInstance()->SetOnWillAppear(std::move(onWillAppear));
394     info.ReturnSelf();
395 }
396 
SetWillHide(const JSCallbackInfo & info)397 void JSNavDestination::SetWillHide(const JSCallbackInfo& info)
398 {
399     if (!info[0]->IsFunction()) {
400         return;
401     }
402 
403     auto willHideCallback = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
404     auto onWillHide = [execCtx = info.GetExecutionContext(), func = std::move(willHideCallback)]() {
405         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
406         ACE_SCORING_EVENT("NavDestination.WillHide");
407         func->ExecuteJS();
408     };
409     NavDestinationModel::GetInstance()->SetOnWillHide(std::move(onWillHide));
410     info.ReturnSelf();
411 }
412 
SetWillShow(const JSCallbackInfo & info)413 void JSNavDestination::SetWillShow(const JSCallbackInfo& info)
414 {
415     if (!info[0]->IsFunction()) {
416         return;
417     }
418 
419     auto willShowCallback = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
420     auto onWillShow = [execCtx = info.GetExecutionContext(), func = std::move(willShowCallback)]() {
421         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
422         ACE_SCORING_EVENT("NavDestination.WillShow");
423         func->ExecuteJS();
424     };
425     NavDestinationModel::GetInstance()->SetOnWillShow(std::move(onWillShow));
426     info.ReturnSelf();
427 }
428 
SetToolBarConfiguration(const JSCallbackInfo & info)429 void JSNavDestination::SetToolBarConfiguration(const JSCallbackInfo& info)
430 {
431     if (info[0]->IsUndefined() || info[0]->IsArray()) {
432         std::vector<NG::BarItem> toolBarItems;
433         if (info[0]->IsArray()) {
434             auto targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
435             JSNavigationUtils::ParseToolbarItemsConfiguration(
436                 targetNode, info, JSRef<JSArray>::Cast(info[0]), toolBarItems);
437         }
438         NavDestinationModel::GetInstance()->SetToolbarConfiguration(std::move(toolBarItems));
439     } else if (info[0]->IsObject()) {
440         auto builderFuncParam = JSRef<JSObject>::Cast(info[0])->GetProperty("builder");
441         if (builderFuncParam->IsFunction()) {
442             ViewStackModel::GetInstance()->NewScope();
443             JsFunction jsBuilderFunc(builderFuncParam);
444             jsBuilderFunc.Execute();
445             auto customNode = ViewStackModel::GetInstance()->Finish();
446             NavDestinationModel::GetInstance()->SetCustomToolBar(customNode);
447         }
448     }
449     NG::NavigationToolbarOptions options;
450     JSNavigationUtils::ParseToolbarOptions(info, options);
451     NavDestinationModel::GetInstance()->SetToolBarOptions(std::move(options));
452 }
453 
SetHideToolBar(const JSCallbackInfo & info)454 void JSNavDestination::SetHideToolBar(const JSCallbackInfo& info)
455 {
456     bool isHide = false;
457     if (info.Length() > 0 && info[0]->IsBoolean()) {
458         isHide = info[0]->ToBoolean();
459     }
460     bool isAnimated = false;
461     if (info.Length() > 1 && info[1]->IsBoolean()) {
462         isAnimated = info[1]->ToBoolean();
463     }
464     NavDestinationModel::GetInstance()->SetHideToolBar(isHide, isAnimated);
465 }
466 
SetWillDisAppear(const JSCallbackInfo & info)467 void JSNavDestination::SetWillDisAppear(const JSCallbackInfo& info)
468 {
469     if (!info[0]->IsFunction()) {
470         return;
471     }
472 
473     auto WillDisAppear = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
474     auto onWillDisAppear = [execCtx = info.GetExecutionContext(), func = std::move(WillDisAppear)]() {
475         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
476         ACE_SCORING_EVENT("NavDestination.WillDisAppear");
477         func->ExecuteJS();
478     };
479     NavDestinationModel::GetInstance()->SetOnWillDisAppear(std::move(onWillDisAppear));
480     info.ReturnSelf();
481 }
482 
SetIgnoreLayoutSafeArea(const JSCallbackInfo & info)483 void JSNavDestination::SetIgnoreLayoutSafeArea(const JSCallbackInfo& info)
484 {
485     NG::SafeAreaExpandOpts opts { .type = NG::SAFE_AREA_TYPE_SYSTEM, .edges = NG::SAFE_AREA_EDGE_ALL};
486     if (info.Length() >= PARAMATER_LENGTH_ONE && info[FIRST_INDEX]->IsArray()) {
487         auto paramArray = JSRef<JSArray>::Cast(info[0]);
488         uint32_t safeAreaType = NG::SAFE_AREA_TYPE_NONE;
489         for (size_t i = 0; i < paramArray->Length(); ++i) {
490             auto value = paramArray->GetValueAt(i);
491             if (!value->IsNumber() ||
492                 value->ToNumber<uint32_t>() >= SAFE_AREA_TYPE_LIMIT ||
493                 value->ToNumber<uint32_t>() == SAFE_AREA_EDGE_SYSTEM) {
494                 safeAreaType = NG::SAFE_AREA_TYPE_SYSTEM;
495                 break;
496             }
497         }
498         opts.type = safeAreaType;
499     }
500 
501     if (info.Length() >= PARAMATER_LENGTH_TWO && info[SECOND_INDEX]->IsArray()) {
502         auto paramArray = JSRef<JSArray>::Cast(info[1]);
503         uint32_t safeAreaEdge = NG::SAFE_AREA_EDGE_NONE;
504         for (size_t i = 0; i < paramArray->Length(); ++i) {
505             auto value = paramArray->GetValueAt(i);
506             if (!value->IsNumber() ||
507                 value->ToNumber<uint32_t>() >= SAFE_AREA_EDGE_LIMIT) {
508                 safeAreaEdge = NG::SAFE_AREA_EDGE_ALL;
509                 break;
510             }
511             if (value->ToNumber<uint32_t>() == SAFE_AREA_EDGE_TOP ||
512                 value->ToNumber<uint32_t>() == SAFE_AREA_EDGE_BOTTOM) {
513                     safeAreaEdge |= (1 << value->ToNumber<uint32_t>());
514                 }
515         }
516         opts.edges = safeAreaEdge;
517     }
518     NavDestinationModel::GetInstance()->SetIgnoreLayoutSafeArea(opts);
519 }
520 
JSBind(BindingTarget globalObj)521 void JSNavDestination::JSBind(BindingTarget globalObj)
522 {
523     JSNavDestinationContext::JSBind(globalObj);
524     JSClass<JSNavDestination>::Declare("NavDestination");
525     JSClass<JSNavDestination>::StaticMethod("create", &JSNavDestination::Create);
526     JSClass<JSNavDestination>::StaticMethod("title", &JSNavDestination::SetTitle);
527     JSClass<JSNavDestination>::StaticMethod("hideTitleBar", &JSNavDestination::SetHideTitleBar);
528     JSClass<JSNavDestination>::StaticMethod("backButtonIcon", &JSNavDestination::SetBackButtonIcon);
529     JSClass<JSNavDestination>::StaticMethod("backgroundColor", &JSNavDestination::SetBackgroundColor);
530     JSClass<JSNavDestination>::StaticMethod("onShown", &JSNavDestination::SetOnShown);
531     JSClass<JSNavDestination>::StaticMethod("onHidden", &JSNavDestination::SetOnHidden);
532     JSClass<JSNavDestination>::StaticMethod("onBackPressed", &JSNavDestination::SetOnBackPressed);
533     JSClass<JSNavDestination>::StaticMethod("onReady", &JSNavDestination::SetOnReady);
534     JSClass<JSNavDestination>::StaticMethod("onAttach", &JSInteractableView::JsOnAttach);
535     JSClass<JSNavDestination>::StaticMethod("onAppear", &JSInteractableView::JsOnAppear);
536     JSClass<JSNavDestination>::StaticMethod("onDetach", &JSInteractableView::JsOnDetach);
537     JSClass<JSNavDestination>::StaticMethod("onDisAppear", &JSInteractableView::JsOnDisAppear);
538     JSClass<JSNavDestination>::StaticMethod("onTouch", &JSInteractableView::JsOnTouch);
539     JSClass<JSNavDestination>::StaticMethod("id", &JSViewAbstract::JsId);
540     JSClass<JSNavDestination>::StaticMethod("mode", &JSNavDestination::SetMode);
541     JSClass<JSNavDestination>::StaticMethod("menus", &JSNavDestination::SetMenus);
542     JSClass<JSNavDestination>::StaticMethod("onWillAppear", &JSNavDestination::SetWillAppear);
543     JSClass<JSNavDestination>::StaticMethod("onWillShow", &JSNavDestination::SetWillShow);
544     JSClass<JSNavDestination>::StaticMethod("toolbarConfiguration", &JSNavDestination::SetToolBarConfiguration);
545     JSClass<JSNavDestination>::StaticMethod("hideToolBar", &JSNavDestination::SetHideToolBar);
546     JSClass<JSNavDestination>::StaticMethod("onWillHide", &JSNavDestination::SetWillHide);
547     JSClass<JSNavDestination>::StaticMethod("onWillDisappear", &JSNavDestination::SetWillDisAppear);
548     JSClass<JSNavDestination>::StaticMethod("ignoreLayoutSafeArea", &JSNavDestination::SetIgnoreLayoutSafeArea);
549     JSClass<JSNavDestination>::StaticMethod("systemBarStyle", &JSNavDestination::SetSystemBarStyle);
550     JSClass<JSNavDestination>::InheritAndBind<JSContainerBase>(globalObj);
551 }
552 
SetSystemBarStyle(const JSCallbackInfo & info)553 void JSNavDestination::SetSystemBarStyle(const JSCallbackInfo& info)
554 {
555     RefPtr<SystemBarStyle> style = nullptr;
556     if (info.Length() == 1 && info[0]->IsObject()) {
557         auto styleObj = JsConverter::ConvertJsValToNapiValue(info[0]);
558         auto env = GetCurrentEnv();
559         if (env) {
560             style = SystemBarStyle::CreateStyleFromJsObj(env, styleObj);
561         }
562     }
563     NavDestinationModel::GetInstance()->SetSystemBarStyle(style);
564 }
565 } // namespace OHOS::Ace::Framework
566