• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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