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 class ArkTSUtils { 51 public: 52 static uint32_t ColorAlphaAdapt(uint32_t origin); 53 static bool ParseJsColorContent(const EcmaVM* vm, const Local<JSValueRef>& value); 54 static bool ParseJsColor(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result); 55 static bool ParseJsColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result); 56 static bool ParseJsColorAlpha( 57 const EcmaVM* vm, const Local<JSValueRef>& value, Color& result, const Color& defaultColor); 58 static bool ParseJsSymbolColorAlpha(const EcmaVM* vm, const Local<JSValueRef>& value, Color& result); 59 static void CompleteResourceObject(const EcmaVM* vm, Local<panda::ObjectRef>& jsObj); 60 static bool ParseJsColorFromResource(const EcmaVM* vm, const Local<JSValueRef>& jsObj, Color& result); 61 static bool ParseJsDimensionFromResource( 62 const EcmaVM* vm, const Local<JSValueRef>& jsObj, DimensionUnit dimensionUnit, CalcDimension& result); 63 static bool ParseJsDimensionFromResourceNG( 64 const EcmaVM* vm, const Local<JSValueRef>& jsObj, DimensionUnit dimensionUnit, CalcDimension& result); 65 static bool ParseStringArray( 66 const EcmaVM* vm, const Local<JSValueRef>& arg, std::string* array, int32_t defaultLength); 67 static bool ParseJsInteger(const EcmaVM *vm, const Local<JSValueRef> &value, int32_t &result); 68 static bool ParseJsInteger(const EcmaVM *vm, const Local<JSValueRef> &value, uint32_t &result); 69 static bool ParseJsIntegerWithResource(const EcmaVM* vm, const Local<JSValueRef>& jsValue, int32_t& result); 70 static bool ParseJsDouble(const EcmaVM *vm, const Local<JSValueRef> &value, double &result); 71 static bool ParseAllBorder(const EcmaVM *vm, const Local<JSValueRef> &args, CalcDimension &result); 72 static bool ParseAllRadius(const EcmaVM *vm, const Local<JSValueRef> &args, CalcDimension &result); 73 static bool ParseJsFontFamiliesToString(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string &result); 74 static bool ParseJsFontFamilies( 75 const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::vector<std::string> &result); 76 static bool ParseJsFontFamiliesFromResource( 77 const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::vector<std::string> &result); 78 static bool ParseJsLengthMetrics( 79 const EcmaVM *vm, const Local<JSValueRef> &obj, CalcDimension &result); 80 static bool ParseJsDimension(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result, 81 DimensionUnit defaultUnit, bool isSupportPercent = true, bool enableCheckInvalidvalue = true); 82 static bool ParseJsDimensionFp(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result, 83 bool isSupportPercent = true, bool enableCheckInvalidvalue = true); 84 static bool ParseJsDimensionFpNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result, 85 bool isSupportPercent = true); 86 static bool ParseJsDimensionVp( 87 const EcmaVM *vm, const Local<JSValueRef> &value, CalcDimension &result, bool enableCheckInvalidvalue = true); 88 static bool ParseJsDimensionNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result, 89 DimensionUnit defaultUnit, bool isSupportPercent = true); 90 static bool ParseJsDimensionVpNG(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result, 91 bool isSupportPercent = true); 92 static bool ParseJsMedia(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result); 93 static bool ParseJsMediaFromResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result); 94 static bool ParseResourceToDouble(const EcmaVM* vm, const Local<JSValueRef>& jsValue, double& result); 95 static bool ParseJsIntegerArray(const EcmaVM* vm, Local<JSValueRef> values, std::vector<uint32_t>& result); 96 static bool ParseJsString(const EcmaVM *vm, const Local<JSValueRef> &value, std::string& result); 97 static panda::Local<panda::ObjectRef> GetContext(EcmaVM* vm); 98 static bool ParseJsStringFromResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::string& result); 99 static uint32_t parseShadowColor(const EcmaVM* vm, const Local<JSValueRef>& jsValue); 100 static uint32_t parseShadowFill(const EcmaVM* vm, const Local<JSValueRef>& jsValue); 101 static uint32_t parseShadowType(const EcmaVM* vm, const Local<JSValueRef>& jsValue); 102 static double parseShadowRadius(const EcmaVM* vm, const Local<JSValueRef>& jsValue); 103 static double parseShadowOffset(const EcmaVM* vm, const Local<JSValueRef>& jsValue); 104 static bool ParseJsSymbolId(const EcmaVM *vm, const Local<JSValueRef> &jsValue, std::uint32_t& symbolId); 105 static void ParseJsSymbolFontFamilyName(const EcmaVM *vm, const Local<JSValueRef> &jsValue, 106 std::string& customFamilyName); 107 static void ParseOuterBorder(EcmaVM* vm, const Local<JSValueRef>& args, 108 std::optional<CalcDimension>& optionalDimension); 109 static void ParseOuterBorderForDashParams(EcmaVM* vm, const Local<JSValueRef>& args, 110 std::optional<CalcDimension>& optionalDimension); 111 static void PushOuterBorderDimensionVector(const std::optional<CalcDimension>& valueDim, 112 std::vector<ArkUI_Float32>& values, std::vector<ArkUI_Int32>& units); 113 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)114 static bool ParseArray(const EcmaVM *vm, const Local<JSValueRef> &arg, T *array, int32_t defaultLength, 115 std::function<T(const EcmaVM *, const Local<JSValueRef> &)> getValue) 116 { 117 CHECK_NULL_RETURN(vm, false); 118 CHECK_NULL_RETURN(array, false); 119 if (defaultLength <= 0) { 120 return false; 121 } 122 auto handle = panda::CopyableGlobal<panda::ArrayRef>(vm, arg); 123 if (handle.IsEmpty() || handle->IsUndefined() || handle->IsNull()) { 124 return false; 125 } 126 int32_t length = static_cast<int32_t>(handle->Length(vm)); 127 if (length != defaultLength) { 128 return false; 129 } 130 for (int32_t i = 0; i < length; i++) { 131 auto value = handle->GetValueAt(vm, arg, i); 132 *(array + i) = getValue(vm, value); 133 } 134 return true; 135 } 136 static void GetStringFromJS(const EcmaVM *vm, const Local<JSValueRef> &value, std::string& result); 137 static bool ParseJsResource(const EcmaVM *vm, const Local<JSValueRef> &jsValue, CalcDimension &result); 138 static void GetJsMediaBundleInfo( 139 const EcmaVM* vm, const Local<JSValueRef>& jsValue, std::string& bundleName, std::string& moduleName); 140 static bool ParseJsColorStrategy( 141 const EcmaVM* vm, const Local<JSValueRef>& value, ForegroundColorStrategy& strategy); 142 static bool GetJsPasswordIcon(const EcmaVM *vm, const Local<JSValueRef> &jsOnIconSrc, 143 const Local<JSValueRef> &jsOffIconSrc, PasswordIcon& result); 144 static void ParsePadding( 145 const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& dimen, ArkUISizeType& result); 146 static bool ParseResponseRegion( 147 const EcmaVM* vm, const Local<JSValueRef>& jsValue, 148 ArkUI_Float32* regionValues, int32_t* regionUnits, uint32_t length); 149 template<typename T> GetTheme()150 static RefPtr<T> GetTheme() 151 { 152 auto pipelineContext = PipelineBase::GetCurrentContext(); 153 CHECK_NULL_RETURN(pipelineContext, nullptr); 154 auto themeManager = pipelineContext->GetThemeManager(); 155 CHECK_NULL_RETURN(themeManager, nullptr); 156 return themeManager->GetTheme<T>(); 157 } IsPercentStr(std::string & percent)158 static bool IsPercentStr(std::string& percent) 159 { 160 if (percent.find("%") != std::string::npos) { 161 size_t index = percent.find("%"); 162 percent = percent.substr(0, index); 163 return true; 164 } 165 return false; 166 } 167 static BorderStyle ConvertBorderStyle(int32_t value); 168 static void PushOuterBorderDimensionVector( 169 const std::optional<CalcDimension>& valueDim, std::vector<ArkUI_Float32> &options); 170 static void ParseOuterBorderWidth( 171 ArkUIRuntimeCallInfo *runtimeCallInfo, EcmaVM *vm, std::vector<ArkUI_Float32> &values); 172 static void PushOuterBorderColorVector( 173 const std::optional<Color>& valueColor, std::vector<uint32_t> &options); 174 static void ParseOuterBorderColor(ArkUIRuntimeCallInfo* runtimeCallInfo, 175 EcmaVM* vm, std::vector<uint32_t>& values, int32_t argsIndex); 176 static void ParseOuterBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo, 177 EcmaVM* vm, std::vector<ArkUI_Float32>& values, int32_t argsIndex); 178 static void ParseOuterBorderRadius(ArkUIRuntimeCallInfo* runtimeCallInfo, 179 EcmaVM* vm, std::vector<ArkUI_Float32>& values, std::vector<ArkUI_Int32>& units, int32_t argsIndex); 180 static void PushOuterBorderStyleVector( 181 const std::optional<BorderStyle>& value, std::vector<uint32_t> &options); 182 static void ParseOuterBorderStyle(ArkUIRuntimeCallInfo* runtimeCallInfo, 183 EcmaVM* vm, std::vector<uint32_t>& values, int32_t argsIndex); 184 static void SetBorderWidthArray(const EcmaVM* vm, const Local<JSValueRef>& args, 185 ArkUI_Float32 values[], int units[], int index); 186 static ArkUISizeType ParseJsToArkUISize(const EcmaVM *vm, const Local<JSValueRef> &arg); 187 static bool IsDrawable(const EcmaVM* vm, const Local<JSValueRef>& jsValue); 188 static RefPtr<PixelMap> GetDrawablePixmap(const EcmaVM* vm, Local<JSValueRef> obj); 189 static Rosen::BrightnessBlender* CreateRSBrightnessBlenderFromNapiValue(const EcmaVM* vm, Local<JSValueRef> obj); 190 static void* UnwrapNapiValue(const EcmaVM* vm, const Local<JSValueRef>& obj); 191 #if !defined(PREVIEW) 192 static RefPtr<PixelMap> CreatePixelMapFromNapiValue(const EcmaVM* vm, Local<JSValueRef> obj); 193 #endif 194 static bool ParseSelectionMenuOptions(ArkUIRuntimeCallInfo* info, const EcmaVM* vm, 195 NG::OnCreateMenuCallback& onCreateMenuCallback, NG::OnMenuItemClickCallback& onMenuItemClickCallback); 196 static void ParseOnCreateMenu(const EcmaVM* vm, FrameNode* frameNode, 197 const Local<JSValueRef>& jsValueOnCreateMenu, NG::OnCreateMenuCallback& onCreateMenuCallback); 198 static Local<panda::ArrayRef> CreateJsSystemMenuItems( 199 const EcmaVM* vm, const std::vector<NG::MenuItemParam>& systemMenuItems); 200 static Local<panda::ObjectRef> CreateJsTextMenuItem(const EcmaVM* vm, const NG::MenuItemParam& menuItemParam); 201 static Local<panda::ObjectRef> CreateJsTextMenuId(const EcmaVM* vm, const std::string& id); 202 static void WrapMenuParams( 203 const EcmaVM* vm, std::vector<NG::MenuOptionsParam>& menuParams, const Local<JSValueRef>& menuItems); 204 static void ParseOnMenuItemClick(const EcmaVM* vm, FrameNode* frameNode, 205 const Local<JSValueRef>& jsValueOnMenuItemClick, NG::OnMenuItemClickCallback& onMenuItemClickCallback); 206 static Local<panda::ArrayRef> CreateJsOnMenuItemClick(const EcmaVM* vm, const NG::MenuItemParam& menuItemParam); 207 static Local<panda::ObjectRef> CreateJsTextRange(const EcmaVM* vm, const NG::MenuItemParam& menuItemParam); 208 static void ThrowError(const EcmaVM* vm, const std::string& msg, int32_t code); 209 static bool CheckKeysPressed( 210 const EcmaVM* vm, const std::vector<KeyCode>& pressedKeyCodes, std::vector<std::string>& checkKeyCodes); 211 static Local<JSValueRef> GetModifierKeyState( 212 ArkUIRuntimeCallInfo* info, const std::vector<KeyCode>& pressedKeyCodes); 213 static Local<JSValueRef> JsGetModifierKeyState(ArkUIRuntimeCallInfo* info); 214 static Local<JSValueRef> JsGetHorizontalAxisValue(ArkUIRuntimeCallInfo* info); 215 static Local<JSValueRef> JsGetVerticalAxisValue(ArkUIRuntimeCallInfo* info); 216 217 template<typename T> ToJSValueWithVM(const EcmaVM * vm,T val)218 static panda::Local<panda::JSValueRef> ToJSValueWithVM(const EcmaVM* vm, T val) 219 { 220 if constexpr (std::is_same_v<T, bool>) { 221 return panda::BooleanRef::New(vm, val); 222 } else if constexpr (std::is_same_v<T, int64_t>) { 223 return panda::NumberRef::New(vm, val); 224 } else if constexpr (std::is_integral<T>::value && std::is_signed<T>::value) { 225 return panda::IntegerRef::New(vm, val); 226 } else if constexpr (std::is_unsigned_v<T>) { 227 return panda::IntegerRef::NewFromUnsigned(vm, val); 228 } else if constexpr (std::is_floating_point_v<T>) { 229 return panda::NumberRef::New(vm, val); 230 } else if constexpr (std::is_same_v<T, std::string>) { 231 return panda::StringRef::NewFromUtf8(vm, val.c_str()); 232 } else if constexpr (std::is_same_v<T, const char*>) { 233 return panda::StringRef::NewFromUtf8(vm, val); 234 } else if constexpr (std::is_same_v<T, std::u16string>) { 235 return panda::StringRef::NewFromUtf16(vm, val.c_str()); 236 } 237 return panda::JSValueRef::Undefined(vm); 238 } 239 static Local<panda::ArrayRef> ChoosePointToJSValue(const EcmaVM* vm, std::vector<int> input); 240 }; 241 } // namespace OHOS::Ace::NG 242 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_ENGINE_JSI_NATIVEMODULE_ARKTS_UTILS_H 243