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