1 /*
2  * Copyright (c) 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 #ifndef FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_JSI_NATIVEMODULE_ARKTS_UTILS_H
17 #define FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_JSI_NATIVEMODULE_ARKTS_UTILS_H
18 
19 #include "bridge/declarative_frontend/declarative_frontend.h"
20 #include "bridge/declarative_frontend/engine/functions/js_drag_function.h"
21 #include "bridge/declarative_frontend/engine/js_object_template.h"
22 #include "bridge/declarative_frontend/frontend_delegate_declarative.h"
23 #include "bridge/declarative_frontend/jsview/canvas/js_canvas_image_data.h"
24 #include "bridge/js_frontend/engine/jsi/ark_js_runtime.h"
25 #include "core/components/common/properties/text_style.h"
26 #include "core/components_ng/pattern/text_field/text_field_model.h"
27 #include "core/interfaces/native/node/node_api.h"
28 
29 namespace OHOS::Rosen {
30     class BrightnessBlender;
31 }
32 
33 namespace OHOS::Ace::NG {
34 using ArkUIRuntimeCallInfo = panda::JsiRuntimeCallInfo;
35 class ArkTSUtils {
36 public:
37     static uint32_t ColorAlphaAdapt(uint32_t origin);
38     static bool ParseJsColor(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result);
39     static bool ParseJsColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result);
40     static bool ParseJsColorAlpha(
41         const EcmaVM* vm, const Local<JSValueRef>& value, Color& result, const Color& defaultColor);
42     static bool ParseJsSymbolColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result);
43     static bool ParseJsColorFromResource(const EcmaVM* vm, const Local<JSValueRef>& jsObj, Color& result);
44     static bool ParseJsDimensionFromResource(
45         const EcmaVM* vm, const Local<JSValueRef>& jsObj, DimensionUnit dimensionUnit, CalcDimension& result);
46     static bool ParseJsDimensionFromResourceNG(
47         const EcmaVM* vm, const Local<JSValueRef>& jsObj, DimensionUnit dimensionUnit, CalcDimension& result);
48     static bool ParseStringArray(
49         const EcmaVM* vm, const Local<JSValueRef>& arg, std::string* array, int32_t defaultLength);
50     static bool ParseJsInteger(const EcmaVM *vm, const Local<JSValueRef> &value, int32_t &result);
51     static bool ParseJsInteger(const EcmaVM *vm, const Local<JSValueRef> &value, uint32_t &result);
52     static bool ParseJsIntegerWithResource(const EcmaVM* vm, const Local<JSValueRef>& jsValue, int32_t& result);
53     static bool ParseJsDouble(const EcmaVM *vm, const Local<JSValueRef> &value, double &result);
54     static bool ParseAllBorder(const EcmaVM *vm, const Local<JSValueRef> &args, CalcDimension &result);
55     static bool ParseAllRadius(const EcmaVM *vm, const Local<JSValueRef> &args, CalcDimension &result);
56     static bool ParseJsFontFamiliesToString(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string &result);
57     static bool ParseJsFontFamilies(
58         const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::vector<std::string> &result);
59     static bool ParseJsFontFamiliesFromResource(
60         const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::vector<std::string> &result);
61     static bool ParseJsLengthMetrics(
62         const EcmaVM *vm, const Local<JSValueRef> &obj, CalcDimension &result);
63     static bool ParseJsDimension(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
64         DimensionUnit defaultUnit, bool isSupportPercent = true, bool enableCheckInvalidvalue = true);
65     static bool ParseJsDimensionFp(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
66         bool isSupportPercent = true, bool enableCheckInvalidvalue = true);
67     static bool ParseJsDimensionFpNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
68         bool isSupportPercent = true);
69     static bool ParseJsDimensionVp(
70         const EcmaVM *vm, const Local<JSValueRef> &value, CalcDimension &result, bool enableCheckInvalidvalue = true);
71     static bool ParseJsDimensionNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
72         DimensionUnit defaultUnit, bool isSupportPercent = true);
73     static bool ParseJsDimensionVpNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result,
74         bool isSupportPercent = true);
75     static bool ParseJsMedia(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result);
76     static bool ParseJsMediaFromResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result);
77     static bool ParseResourceToDouble(const EcmaVM* vm, const Local<JSValueRef>& jsValue, double& result);
78     static bool ParseJsIntegerArray(const EcmaVM* vm, Local<JSValueRef> values, std::vector<uint32_t>& result);
79     static bool ParseJsString(const EcmaVM *vm, const Local<JSValueRef> &value, std::string& result);
80     static panda::Local<panda::ObjectRef> GetContext(EcmaVM* vm);
81     static bool ParseJsStringFromResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result);
82     static uint32_t parseShadowColor(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
83     static uint32_t parseShadowFill(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
84     static uint32_t parseShadowType(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
85     static double parseShadowRadius(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
86     static double parseShadowOffset(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
87     static bool ParseJsSymbolId(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::uint32_t& symbolId);
88     static void ParseOuterBorder(EcmaVM* vm, const Local<JSValueRef>& args,
89         std::optional<CalcDimension>& optionalDimension);
90     static void ParseOuterBorderForDashParams(EcmaVM* vm, const Local<JSValueRef>& args,
91         std::optional<CalcDimension>& optionalDimension);
92     static void PushOuterBorderDimensionVector(const std::optional<CalcDimension>& valueDim,
93         std::vector<ArkUI_Float32>& values, std::vector<ArkUI_Int32>& units);
94     template <class T>
ParseArray(const EcmaVM * vm,const Local<JSValueRef> & arg,T * array,int32_t defaultLength,std::function<T (const EcmaVM *,const Local<JSValueRef> &)> getValue)95     static bool ParseArray(const EcmaVM *vm, const Local<JSValueRef> &arg, T *array, int32_t defaultLength,
96         std::function<T(const EcmaVM *, const Local<JSValueRef> &)> getValue)
97     {
98         CHECK_NULL_RETURN(vm, false);
99         CHECK_NULL_RETURN(array, false);
100         if (defaultLength <= 0) {
101             return false;
102         }
103         auto handle = panda::CopyableGlobal<panda::ArrayRef>(vm, arg);
104         if (handle.IsEmpty() || handle->IsUndefined() || handle->IsNull()) {
105             return false;
106         }
107         int32_t length = static_cast<int32_t>(handle->Length(vm));
108         if (length != defaultLength) {
109             return false;
110         }
111         for (int32_t i = 0; i < length; i++) {
112             auto value = handle->GetValueAt(vm, arg, i);
113             *(array + i) = getValue(vm, value);
114         }
115         return true;
116     }
117     static void GetStringFromJS(const EcmaVM *vm, const Local<JSValueRef> &value, std::string& result);
118     static bool ParseJsResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result);
119     static void GetJsMediaBundleInfo(
120         const EcmaVM* vm, const Local<JSValueRef>& jsValue, std::string& bundleName, std::string& moduleName);
121     static bool ParseJsColorStrategy(
122         const EcmaVM* vm, const Local<JSValueRef>& value, ForegroundColorStrategy& strategy);
123     static bool GetJsPasswordIcon(const EcmaVM *vm, const Local<JSValueRef> &jsOnIconSrc,
124         const Local<JSValueRef> &jsOffIconSrc, PasswordIcon& result);
125     static void ParsePadding(
126         const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& dimen, ArkUISizeType& result);
127     static bool ParseResponseRegion(
128         const EcmaVM* vm, const Local<JSValueRef>& jsValue,
129         ArkUI_Float32* regionValues, int32_t* regionUnits, uint32_t length);
130     template<typename T>
GetTheme()131     static RefPtr<T> GetTheme()
132     {
133         auto pipelineContext = PipelineBase::GetCurrentContext();
134         CHECK_NULL_RETURN(pipelineContext, nullptr);
135         auto themeManager = pipelineContext->GetThemeManager();
136         CHECK_NULL_RETURN(themeManager, nullptr);
137         return themeManager->GetTheme<T>();
138     }
IsPercentStr(std::string & percent)139     static bool IsPercentStr(std::string& percent)
140     {
141         if (percent.find("%") != std::string::npos) {
142             size_t index = percent.find("%");
143             percent = percent.substr(0, index);
144             return true;
145         }
146         return false;
147     }
148     static BorderStyle ConvertBorderStyle(int32_t value);
149     static void PushOuterBorderDimensionVector(
150         const std::optional<CalcDimension>& valueDim, std::vector<ArkUI_Float32> &options);
151     static void ParseOuterBorderWidth(
152         ArkUIRuntimeCallInfo *runtimeCallInfo, EcmaVM *vm, std::vector<ArkUI_Float32> &values);
153     static void PushOuterBorderColorVector(
154         const std::optional<Color>& valueColor, std::vector<uint32_t> &options);
155     static void ParseOuterBorderColor(ArkUIRuntimeCallInfo* runtimeCallInfo,
156         EcmaVM* vm, std::vector<uint32_t>& values, int32_t argsIndex);
157     static void ParseOuterBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo,
158         EcmaVM* vm, std::vector<ArkUI_Float32>& values, int32_t argsIndex);
159     static void ParseOuterBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo,
160         EcmaVM* vm, std::vector<ArkUI_Float32>& values, std::vector<ArkUI_Int32>& units, int32_t argsIndex);
161     static void PushOuterBorderStyleVector(
162         const std::optional<BorderStyle>& value, std::vector<uint32_t> &options);
163     static void ParseOuterBorderStyle(ArkUIRuntimeCallInfo* runtimeCallInfo,
164         EcmaVM* vm, std::vector<uint32_t>& values, int32_t argsIndex);
165     static void SetBorderWidthArray(const EcmaVM* vm, const Local<JSValueRef>& args,
166         ArkUI_Float32 values[], int units[], int index);
167     static ArkUISizeType ParseJsToArkUISize(const EcmaVM *vm, const Local<JSValueRef> &arg);
168     static bool IsDrawable(const EcmaVM* vm, const Local<JSValueRef>& jsValue);
169     static RefPtr<PixelMap> GetDrawablePixmap(const EcmaVM* vm, Local<JSValueRef> obj);
170     static Rosen::BrightnessBlender* CreateRSBrightnessBlenderFromNapiValue(const EcmaVM* vm, Local<JSValueRef> obj);
171     static void* UnwrapNapiValue(const EcmaVM* vm, const Local<JSValueRef>& obj);
172 #if !defined(PREVIEW)
173     static RefPtr<PixelMap> CreatePixelMapFromNapiValue(const EcmaVM* vm, Local<JSValueRef> obj);
174 #endif
175     static bool ParseSelectionMenuOptions(ArkUIRuntimeCallInfo* info, const EcmaVM* vm,
176         NG::OnCreateMenuCallback& onCreateMenuCallback, NG::OnMenuItemClickCallback& onMenuItemClickCallback);
177     static void ParseOnCreateMenu(const EcmaVM* vm, FrameNode* frameNode,
178         const Local<JSValueRef>& jsValueOnCreateMenu, NG::OnCreateMenuCallback& onCreateMenuCallback);
179     static Local<panda::ArrayRef> CreateJsSystemMenuItems(
180         const EcmaVM* vm, const std::vector<NG::MenuItemParam>& systemMenuItems);
181     static Local<panda::ObjectRef> CreateJsTextMenuItem(const EcmaVM* vm, const NG::MenuItemParam& menuItemParam);
182     static Local<panda::ObjectRef> CreateJsTextMenuId(const EcmaVM* vm, const std::string& id);
183     static void WrapMenuParams(
184         const EcmaVM* vm, std::vector<NG::MenuOptionsParam>& menuParams, const Local<JSValueRef>& menuItems);
185     static void ParseOnMenuItemClick(const EcmaVM* vm, FrameNode* frameNode,
186         const Local<JSValueRef>& jsValueOnMenuItemClick, NG::OnMenuItemClickCallback& onMenuItemClickCallback);
187     static Local<panda::ArrayRef> CreateJsOnMenuItemClick(const EcmaVM* vm, const NG::MenuItemParam& menuItemParam);
188     static Local<panda::ObjectRef> CreateJsTextRange(const EcmaVM* vm, const NG::MenuItemParam& menuItemParam);
189     static void ThrowError(const EcmaVM* vm, const std::string& msg, int32_t code);
190     static bool CheckKeysPressed(
191         const EcmaVM* vm, const std::vector<KeyCode>& pressedKeyCodes, std::vector<std::string>& checkKeyCodes);
192     static Local<JSValueRef> GetModifierKeyState(
193         ArkUIRuntimeCallInfo* info, const std::vector<KeyCode>& pressedKeyCodes);
194     static Local<JSValueRef> JsGetModifierKeyState(ArkUIRuntimeCallInfo* info);
195 };
196 } // namespace OHOS::Ace::NG
197 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_JSI_NATIVEMODULE_ARKTS_UTILS_H
198