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