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 36 enum class ResourceType : uint32_t { 37 COLOR = 10001, 38 FLOAT, 39 STRING, 40 PLURAL, 41 BOOLEAN, 42 INTARRAY, 43 INTEGER, 44 PATTERN, 45 STRARRAY, 46 MEDIA = 20000, 47 RAWFILE = 30000, 48 NONE = 40000 49 }; 50 51 struct NodeInfo { 52 std::string nodeTag; 53 ColorMode localColorMode; 54 }; 55 class ArkTSUtils { 56 public: 57 static uint32_t ColorAlphaAdapt(uint32_t origin); 58 static bool ParseJsColorContent(const EcmaVM* vm, const Local<JSValueRef>& value); 59 static bool ParseJsColor(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result); 60 static bool ParseJsColor(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result, 61 RefPtr<ResourceObject>& resourceObject, const NodeInfo& nodeInfo); 62 static bool ParseJsColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& color, 63 std::vector<RefPtr<ResourceObject>>& resObjs, const NodeInfo& nodeInfo); 64 static bool ParseJsColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result); 65 static bool ParseJsColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result, 66 RefPtr<ResourceObject>& resourceObject, const NodeInfo& nodeInfo); 67 static bool ParseJsColorAlpha( 68 const EcmaVM* vm, const Local<JSValueRef>& value, Color& result, const Color& defaultColor); 69 static bool ParseJsColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, 70 Color& result, const Color& defaultColor, RefPtr<ResourceObject>& resourceObject, 71 const NodeInfo& nodeInfo); 72 static bool ParseJsSymbolColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result); 73 static bool ParseJsSymbolColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result, 74 RefPtr<ResourceObject>& resourceObject, const NodeInfo& nodeInfo); 75 static void CompleteResourceObject(const EcmaVM* vm, Local<panda::ObjectRef>& jsObj); 76 static bool ParseJsColorFromResource(const EcmaVM* vm, const Local<JSValueRef>& jsObj, Color& result); 77 static bool ParseJsColorFromResource(const EcmaVM* vm, const Local<JSValueRef>& jsObj, Color& result, 78 RefPtr<ResourceObject>& resourceObject); 79 static bool ParseColorMetricsToColor(const EcmaVM *vm, const Local<JSValueRef> &jsValue, Color& result); 80 static bool ParseColorMetricsToColor( 81 const EcmaVM* vm, const Local<JSValueRef>& jsValue, Color& result, RefPtr<ResourceObject>& resourceObject); 82 static bool ParseJsDimensionFromResource(const EcmaVM* vm, const Local<JSValueRef>& jsObj, 83 DimensionUnit dimensionUnit, CalcDimension& result, RefPtr<ResourceObject>& resourceObject); 84 static bool ParseJsDimensionFromResourceByName(const EcmaVM* vm, const Local<panda::ObjectRef>& jsObj, 85 DimensionUnit dimensionUnit, const RefPtr<ResourceObject>& resourceObject, 86 const RefPtr<ResourceWrapper>& resourceWrapper, CalcDimension& result); 87 static bool ParseJsDimensionFromResourceNG( 88 const EcmaVM* vm, const Local<JSValueRef>& jsObj, DimensionUnit dimensionUnit, CalcDimension& result); 89 static bool ParseJsDimensionFromResourceNG(const EcmaVM* vm, const Local<JSValueRef>& jsObj, 90 DimensionUnit dimensionUnit, CalcDimension& result, RefPtr<ResourceObject>& resourceObject); 91 static bool ParseJsDimensionNGFromResourceByName(const EcmaVM* vm, const Local<panda::ObjectRef>& jsObj, 92 DimensionUnit dimensionUnit, const RefPtr<ResourceObject>& resourceObject, 93 const RefPtr<ResourceWrapper>& resourceWrapper, CalcDimension& result); 94 static bool ParseStringArray( 95 const EcmaVM* vm, const Local<JSValueRef>& arg, std::string* array, int32_t defaultLength); 96 static bool ParseJsInteger(const EcmaVM *vm, const Local<JSValueRef> &value, int32_t &result); 97 static bool ParseJsInteger(const EcmaVM *vm, const Local<JSValueRef> &value, uint32_t &result); 98 static bool ParseJsIntegerWithResource(const EcmaVM* vm, const Local<JSValueRef>& jsValue, int32_t& result); 99 static bool ParseJsIntegerWithResource(const EcmaVM* vm, const Local<JSValueRef>& jsValue, int32_t& result, 100 RefPtr<ResourceObject>& resourceObject); 101 static bool ParseJsDouble(const EcmaVM *vm, const Local<JSValueRef> &value, double &result); 102 static bool ParseJsDouble(const EcmaVM *vm, const Local<JSValueRef> &value, double &result, 103 RefPtr<ResourceObject>& resourceObject); 104 static bool ParseAllBorder(const EcmaVM *vm, const Local<JSValueRef> &args, CalcDimension &result); 105 static bool ParseAllBorder(const EcmaVM* vm, const Local<JSValueRef>& args, CalcDimension& result, 106 RefPtr<ResourceObject>& resourceObject); 107 static bool ParseAllRadius(const EcmaVM *vm, const Local<JSValueRef> &args, CalcDimension &result); 108 static bool ParseAllRadius(const EcmaVM* vm, const Local<JSValueRef>& args, CalcDimension& result, 109 RefPtr<ResourceObject>& resourceObject); 110 static bool ParseJsFontFamiliesToString(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string &result); 111 static bool ParseJsFontFamiliesToString(const EcmaVM* vm, const Local<JSValueRef>& jsValue, std::string& result, 112 RefPtr<ResourceObject>& resourceObject); 113 static bool ParseJsFontFamilies( 114 const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::vector<std::string> &result); 115 static bool ParseJsFontFamilies(const EcmaVM *vm, const Local<JSValueRef> &jsValue, 116 std::vector<std::string> &result, RefPtr<ResourceObject>& resourceObject); 117 static bool ParseJsFontFamiliesFromResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, 118 std::vector<std::string> &result, RefPtr<ResourceObject>& resourceObject); 119 static bool ParseJsLengthMetrics( 120 const EcmaVM *vm, const Local<JSValueRef> &obj, CalcDimension &result); 121 static bool ParseJsLengthMetrics(const EcmaVM* vm, const Local<JSValueRef>& jsValue, CalcDimension& result, 122 RefPtr<ResourceObject>& resourceObj); 123 static bool ParseJsDimension(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result, 124 DimensionUnit defaultUnit, bool isSupportPercent = true, bool enableCheckInvalidvalue = true); 125 static bool ParseJsDimension(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result, 126 DimensionUnit defaultUnit, RefPtr<ResourceObject>& resourceObject, 127 bool isSupportPercent = true, bool enableCheckInvalidvalue = true); 128 static bool ParseJsDimensionFp(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result, 129 bool isSupportPercent = true, bool enableCheckInvalidvalue = true); 130 static bool ParseJsDimensionFp(const EcmaVM* vm, const Local<JSValueRef>& jsValue, CalcDimension& result, 131 RefPtr<ResourceObject>& resourceObject, bool isSupportPercent = true, bool enableCheckInvalidvalue = true); 132 static bool ParseJsDimensionFpNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result, 133 bool isSupportPercent = true); 134 static bool ParseJsDimensionFpNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result, 135 RefPtr<ResourceObject>& resourceObject, bool isSupportPercent = true); 136 static bool ParseJsDimensionVp( 137 const EcmaVM *vm, const Local<JSValueRef> &value, CalcDimension &result, bool enableCheckInvalidvalue = true); 138 static bool ParseJsDimensionVp(const EcmaVM* vm, const Local<JSValueRef>& value, 139 CalcDimension& result, RefPtr<ResourceObject>& resourceObject, bool enableCheckInvalidvalue = true); 140 static bool ParseJsDimensionNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result, 141 DimensionUnit defaultUnit, bool isSupportPercent = true); 142 static bool ParseJsDimensionNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result, 143 DimensionUnit defaultUnit, RefPtr<ResourceObject>& resourceObject, bool isSupportPercent = true); 144 static bool ParseJsDimensionVpNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result, 145 bool isSupportPercent = true); 146 static bool ParseJsDimensionVpNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result, 147 RefPtr<ResourceObject>& resourceObject, bool isSupportPercent = true); 148 static bool ParseJsMedia(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result); 149 static bool ParseJsMedia(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result, 150 RefPtr<ResourceObject>& resourceObject); 151 static bool ParseJsMediaFromResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result, 152 RefPtr<ResourceObject>& resourceObject); 153 static bool ParseResourceToDouble(const EcmaVM* vm, const Local<JSValueRef>& jsValue, double& result, 154 RefPtr<ResourceObject>& resourceObject); 155 static bool ParseJsIntegerArray(const EcmaVM* vm, Local<JSValueRef> values, std::vector<uint32_t>& result); 156 static bool ParseJsString(const EcmaVM* vm, const Local<JSValueRef>& jsValue, std::string& result, 157 RefPtr<ResourceObject>& resourceObject, const NodeInfo& nodeInfo); 158 static bool ParseJsString(const EcmaVM *vm, const Local<JSValueRef> &value, std::string& result); 159 static bool ParseJsString(const EcmaVM* vm, const Local<JSValueRef>& jsValue, std::string& result, 160 RefPtr<ResourceObject>& resourceObject); 161 static panda::Local<panda::ObjectRef> GetContext(EcmaVM* vm); 162 static bool ParseJsStringFromResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result); 163 static bool ParseJsStringFromResource(const EcmaVM* vm, const Local<JSValueRef>& jsValue, std::string& result, 164 RefPtr<ResourceObject>& resourceObject); 165 static uint32_t parseShadowColor(const EcmaVM* vm, const Local<JSValueRef>& jsValue); 166 static uint32_t parseShadowColorWithResObj(const EcmaVM* vm, const Local<JSValueRef>& jsValue, 167 RefPtr<ResourceObject>& resObj, const std::optional<NodeInfo>& nodeInfo = std::nullopt); 168 static uint32_t parseShadowFill(const EcmaVM* vm, const Local<JSValueRef>& jsValue); 169 static uint32_t parseShadowType(const EcmaVM* vm, const Local<JSValueRef>& jsValue); 170 static double parseShadowRadius(const EcmaVM* vm, const Local<JSValueRef>& jsValue); 171 static double parseShadowRadiusWithResObj(const EcmaVM* vm, const Local<JSValueRef>& jsValue, 172 RefPtr<ResourceObject>& resObj, const std::optional<NodeInfo>& nodeInfo = std::nullopt); 173 static double parseShadowOffset(const EcmaVM* vm, const Local<JSValueRef>& jsValue); 174 static double parseShadowOffsetWithResObj(const EcmaVM* vm, const Local<JSValueRef>& jsValue, 175 RefPtr<ResourceObject>& resObj, const std::optional<NodeInfo>& nodeInfo = std::nullopt); 176 static bool ParseJsSymbolId(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::uint32_t& symbolId); 177 static bool ParseJsSymbolId(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::uint32_t& symbolId, 178 RefPtr<ResourceObject>& resourceObject); 179 static void ParseJsSymbolFontFamilyName(const EcmaVM *vm, const Local<JSValueRef> &jsValue, 180 std::string& customFamilyName); 181 static void ParseOuterBorder(EcmaVM* vm, const Local<JSValueRef>& args, 182 std::optional<CalcDimension>& optionalDimension); 183 static void ParseOuterBorder(EcmaVM* vm, const Local<JSValueRef>& args, 184 std::optional<CalcDimension>& optionalDimension, RefPtr<ResourceObject>& resObj); 185 static void ParseOuterBorderForDashParams(EcmaVM* vm, const Local<JSValueRef>& args, 186 std::optional<CalcDimension>& optionalDimension); 187 static void ParseOuterBorderForDashParams(EcmaVM* vm, const Local<JSValueRef>& args, 188 std::optional<CalcDimension>& optionalDimension, RefPtr<ResourceObject>& resObj); 189 static void PushOuterBorderDimensionVector(const std::optional<CalcDimension>& valueDim, 190 std::vector<ArkUI_Float32>& values, std::vector<ArkUI_Int32>& units); 191 static void ParseJsAngle(const EcmaVM* vm, const Local<JSValueRef>& value, std::optional<float>& angle); 192 static bool ParseJsInt32(const EcmaVM* vm, const Local<JSValueRef>& value, int32_t& result); 193 static bool ParseJsIgnoresLayoutSafeAreaEdges( 194 const EcmaVM* vm, const Local<JSValueRef>& value, std::vector<ArkUI_Int32>& edges); 195 static void ParseGradientCenter(const EcmaVM* vm, const Local<JSValueRef>& value, 196 std::vector<ArkUIInt32orFloat32>& values, std::vector<RefPtr<ResourceObject>>& vectorResObj); 197 static void ParseGradientCenter( 198 const EcmaVM* vm, const Local<JSValueRef>& value, std::vector<ArkUIInt32orFloat32>& values); 199 static void ParseGradientColorStops(const EcmaVM *vm, const Local<JSValueRef>& value, 200 std::vector<ArkUIInt32orFloat32>& colors, std::vector<RefPtr<ResourceObject>>& vectorResObj, 201 const NodeInfo& nodeInfo); 202 static void ParseGradientColorStops( 203 const EcmaVM* vm, const Local<JSValueRef>& value, std::vector<ArkUIInt32orFloat32>& colors); 204 static void ParseGradientAngle( 205 const EcmaVM* vm, const Local<JSValueRef>& value, std::vector<ArkUIInt32orFloat32>& values); 206 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)207 static bool ParseArray(const EcmaVM *vm, const Local<JSValueRef> &arg, T *array, int32_t defaultLength, 208 std::function<T(const EcmaVM *, const Local<JSValueRef> &)> getValue) 209 { 210 CHECK_NULL_RETURN(vm, false); 211 CHECK_NULL_RETURN(array, false); 212 if (defaultLength <= 0) { 213 return false; 214 } 215 auto handle = panda::CopyableGlobal<panda::ArrayRef>(vm, arg); 216 if (handle.IsEmpty() || handle->IsUndefined() || handle->IsNull()) { 217 return false; 218 } 219 int32_t length = static_cast<int32_t>(handle->Length(vm)); 220 if (length != defaultLength) { 221 return false; 222 } 223 for (int32_t i = 0; i < length; i++) { 224 auto value = handle->GetValueAt(vm, arg, i); 225 *(array + i) = getValue(vm, value); 226 } 227 return true; 228 } 229 template <class T> 230 static bool ParseArrayWithResObj(const EcmaVM *vm, const Local<JSValueRef> &arg, T *array, int32_t defaultLength, 231 std::function<T(const EcmaVM *, const Local<JSValueRef> &, RefPtr<ResourceObject> &, 232 const std::optional<NodeInfo> &)> getValue, 233 std::vector<RefPtr<ResourceObject>>& resObjArray, const std::optional<NodeInfo>& nodeInfo = std::nullopt) 234 { 235 CHECK_NULL_RETURN(vm, false); 236 CHECK_NULL_RETURN(array, false); 237 if (defaultLength <= 0) { 238 return false; 239 } 240 auto handle = panda::CopyableGlobal<panda::ArrayRef>(vm, arg); 241 if (handle.IsEmpty() || handle->IsUndefined() || handle->IsNull()) { 242 return false; 243 } 244 int32_t length = static_cast<int32_t>(handle->Length(vm)); 245 if (length != defaultLength) { 246 return false; 247 } 248 for (int32_t i = 0; i < length; i++) { 249 RefPtr<ResourceObject> resObj; 250 auto value = handle->GetValueAt(vm, arg, i); 251 *(array + i) = getValue(vm, value, resObj, nodeInfo); 252 resObjArray.emplace_back(resObj); 253 } 254 return true; 255 } 256 static void GetStringFromJS(const EcmaVM *vm, const Local<JSValueRef> &value, std::string& result); 257 static bool ParseJsResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result); 258 static bool ParseJsResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result, 259 RefPtr<ResourceObject>& resourceObject); 260 static void GetJsMediaBundleInfo( 261 const EcmaVM* vm, const Local<JSValueRef>& jsValue, std::string& bundleName, std::string& moduleName); 262 static bool ParseJsColorStrategy( 263 const EcmaVM* vm, const Local<JSValueRef>& value, ForegroundColorStrategy& strategy); 264 static bool GetJsPasswordIcon(const EcmaVM *vm, const Local<JSValueRef> &jsOnIconSrc, 265 const Local<JSValueRef> &jsOffIconSrc, PasswordIcon& result); 266 static void ParsePadding( 267 const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& dimen, ArkUISizeType& result); 268 static void ParsePadding(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& dimen, 269 ArkUISizeType& result, RefPtr<ResourceObject>& resObj); 270 static bool ParseResponseRegion( 271 const EcmaVM* vm, const Local<JSValueRef>& jsValue, 272 ArkUI_Float32* regionValues, int32_t* regionUnits, uint32_t length); 273 template<typename T> GetTheme()274 static RefPtr<T> GetTheme() 275 { 276 auto pipelineContext = PipelineBase::GetCurrentContext(); 277 CHECK_NULL_RETURN(pipelineContext, nullptr); 278 auto themeManager = pipelineContext->GetThemeManager(); 279 CHECK_NULL_RETURN(themeManager, nullptr); 280 return themeManager->GetTheme<T>(); 281 } IsPercentStr(std::string & percent)282 static bool IsPercentStr(std::string& percent) 283 { 284 if (percent.find("%") != std::string::npos) { 285 size_t index = percent.find("%"); 286 percent = percent.substr(0, index); 287 return true; 288 } 289 return false; 290 } 291 static BorderStyle ConvertBorderStyle(int32_t value); 292 static void PushOuterBorderDimensionVector( 293 const std::optional<CalcDimension>& valueDim, std::vector<ArkUI_Float32> &options); 294 static void ParseOuterBorderWidth( 295 ArkUIRuntimeCallInfo *runtimeCallInfo, EcmaVM *vm, std::vector<ArkUI_Float32> &values); 296 static void PushOuterBorderColorVector( 297 const std::optional<Color>& valueColor, std::vector<uint32_t> &options); 298 static void ParseOuterBorderColor(ArkUIRuntimeCallInfo* runtimeCallInfo, 299 EcmaVM* vm, std::vector<uint32_t>& values, int32_t argsIndex); 300 static void ParseOuterBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo, 301 EcmaVM* vm, std::vector<ArkUI_Float32>& values, int32_t argsIndex); 302 static void SetTextBackgroundStyle(std::shared_ptr<TextBackgroundStyle> style, Color color, 303 RefPtr<ResourceObject>& colorResObj, const ArkUI_Float32* values, const ArkUI_Int32* units); 304 static void RegisterTextBackgroundStyleResource(std::shared_ptr<TextBackgroundStyle> textBackgroundStyle, 305 RefPtr<ResourceObject>& resObjTopLeft, RefPtr<ResourceObject>& resObjTopRight, 306 RefPtr<ResourceObject>& resObjBottomLeft, RefPtr<ResourceObject>& resObjBottomRight); 307 static void ParseOuterBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo, 308 EcmaVM* vm, std::vector<ArkUI_Float32>& values, std::vector<ArkUI_Int32>& units, int32_t argsIndex); 309 static void ParseOuterBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo, 310 EcmaVM* vm, std::vector<ArkUI_Float32>& values, std::vector<ArkUI_Int32>& units, int32_t argsIndex, 311 std::shared_ptr<TextBackgroundStyle> style); 312 static void PushOuterBorderStyleVector( 313 const std::optional<BorderStyle>& value, std::vector<uint32_t> &options); 314 static void ParseOuterBorderStyle(ArkUIRuntimeCallInfo* runtimeCallInfo, 315 EcmaVM* vm, std::vector<uint32_t>& values, int32_t argsIndex); 316 static void SetBorderWidthArray(const EcmaVM* vm, const Local<JSValueRef>& args, 317 ArkUI_Float32 values[], int units[], int index); 318 static ArkUISizeType ParseJsToArkUISize(const EcmaVM *vm, const Local<JSValueRef> &arg, 319 RefPtr<ResourceObject>& resObj); 320 static bool IsDrawable(const EcmaVM* vm, const Local<JSValueRef>& jsValue); 321 static RefPtr<PixelMap> GetDrawablePixmap(const EcmaVM* vm, Local<JSValueRef> obj); 322 static Rosen::BrightnessBlender* CreateRSBrightnessBlenderFromNapiValue(const EcmaVM* vm, Local<JSValueRef> obj); 323 static void* UnwrapNapiValue(const EcmaVM* vm, const Local<JSValueRef>& obj); 324 #if !defined(PREVIEW) 325 static RefPtr<PixelMap> CreatePixelMapFromNapiValue(const EcmaVM* vm, Local<JSValueRef> obj); 326 #endif 327 static bool ParseSelectionMenuOptions(ArkUIRuntimeCallInfo* info, const EcmaVM* vm, 328 NG::OnCreateMenuCallback& onCreateMenuCallback, NG::OnMenuItemClickCallback& onMenuItemClickCallback, 329 NG::OnPrepareMenuCallback& onPrepareMenuCallback); 330 static void ParseOnCreateMenu(const EcmaVM* vm, FrameNode* frameNode, 331 const Local<JSValueRef>& jsValueOnCreateMenu, NG::OnCreateMenuCallback& onCreateMenuCallback); 332 static void ParseOnPrepareMenu(const EcmaVM* vm, FrameNode* frameNode, 333 const Local<JSValueRef>& jsValueOnPrepareMenu, NG::OnPrepareMenuCallback& onPrepareMenuCallback); 334 static Local<panda::ArrayRef> CreateJsSystemMenuItems( 335 const EcmaVM* vm, const std::vector<NG::MenuItemParam>& systemMenuItems); 336 static Local<panda::ObjectRef> CreateJsTextMenuItem(const EcmaVM* vm, const NG::MenuItemParam& menuItemParam); 337 static Local<panda::ObjectRef> CreateJsTextMenuId(const EcmaVM* vm, const std::string& id); 338 static void ParseMenuItemsSymbolId( 339 const EcmaVM* vm, const Local<JSValueRef>& jsStartIcon, NG::MenuOptionsParam& menuOptionsParam); 340 static void WrapMenuParams(const EcmaVM* vm, std::vector<NG::MenuOptionsParam>& menuParams, 341 const Local<JSValueRef>& menuItems, bool enableLabelInfo); 342 static void ParseOnMenuItemClick(const EcmaVM* vm, FrameNode* frameNode, 343 const Local<JSValueRef>& jsValueOnMenuItemClick, NG::OnMenuItemClickCallback& onMenuItemClickCallback); 344 static Local<panda::ArrayRef> CreateJsOnMenuItemClick(const EcmaVM* vm, const NG::MenuItemParam& menuItemParam); 345 static Local<panda::ObjectRef> CreateJsTextRange(const EcmaVM* vm, const NG::MenuItemParam& menuItemParam); 346 static void ThrowError(const EcmaVM* vm, const std::string& msg, int32_t code); 347 static bool CheckKeysPressed( 348 const EcmaVM* vm, const std::vector<KeyCode>& pressedKeyCodes, std::vector<std::string>& checkKeyCodes); 349 static Local<JSValueRef> GetModifierKeyState( 350 ArkUIRuntimeCallInfo* info, const std::vector<KeyCode>& pressedKeyCodes); 351 static Local<JSValueRef> JsGetModifierKeyState(ArkUIRuntimeCallInfo* info); 352 static Local<JSValueRef> JsGetHorizontalAxisValue(ArkUIRuntimeCallInfo* info); 353 static Local<JSValueRef> JsGetVerticalAxisValue(ArkUIRuntimeCallInfo* info); 354 355 template<typename T> ToJSValueWithVM(const EcmaVM * vm,T val)356 static panda::Local<panda::JSValueRef> ToJSValueWithVM(const EcmaVM* vm, T val) 357 { 358 if constexpr (std::is_same_v<T, bool>) { 359 return panda::BooleanRef::New(vm, val); 360 } else if constexpr (std::is_same_v<T, int64_t>) { 361 return panda::NumberRef::New(vm, val); 362 } else if constexpr (std::is_integral<T>::value && std::is_signed<T>::value) { 363 return panda::IntegerRef::New(vm, val); 364 } else if constexpr (std::is_unsigned_v<T>) { 365 return panda::IntegerRef::NewFromUnsigned(vm, val); 366 } else if constexpr (std::is_floating_point_v<T>) { 367 return panda::NumberRef::New(vm, val); 368 } else if constexpr (std::is_same_v<T, std::string>) { 369 return panda::StringRef::NewFromUtf8(vm, val.c_str()); 370 } else if constexpr (std::is_same_v<T, const char*>) { 371 return panda::StringRef::NewFromUtf8(vm, val); 372 } else if constexpr (std::is_same_v<T, std::u16string>) { 373 return panda::StringRef::NewFromUtf16(vm, val.c_str()); 374 } 375 return panda::JSValueRef::Undefined(vm); 376 } 377 static Local<panda::ArrayRef> ChoosePointToJSValue(const EcmaVM* vm, std::vector<int> input); 378 static NodeInfo MakeNativeNodeInfo(ArkUINodeHandle node); 379 static void CompleteResourceObjectFromColor(RefPtr<ResourceObject>& resObj, 380 Color& color, bool state, const NodeInfo& nodeInfo); 381 382 private: 383 static bool CheckDarkResource(const RefPtr<ResourceObject>& resObj); 384 }; 385 } // namespace OHOS::Ace::NG 386 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_JSI_NATIVEMODULE_ARKTS_UTILS_H 387