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