1 /*
2 * Copyright (c) 2024 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 "bridge/declarative_frontend/jsview/js_navdestination_context.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 "bridge/declarative_frontend/engine/functions/js_function.h"
22 #include "bridge/declarative_frontend/engine/js_converter.h"
23 #include "bridge/declarative_frontend/engine/js_ref_ptr.h"
24 #include "bridge/declarative_frontend/engine/js_types.h"
25 #include "bridge/declarative_frontend/jsview/js_navigation_stack.h"
26 #include "bridge/declarative_frontend/jsview/js_utils.h"
27 #include "frameworks/core/components_ng/pattern/navigation/navigation_route.h"
28
29 namespace OHOS::Ace::Framework {
GetParamObj() const30 napi_value JSNavPathInfo::GetParamObj() const
31 {
32 return JsConverter::ConvertJsValToNapiValue(param_);
33 }
34
OpenScope()35 void JSNavPathInfo::OpenScope()
36 {
37 if (param_->IsEmpty()) {
38 return;
39 }
40 if (!scope_) {
41 scope_ = new LocalScope(param_->GetEcmaVM());
42 }
43 }
44
CloseScope()45 void JSNavPathInfo::CloseScope()
46 {
47 if (scope_) {
48 delete scope_;
49 scope_ = nullptr;
50 }
51 }
52
GetPathInfo(const JSCallbackInfo & info)53 void JSNavDestinationContext::GetPathInfo(const JSCallbackInfo& info)
54 {
55 JSRef<JSObject> obj = JSRef<JSObject>::New();
56 auto pathInfo = context_->GetNavPathInfo();
57 if (!pathInfo) {
58 info.SetReturnValue(obj);
59 return;
60 }
61 obj->SetProperty<std::string>("name", pathInfo->GetName());
62 obj->SetProperty<bool>("isEntry", pathInfo->GetIsEntry());
63 auto jsInfo = AceType::DynamicCast<JSNavPathInfo>(pathInfo);
64 JSRef<JSVal> param;
65 JSRef<JSVal> onPop;
66 if (jsInfo) {
67 param = jsInfo->GetParam();
68 onPop = jsInfo->GetOnPop();
69 }
70 if (!param->IsEmpty()) {
71 obj->SetPropertyObject("param", param);
72 }
73 if (!onPop->IsEmpty()) {
74 obj->SetPropertyObject("onPop", onPop);
75 }
76 info.SetReturnValue(obj);
77 }
78
SetPathInfo(const JSCallbackInfo & info)79 void JSNavDestinationContext::SetPathInfo(const JSCallbackInfo& info)
80 {
81 TAG_LOGI(AceLogTag::ACE_NAVIGATION, "navdestination context don't support set path stack");
82 }
83
GetPathStack(const JSCallbackInfo & info)84 void JSNavDestinationContext::GetPathStack(const JSCallbackInfo& info)
85 {
86 JSRef<JSObject> obj = JSRef<JSObject>::New();
87 auto stack = context_->GetNavigationStack().Upgrade();
88 if (!stack) {
89 info.SetReturnValue(obj);
90 return;
91 }
92 auto jsStack = AceType::DynamicCast<JSNavigationStack>(stack);
93 if (!jsStack) {
94 info.SetReturnValue(obj);
95 return;
96 }
97 auto navPathStackObj = jsStack->GetDataSourceObj();
98 if (navPathStackObj->IsEmpty()) {
99 info.SetReturnValue(obj);
100 return;
101 }
102 info.SetReturnValue(navPathStackObj);
103 }
104
SetPathStack(const JSCallbackInfo & info)105 void JSNavDestinationContext::SetPathStack(const JSCallbackInfo& info)
106 {
107 TAG_LOGI(AceLogTag::ACE_NAVIGATION, "navdestination context not support set path stack");
108 }
109
GetRouteInfo(const JSCallbackInfo & info)110 void JSNavDestinationContext::GetRouteInfo(const JSCallbackInfo& info)
111 {
112 auto container = Container::Current();
113 auto navigationRoute = container->GetNavigationRoute();
114 if (!navigationRoute) {
115 return;
116 }
117 auto param = context_->GetNavPathInfo();
118 CHECK_NULL_VOID(param);
119 NG::RouteItem routeInfo;
120 if (!navigationRoute->GetRouteItem(param->GetName(), routeInfo)) {
121 return;
122 }
123 JSRef<JSObject> routeData = JSRef<JSObject>::New();
124 routeData->SetProperty<std::string>("name", param->GetName().c_str());
125 routeData->SetProperty<std::string>("pageSourceFile", routeInfo.pageSourceFile->c_str());
126 JSRef<JSObject> data = JSRef<JSObject>::New();
127 for (auto iter = routeInfo.data.begin(); iter != routeInfo.data.end(); iter++) {
128 data->SetProperty<std::string>(iter->first.c_str(), iter->second.c_str());
129 }
130 routeData->SetPropertyObject("data", data);
131 info.SetReturnValue(routeData);
132 }
133
SetNavDestinationId(const JSCallbackInfo & info)134 void JSNavDestinationContext::SetNavDestinationId(const JSCallbackInfo& info)
135 {
136 TAG_LOGI(AceLogTag::ACE_NAVIGATION, "navdestination context not support set navdestinationId");
137 }
138
GetNavDestinationId(const JSCallbackInfo & info)139 void JSNavDestinationContext::GetNavDestinationId(const JSCallbackInfo& info)
140 {
141 JSRef<JSString> idStr = JSRef<JSString>::New(std::to_string(context_->GetNavDestinationId()));
142 info.SetReturnValue(idStr);
143 }
144
JSBind(BindingTarget target)145 void JSNavDestinationContext::JSBind(BindingTarget target)
146 {
147 JSClass<JSNavDestinationContext>::Declare("NavDestinationContext");
148 JSClass<JSNavDestinationContext>::CustomProperty("pathInfo", &JSNavDestinationContext::GetPathInfo,
149 &JSNavDestinationContext::SetPathInfo);
150 JSClass<JSNavDestinationContext>::CustomProperty("pathStack", &JSNavDestinationContext::GetPathStack,
151 &JSNavDestinationContext::SetPathStack);
152 JSClass<JSNavDestinationContext>::CustomProperty("navDestinationId", &JSNavDestinationContext::GetNavDestinationId,
153 &JSNavDestinationContext::SetNavDestinationId);
154 JSClass<JSNavDestinationContext>::CustomMethod("getConfigInRouteMap", &JSNavDestinationContext::GetRouteInfo);
155 JSClass<JSNavDestinationContext>::Bind(
156 target, &JSNavDestinationContext::Constructor, &JSNavDestinationContext::Destructor);
157 }
158
Constructor(const JSCallbackInfo & info)159 void JSNavDestinationContext::Constructor(const JSCallbackInfo& info)
160 {
161 auto proxy = Referenced::MakeRefPtr<JSNavDestinationContext>();
162 proxy->IncRefCount();
163 info.SetReturnValue(Referenced::RawPtr(proxy));
164 }
165
Destructor(JSNavDestinationContext * context)166 void JSNavDestinationContext::Destructor(JSNavDestinationContext* context)
167 {
168 if (context != nullptr) {
169 context->DecRefCount();
170 }
171 }
172
UpdateNavPathInfo(const RefPtr<NG::NavPathInfo> & info)173 void JSNavPathInfo::UpdateNavPathInfo(const RefPtr<NG::NavPathInfo>& info)
174 {
175 NG::NavPathInfo::UpdateNavPathInfo(info);
176 auto jsPathInfo = AceType::DynamicCast<JSNavPathInfo>(info);
177 if (!jsPathInfo) {
178 return;
179 }
180 param_ = jsPathInfo->GetParam();
181 onPop_ = jsPathInfo->GetOnPop();
182 }
183 } // namespace OHOS::Ace::Framework
184