1 /* 2 * Copyright (c) 2021-2024 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_JS_VIEW_JS_VIEW_ABSTRACT_H 17 #define FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_VIEW_ABSTRACT_H 18 19 #include <cstdint> 20 #include <optional> 21 22 #include "base/geometry/dimension.h" 23 #include "base/geometry/dimension_rect.h" 24 #include "base/json/json_util.h" 25 #include "base/log/log.h" 26 #include "base/memory/ace_type.h" 27 #include "base/utils/system_properties.h" 28 #include "bridge/declarative_frontend/engine/bindings.h" 29 #include "bridge/declarative_frontend/engine/functions/js_function.h" 30 #include "bridge/declarative_frontend/engine/js_ref_ptr.h" 31 #include "core/common/container.h" 32 #include "core/common/resource/resource_manager.h" 33 #include "core/common/resource/resource_object.h" 34 #include "core/common/resource/resource_wrapper.h" 35 #include "core/components/common/properties/popup_param.h" 36 #include "core/components/theme/theme_manager.h" 37 #include "core/components_ng/event/gesture_event_hub.h" 38 #include "core/components_ng/pattern/overlay/sheet_presentation_pattern.h" 39 #include "core/components_ng/pattern/tabs/tab_content_model.h" 40 #include "core/components_ng/pattern/text/text_model.h" 41 #include "core/components_ng/pattern/text/text_menu_extension.h" 42 #include "core/components_ng/property/gradient_property.h" 43 #include "core/components_ng/property/transition_property.h" 44 #include "interfaces/inner_api/ace/ai/image_analyzer.h" 45 46 namespace OHOS::Ace::Framework { 47 48 constexpr int32_t DEFAULT_TAP_FINGERS = 1; 49 constexpr int32_t DEFAULT_TAP_COUNTS = 1; 50 constexpr float DEFAULT_PROGRESS_TOTAL = 100.0f; 51 52 enum class ResourceType : uint32_t { 53 COLOR = 10001, 54 FLOAT, 55 STRING, 56 PLURAL, 57 BOOLEAN, 58 INTARRAY, 59 INTEGER, 60 PATTERN, 61 STRARRAY, 62 MEDIA = 20000, 63 RAWFILE = 30000 64 }; 65 66 enum class JSCallbackInfoType { STRING, NUMBER, OBJECT, BOOLEAN, FUNCTION }; 67 68 struct LocalizedCalcDimension { 69 std::optional<CalcDimension> start; 70 std::optional<CalcDimension> end; 71 std::optional<CalcDimension> top; 72 std::optional<CalcDimension> bottom; 73 }; 74 75 struct CommonCalcDimension { 76 std::optional<CalcDimension> left; 77 std::optional<CalcDimension> right; 78 std::optional<CalcDimension> top; 79 std::optional<CalcDimension> bottom; 80 }; 81 82 struct LocalizedColor { 83 std::optional<Color> start; 84 std::optional<Color> end; 85 std::optional<Color> top; 86 std::optional<Color> bottom; 87 }; 88 89 struct CommonColor { 90 std::optional<Color> left; 91 std::optional<Color> right; 92 std::optional<Color> top; 93 std::optional<Color> bottom; 94 }; 95 96 RefPtr<ResourceObject> GetResourceObject(const JSRef<JSObject>& jsObj); 97 RefPtr<ResourceObject> GetResourceObjectByBundleAndModule(const JSRef<JSObject>& jsObj); 98 RefPtr<ResourceWrapper> CreateResourceWrapper(const JSRef<JSObject>& jsObj, RefPtr<ResourceObject>& resourceObject); 99 RefPtr<ResourceWrapper> CreateResourceWrapper(); 100 using PopupOnWillDismiss = std::function<void(int32_t)>; 101 class JSViewAbstract { 102 public: 103 static void SetPixelRoundMode(const JSCallbackInfo& info); 104 static uint8_t GetPixelRoundMode(); 105 static void GetAngle( 106 const std::string& key, const std::unique_ptr<JsonValue>& jsonValue, std::optional<float>& angle); 107 static void GetJsAngle( 108 int32_t key, const JSRef<JSVal>& jsValue, std::optional<float>& angle); 109 static void GetJsAngleWithDefault( 110 int32_t key, const JSRef<JSObject>& jsObj, std::optional<float>& angle, float defaultValue); 111 static inline void CheckAngle(std::optional<float>& angle); 112 static void GetPerspective(const std::string& key, const std::unique_ptr<JsonValue>& jsonValue, float& perspective); 113 static void GetJsPerspective(int32_t key, const JSRef<JSObject>& jsValue, float& perspective); 114 static void GetGradientColorStops(Gradient& gradient, const std::unique_ptr<JsonValue>& jsonValue); 115 static void GetFractionStops( 116 std::vector<std::pair<float, float>>& fractionStops, const JSRef<JSVal>& array); 117 static void NewGetGradientColorStops(NG::Gradient& gradient, const std::unique_ptr<JsonValue>& jsonValue); 118 static void NewGetJsGradientColorStops(NG::Gradient& gradient, const JSRef<JSVal>& colorStops); 119 120 static void JsScale(const JSCallbackInfo& info); 121 static void SetTabBarSymbolOptionApply(const JSCallbackInfo& info, TabBarSymbol& symbolApply, 122 const JSRef<JSVal>& modifierNormalObj, const JSRef<JSVal>& modifierSelectedObj); 123 static void SetDragPreviewOptionApply(const JSCallbackInfo& info, NG::DragPreviewOption& previewOption); 124 static void SetDragNumberBadge(const JSCallbackInfo& info, NG::DragPreviewOption& option); 125 static void SetDefaultScale(); 126 static void JsScaleX(const JSCallbackInfo& info); 127 static void JsScaleY(const JSCallbackInfo& info); 128 static void JsOpacity(const JSCallbackInfo& info); 129 static void JsTranslate(const JSCallbackInfo& info); 130 static void SetDefaultTranslate(); 131 static void JsTranslateX(const JSCallbackInfo& info); 132 static void JsTranslateY(const JSCallbackInfo& info); 133 static void JsRotate(const JSCallbackInfo& info); 134 static void SetDefaultRotate(); 135 static void JsRotateX(const JSCallbackInfo& info); 136 static void JsRotateY(const JSCallbackInfo& info); 137 static void JsTransform(const JSCallbackInfo& info); 138 static void SetDefaultTransform(); 139 static void JsTransition(const JSCallbackInfo& info); 140 static void ParseDragPreviewConfig(const JSCallbackInfo& info, NG::DragDropInfo& dragPreviewInfo); 141 static void ParseDragPreviewValue(const JSCallbackInfo& info, NG::DragDropInfo& dragPreviewInfo); 142 static void ParseDragPreviewBuilderNode(const JSCallbackInfo& info, NG::DragDropInfo& dragPreviewInfo, 143 const JSRef<JSVal>& builder); 144 static void ParseDragInteractionOptions(const JSCallbackInfo& info, NG::DragPreviewOption& previewOption); 145 static NG::DragPreviewOption ParseDragPreviewOptions(const JSCallbackInfo& info); 146 static NG::TransitionOptions ParseJsTransition(const JSRef<JSObject>& jsObj); 147 static RefPtr<NG::ChainedTransitionEffect> ParseJsTransitionEffect(const JSCallbackInfo& info); 148 static void JsWidth(const JSCallbackInfo& info); 149 static void JsHeight(const JSCallbackInfo& info); 150 static void JsBackgroundColor(const JSCallbackInfo& info); 151 static void JsBackgroundImage(const JSCallbackInfo& info); 152 static void JsBackgroundImageSize(const JSCallbackInfo& info); 153 static void JsBackgroundImagePosition(const JSCallbackInfo& info); 154 static void ParseBlurOption(const JSRef<JSObject>& jsBlurOption, BlurOption& blurOption); 155 static void ParseBackgroundImageOption(const JSCallbackInfo& jsOption, int32_t& repeatIndex, bool& syncMode); 156 static void ParseBlurStyleOption(const JSRef<JSObject>& jsOption, BlurStyleOption& styleOption); 157 static void ParseSysOptions(const JSRef<JSObject>& jsSysOptions, SysOptions& sysOptions); 158 static void JsBackgroundBlurStyle(const JSCallbackInfo& info); 159 static void JsBackgroundEffect(const JSCallbackInfo& info); 160 static void ParseEffectOption(const JSRef<JSObject>& jsObj, EffectOption& effectOption); 161 static void ParseBrightnessOption(const JSRef<JSObject>& jsObj, BrightnessOption& brightnessOption); 162 static void JsForegroundBlurStyle(const JSCallbackInfo& info); 163 static void JsForegroundEffect(const JSCallbackInfo& info); 164 static void JsSphericalEffect(const JSCallbackInfo& info); 165 static void JsPixelStretchEffect(const JSCallbackInfo& info); 166 static bool InitPixStretchEffect( 167 CalcDimension& left, CalcDimension& right, CalcDimension& top, CalcDimension bottom); 168 static void JsLightUpEffect(const JSCallbackInfo& info); 169 static void JsBackground(const JSCallbackInfo& info); 170 static void JsBindMenu(const JSCallbackInfo& info); 171 static void JsBindContextMenu(const JSCallbackInfo& info); 172 static void MenuDefaultParam(NG::MenuParam& menuParam); 173 static void ParseContentMenuCommonParam( 174 const JSCallbackInfo& info, const JSRef<JSObject>& menuObj, NG::MenuParam& menuParam); 175 static int32_t OpenMenu(NG::MenuParam& menuParam, const RefPtr<NG::UINode>& customNode, const int32_t& targetId); 176 static int32_t UpdateMenu(const NG::MenuParam& menuParam, const RefPtr<NG::UINode>& customNode); 177 static int32_t CloseMenu(const RefPtr<NG::UINode>& customNode); 178 static void JsBindContentCover(const JSCallbackInfo& info); 179 static void ParseModalStyle(const JSRef<JSObject>& paramObj, NG::ModalStyle& modalStyle); 180 static void JsBindSheet(const JSCallbackInfo& info); 181 static bool CheckJSCallbackInfo( 182 const std::string& callerName, const JSRef<JSVal>& tmpInfo, std::vector<JSCallbackInfoType>& infoTypes); 183 static bool ParseSheetIsShow( 184 const JSCallbackInfo& info, const std::string& name, std::function<void(const std::string&)>& callback); 185 static RefPtr<NG::ChainedTransitionEffect> ParseChainedTransition( 186 const JSRef<JSObject>& object, const JSExecutionContext& context, const RefPtr<NG::FrameNode> node = nullptr); 187 static void ParseSheetStyle( 188 const JSRef<JSObject>& paramObj, NG::SheetStyle& sheetStyle, bool isPartialUpdate = false); 189 static NG::SheetEffectEdge ParseSheetEffectEdge(const JSRef<JSObject>& paramObj); 190 static void ParseBindSheetBorderRadius(const JSRef<JSVal>& args, NG::SheetStyle& sheetStyle); 191 static bool ParseBindSheetBorderRadiusProps(const JSRef<JSVal>& args, NG::BorderRadiusProperty& radius); 192 static std::optional<CalcDimension> ParseBindSheetBorderRadiusProp(const JSRef<JSObject>& object, const char* prop); 193 static bool ParseSheetMode(const std::string heightStr, NG::SheetHeight& detent); 194 static bool ParseSheetDetents(const JSRef<JSVal>& args, std::vector<NG::SheetHeight>& sheetDetents); 195 static bool ParseSheetHeight(const JSRef<JSVal>& args, NG::SheetHeight& detent, bool isReset); 196 static bool ParseSheetBackgroundBlurStyle(const JSRef<JSVal>& args, BlurStyleOption& blurStyleOptions); 197 static bool ParseSheetLevel(const JSRef<JSVal>& args, NG::SheetLevel& sheetLevel); 198 static void ParseCallback(const JSRef<JSObject>& paramObj, 199 std::function<void(const float)>& callbackDidChange, const char* prop); 200 static void ParseLifeCycleCallback(const JSRef<JSObject>& paramObj, std::function<void()>& lifeCycleCallBack, 201 const char* prop); 202 static void ParseSpringBackCallback(const JSRef<JSObject>& paramObj, 203 std::function<void()>& sheetSpringBack, const char* prop); 204 static void ParseSheetCallback(const JSRef<JSObject>& paramObj, std::function<void()>& onAppear, 205 std::function<void()>& onDisappear, std::function<void()>& shouldDismiss, 206 std::function<void(const int32_t info)>& onWillDismiss, std::function<void()>& onWillAppear, 207 std::function<void()>& onWillDisappear, std::function<void(const float)>& onHeightDidChange, 208 std::function<void(const float)>& onDetentsDidChange, 209 std::function<void(const float)>& onWidthDidChange, 210 std::function<void(const float)>& onTypeDidChange, 211 std::function<void()>& sheetSpringBack); 212 static void ParseSheetTitle(const JSRef<JSObject>& paramObj, NG::SheetStyle& sheetStyle, 213 std::function<void()>& titleBuilderFunction); 214 static panda::Local<panda::JSValueRef> JsDismissSheet(panda::JsiRuntimeCallInfo* runtimeCallInfo); 215 static panda::Local<panda::JSValueRef> JsDismissContentCover(panda::JsiRuntimeCallInfo* runtimeCallInfo); 216 static panda::Local<panda::JSValueRef> JsSheetSpringBack(panda::JsiRuntimeCallInfo* runtimeCallInfo); 217 static void ParseModalTransitonEffect( 218 const JSRef<JSObject>& paramObj, NG::ContentCoverParam& contentCoverParam, const JSExecutionContext& context); 219 static void ParseOverlayCallback(const JSRef<JSObject>& paramObj, std::function<void()>& onAppear, 220 std::function<void()>& onDisappear, std::function<void()>& onWillAppear, std::function<void()>& onWillDisappear, 221 std::function<void(const int32_t& info)>& onWillDismiss); 222 static void JsBorderColor(const JSCallbackInfo& info); 223 static void ParseBorderColor(const JSRef<JSVal>& args); 224 static void JsPadding(const JSCallbackInfo& info); 225 static void JsMargin(const JSCallbackInfo& info); 226 static void SetSafeAreaPadding(const JSCallbackInfo& info); 227 static void ParseMarginOrPadding(const JSCallbackInfo& info, EdgeType type); 228 static void ParseMarginOrPaddingCorner(JSRef<JSObject> obj, std::optional<CalcDimension>& top, 229 std::optional<CalcDimension>& bottom, std::optional<CalcDimension>& left, std::optional<CalcDimension>& right); 230 static void ParseLocalizedMarginOrLocalizedPaddingCorner( 231 const JSRef<JSObject>& object, LocalizedCalcDimension& localizedCalcDimension); 232 static bool ParseCommonMarginOrPaddingCorner( 233 const JSRef<JSObject>& object, CommonCalcDimension& commonCalcDimension); 234 static void GetBorderRadiusByLengthMetrics(const char* key, JSRef<JSObject>& object, CalcDimension& radius); 235 static void JsBorder(const JSCallbackInfo& info); 236 static void JsBorderWidth(const JSCallbackInfo& info); 237 static void ParseBorderWidth(const JSRef<JSVal>& args); 238 static void JsBorderRadius(const JSCallbackInfo& info); 239 static void ParseBorderRadius(const JSRef<JSVal>& args); 240 static void JsBorderStyle(const JSCallbackInfo& info); 241 static void ParseBorderStyle(const JSRef<JSVal>& args); 242 static void ParseDashGap(const JSRef<JSVal>& args); 243 static void ParseDashWidth(const JSRef<JSVal>& args); 244 static void JsBorderImage(const JSCallbackInfo& info); 245 static void JsOutline(const JSCallbackInfo& info); 246 static void JsOutlineWidth(const JSCallbackInfo& info); 247 static void JsOutlineColor(const JSCallbackInfo& info); 248 static void JsOutlineStyle(const JSCallbackInfo& info); 249 static void JsOutlineRadius(const JSCallbackInfo& info); 250 static void ParseBorderImageRepeat(const JSRef<JSVal>& args, RefPtr<BorderImage>& borderImage); 251 static void ParseBorderImageOutset(const JSRef<JSVal>& args, RefPtr<BorderImage>& borderImage); 252 static void ParseBorderImageSlice(const JSRef<JSVal>& args, RefPtr<BorderImage>& borderImage); 253 static void ParseBorderImageWidth(const JSRef<JSVal>& args, RefPtr<BorderImage>& borderImage); 254 static bool ParseBorderImageDimension( 255 const JSRef<JSVal>& args, BorderImage::BorderImageOption& borderImageDimension); 256 static void ParseBorderImageLengthMetrics( 257 const JSRef<JSObject>& object, LocalizedCalcDimension& localizedCalcDimension); 258 static void UpdateGradientWithDirection(NG::Gradient& lineGradient, NG::GradientDirection direction); 259 static void ParseBorderImageLinearGradient(const JSRef<JSVal>& args, uint8_t& bitset); 260 static void JsUseEffect(const JSCallbackInfo& info); 261 static void JsUseShadowBatching(const JSCallbackInfo& info); 262 static void JsBlur(const JSCallbackInfo& info); 263 static void JsColorBlend(const JSCallbackInfo& info); 264 static void JsBackdropBlur(const JSCallbackInfo& info); 265 static void JsLinearGradientBlur(const JSCallbackInfo& info); 266 static void JsBackgroundBrightness(const JSCallbackInfo& info); 267 static void JsBackgroundBrightnessInternal(const JSCallbackInfo& info); 268 static void JsForegroundBrightness(const JSCallbackInfo& info); 269 static void JsWindowBlur(const JSCallbackInfo& info); 270 static void JsFlexBasis(const JSCallbackInfo& info); 271 static void JsFlexGrow(const JSCallbackInfo& info); 272 static void JsFlexShrink(const JSCallbackInfo& info); 273 static void JsAlignSelf(const JSCallbackInfo& info); 274 static void JsDisplayPriority(const JSCallbackInfo& info); 275 static void JsSharedTransition(const JSCallbackInfo& info); 276 static void JsGeometryTransition(const JSCallbackInfo& info); 277 static void JsGridSpan(const JSCallbackInfo& Info); 278 static void JsGridOffset(const JSCallbackInfo& info); 279 static void JsUseSizeType(const JSCallbackInfo& Info); 280 static void JsHoverEffect(const JSCallbackInfo& info); 281 static void JsOnMouse(const JSCallbackInfo& info); 282 static void JsOnAxisEvent(const JSCallbackInfo& info); 283 static void JsOnHover(const JSCallbackInfo& info); 284 static void JsOnHoverMove(const JSCallbackInfo& info); 285 static void JsOnAccessibilityHover(const JSCallbackInfo& info); 286 static void JsOnClick(const JSCallbackInfo& info); 287 static void JsOnGestureJudgeBegin(const JSCallbackInfo& args); 288 static void JsOnTouchIntercept(const JSCallbackInfo& info); 289 static void JsShouldBuiltInRecognizerParallelWith(const JSCallbackInfo& info); 290 static void JsOnGestureRecognizerJudgeBegin(const JSCallbackInfo& info); 291 static void JsClickEffect(const JSCallbackInfo& info); 292 static void JsRestoreId(int32_t restoreId); 293 static void JsOnVisibleAreaChange(const JSCallbackInfo& info); 294 static void JsOnVisibleAreaApproximateChange(const JSCallbackInfo& info); 295 static void JsHitTestBehavior(const JSCallbackInfo& info); 296 static void JsOnChildTouchTest(const JSCallbackInfo& info); 297 static void JsForegroundColor(const JSCallbackInfo& info); 298 static void JsSetFreeze(const JSCallbackInfo& info); 299 static void ParseSheetSubWindowValue(const JSRef<JSObject>& paramObj, NG::SheetStyle& sheetStyle); 300 301 // outer border 302 static void ParseOuterBorderColor(const JSRef<JSVal>& args); 303 static void ParseOuterBorderWidth(const JSRef<JSVal>& args); 304 static void ParseOuterBorderRadius(const JSRef<JSVal>& args); 305 static void ParseOuterBorderStyle(const JSRef<JSVal>& args); 306 307 // response region 308 static void JsResponseRegion(const JSCallbackInfo& info); 309 static bool ParseJsResponseRegionArray(const JSRef<JSVal>& jsValue, std::vector<DimensionRect>& result); 310 static bool ParseJsDimensionRect(const JSRef<JSVal>& jsValue, DimensionRect& result); 311 312 // for dynamic $r 313 static void CompleteResourceObject(JSRef<JSObject>& jsObj); 314 static void CompleteResourceObjectWithBundleName( 315 JSRef<JSObject>& jsObj, std::string& bundleName, std::string& moduleName, int32_t& resId); 316 static bool ConvertResourceType(const std::string& typeName, ResourceType& resType); 317 static bool ParseDollarResource(const JSRef<JSVal>& jsValue, std::string& targetModule, ResourceType& resType, 318 std::string& resName, bool isParseType); 319 320 // mouse response response region 321 static void JsMouseResponseRegion(const JSCallbackInfo& info); 322 323 static bool ParseJsLengthNG( 324 const JSRef<JSVal>& jsValue, NG::CalcLength& result, DimensionUnit defaultUnit, bool isSupportPercent = true); 325 static bool ParseJsLengthVpNG(const JSRef<JSVal>& jsValue, NG::CalcLength& result, bool isSupportPercent = true); 326 327 // for number and string with no unit, use default dimension unit. 328 static bool ParseJsDimension(const JSRef<JSVal>& jsValue, CalcDimension& result, DimensionUnit defaultUnit); 329 static bool ParseJsDimensionVp(const JSRef<JSVal>& jsValue, CalcDimension& result); 330 static bool ParseJsDimensionFp(const JSRef<JSVal>& jsValue, CalcDimension& result); 331 static bool ParseJsDimensionPx(const JSRef<JSVal>& jsValue, CalcDimension& result); 332 static bool ParseLengthMetricsToDimension(const JSRef<JSVal>& jsValue, CalcDimension& result); 333 static bool ParseLengthMetricsToPositiveDimension(const JSRef<JSVal>& jsValue, CalcDimension& result); 334 static bool ParseColorMetricsToColor(const JSRef<JSVal>& jsValue, Color& result); 335 static bool ParseJsDouble(const JSRef<JSVal>& jsValue, double& result); 336 static bool ParseJsInt32(const JSRef<JSVal>& jsValue, int32_t& result); 337 static bool ParseJsColorFromResource(const JSRef<JSVal>& jsValue, Color& result); 338 static bool ParseJsObjColorFromResource(const JSRef<JSObject> &jsObj, Color& result); 339 static bool ParseJsColor(const JSRef<JSVal>& jsValue, Color& result); 340 static bool ParseJsColor(const JSRef<JSVal>& jsValue, Color& result, const Color& defaultColor); 341 static bool ParseJsColorStrategy(const JSRef<JSVal>& jsValue, ForegroundColorStrategy& strategy); 342 static bool ParseJsShadowColorStrategy(const JSRef<JSVal>& jsValue, ShadowColorStrategy& strategy); 343 static bool ParseJsFontFamilies(const JSRef<JSVal>& jsValue, std::vector<std::string>& result); 344 345 static bool ParseJsDimensionNG( 346 const JSRef<JSVal>& jsValue, CalcDimension& result, DimensionUnit defaultUnit, bool isSupportPercent = true); 347 static bool ParseJsDimensionVpNG(const JSRef<JSVal>& jsValue, CalcDimension& result, bool isSupportPercent = true); 348 static bool ParseJsDimensionFpNG(const JSRef<JSVal>& jsValue, CalcDimension& result, bool isSupportPercent = true); 349 static bool ParseJsLengthMetricsVp(const JSRef<JSObject>& jsObj, CalcDimension& result); 350 static bool ParseJsonDimension(const std::unique_ptr<JsonValue>& jsonValue, CalcDimension& result, 351 DimensionUnit defaultUnit, bool checkIllegal = false); 352 static bool ParseJsonDimensionVp( 353 const std::unique_ptr<JsonValue>& jsonValue, CalcDimension& result, bool checkIllegal = false); 354 static bool ParseJsonDouble(const std::unique_ptr<JsonValue>& jsonValue, double& result); 355 static bool ParseJsonColor(const std::unique_ptr<JsonValue>& jsonValue, Color& result); 356 static bool ParseJsString(const JSRef<JSVal>& jsValue, std::string& result); 357 static bool ParseJsString(const JSRef<JSVal>& jsValue, std::u16string& result); 358 static bool ParseJsMedia(const JSRef<JSVal>& jsValue, std::string& result); 359 static bool ParseJsMediaWithBundleName(const JSRef<JSVal>& jsValue, std::string& result, std::string& bundleName, 360 std::string& moduleName, int32_t& resId); 361 static bool ParseResourceToDouble(const JSRef<JSVal>& jsValue, double& result); 362 static bool ParseJsBool(const JSRef<JSVal>& jsValue, bool& result); 363 static bool ParseJsInteger(const JSRef<JSVal>& jsValue, uint32_t& result); 364 static bool ParseJsInteger(const JSRef<JSVal>& jsValue, int32_t& result); 365 static bool ParseJsIntegerArray(const JSRef<JSVal>& jsValue, std::vector<uint32_t>& result); 366 static bool ParseJsStrArray(const JSRef<JSVal>& jsValue, std::vector<std::string>& result); 367 static bool ParseJsLengthMetricsArray(const JSRef<JSVal>& jsValue, std::vector<Dimension>& result); 368 static bool IsGetResourceByName(const JSRef<JSObject>& jsObj); 369 static bool GetJsMediaBundleInfo(const JSRef<JSVal>& jsValue, std::string& bundleName, std::string& moduleName); 370 static bool ParseShadowProps(const JSRef<JSVal>& jsValue, Shadow& shadow); 371 static void ParseShadowOffsetXY(const JSRef<JSObject>& jsObj, Shadow& shadow); 372 static bool GetShadowFromTheme(ShadowStyle shadowStyle, Shadow& shadow); 373 static bool ParseJsResource(const JSRef<JSVal>& jsValue, CalcDimension& result); 374 static bool ParseDataDetectorConfig(const JSCallbackInfo& info, TextDetectConfig& textDetectConfig); 375 static bool ParseAIEntityColor(const JSRef<JSObject>& obj, TextDetectConfig& textDetectConfig); 376 static bool ParseInvertProps(const JSRef<JSVal>& jsValue, InvertVariant& invert); 377 static std::pair<CalcDimension, CalcDimension> ParseSize(const JSCallbackInfo& info); 378 static void JsUseAlign(const JSCallbackInfo& info); 379 static void JsZIndex(const JSCallbackInfo& info); 380 static void SetDirection(const std::string& dir); 381 static void JsSize(const JSCallbackInfo& info); 382 static void JsConstraintSize(const JSCallbackInfo& info); 383 static void JsLayoutPriority(const JSCallbackInfo& info); 384 static void JsLayoutWeight(const JSCallbackInfo& info); 385 386 static void JsAlign(const JSCallbackInfo& info); 387 static void JsPosition(const JSCallbackInfo& info); 388 static void JsMarkAnchor(const JSCallbackInfo& info); 389 static void JsOffset(const JSCallbackInfo& info); 390 static void JsEnabled(const JSCallbackInfo& info); 391 static void JsAspectRatio(const JSCallbackInfo& info); 392 static void JsOverlay(const JSCallbackInfo& info); 393 static Alignment ParseAlignment(int32_t align); 394 static void JsAlignRules(const JSCallbackInfo& info); 395 static void JsChainMode(const JSCallbackInfo& info); 396 397 static void SetVisibility(const JSCallbackInfo& info); 398 static void Pop(); 399 400 static void JsSetDraggable(bool draggable); 401 static void JsSetDragPreviewOptions(const JSCallbackInfo& info); 402 static void JsOnDragStart(const JSCallbackInfo& info); 403 static bool ParseAndUpdateDragItemInfo(const JSRef<JSVal>& info, NG::DragDropBaseInfo& dragInfo); 404 static RefPtr<AceType> ParseDragNode(const JSRef<JSVal>& info); 405 static void JsOnDragEnter(const JSCallbackInfo& info); 406 static void JsOnDragEnd(const JSCallbackInfo& info); 407 static void JsOnDragMove(const JSCallbackInfo& info); 408 static void JsOnDragLeave(const JSCallbackInfo& info); 409 static void JsOnPreDrag(const JSCallbackInfo& info); 410 static void JsOnDrop(const JSCallbackInfo& info); 411 static void JsOnAreaChange(const JSCallbackInfo& info); 412 static void JsOnSizeChange(const JSCallbackInfo& info); 413 414 static void JsLinearGradient(const JSCallbackInfo& info); 415 static void JsRadialGradient(const JSCallbackInfo& info); 416 static void JsSweepGradient(const JSCallbackInfo& info); 417 static void NewJsLinearGradient(const JSCallbackInfo& info, NG::Gradient& gradient); 418 static void SetGradientDirection(NG::Gradient& newGradient, const GradientDirection& direction); 419 static void NewJsRadialGradient(const JSCallbackInfo& info, NG::Gradient& gradient); 420 static void NewJsSweepGradient(const JSCallbackInfo& info, NG::Gradient& gradient); 421 static void ParseSweepGradientPartly(const JSRef<JSObject>& obj, NG::Gradient& newGradient); 422 static void JsMotionPath(const JSCallbackInfo& info); 423 static void JsMotionBlur(const JSCallbackInfo& info); 424 static void JsShadow(const JSCallbackInfo& info); 425 static void JsBlendMode(const JSCallbackInfo& info); 426 static void JsAdvancedBlendMode(const JSCallbackInfo& info); 427 static void JsGrayScale(const JSCallbackInfo& info); 428 static void JsBrightness(const JSCallbackInfo& info); 429 static void JsContrast(const JSCallbackInfo& info); 430 static void JsSaturate(const JSCallbackInfo& info); 431 static void JsSepia(const JSCallbackInfo& info); 432 static void JsInvert(const JSCallbackInfo& info); 433 static void JsSystemBarEffect(const JSCallbackInfo& info); 434 static void JsHueRotate(const JSCallbackInfo& info); 435 436 static void JsClip(const JSCallbackInfo& info); 437 static void JsClipShape(const JSCallbackInfo& info); 438 439 static void JsMask(const JSCallbackInfo& info); 440 static void JsMaskShape(const JSCallbackInfo& info); 441 442 static void JsKey(const std::string& key); 443 static void JsId(const JSCallbackInfo& info); 444 445 static void JsFocusable(const JSCallbackInfo& info); 446 static void JsTabStop(const JSCallbackInfo& info); 447 static void JsNextFocus(const JSCallbackInfo& info); 448 static void JsFocusBox(const JSCallbackInfo& info); 449 static void JsOnFocusMove(const JSCallbackInfo& args); 450 static void JsOnKeyEvent(const JSCallbackInfo& args); 451 static void JsDispatchKeyEvent(const JSCallbackInfo& args); 452 static void JsOnFocus(const JSCallbackInfo& args); 453 static void JsOnBlur(const JSCallbackInfo& args); 454 static void JsTabIndex(const JSCallbackInfo& info); 455 static void JsFocusOnTouch(const JSCallbackInfo& info); 456 static void JsDefaultFocus(const JSCallbackInfo& info); 457 static void JsGroupDefaultFocus(const JSCallbackInfo& info); 458 static void JsDebugLine(const JSCallbackInfo& info); 459 static void JsOpacityPassThrough(const JSCallbackInfo& info); 460 static void JsTransitionPassThrough(const JSCallbackInfo& info); 461 static void JsKeyboardShortcut(const JSCallbackInfo& info); 462 static void JsOnFocusAxisEvent(const JSCallbackInfo& args); 463 static void JsOnCrownEvent(const JSCallbackInfo& args); 464 465 static void JsObscured(const JSCallbackInfo& info); 466 static void JsPrivacySensitive(const JSCallbackInfo& info); 467 468 static void JsAccessibilityGroup(const JSCallbackInfo& info); 469 static void JsAccessibilityText(const JSCallbackInfo& info); 470 static void JsAccessibilityTextHint(const std::string& text); 471 static void JsAccessibilityNextFocusId(const JSCallbackInfo& info); 472 static void JsAccessibilityDescription(const JSCallbackInfo& info); 473 static void JsAccessibilityImportance(const std::string& importance); 474 static void JsAccessibilityLevel(const std::string& level); 475 static void JsAccessibilitySelected(const JSCallbackInfo& info); 476 static void JsAccessibilityChecked(const JSCallbackInfo& info); 477 static void JsAccessibilityRole(const JSCallbackInfo& info); 478 static void JsOnAccessibilityFocus(const JSCallbackInfo& info); 479 static void JsAccessibilityDefaultFocus(const JSCallbackInfo& info); 480 static void JsAccessibilityUseSamePage(const JSCallbackInfo& info); 481 static void JsAccessibilityScrollTriggerable(const JSCallbackInfo& info); 482 static void JsAccessibilityFocusDrawLevel(const JSCallbackInfo& info); 483 static void JsAllowDrop(const JSCallbackInfo& info); 484 static void JsDrawModifier(const JSCallbackInfo& info); 485 static void JsDragPreview(const JSCallbackInfo& info); 486 static void JsAccessibilityVirtualNode(const JSCallbackInfo& info); 487 488 static void ParseAccessibilityDescriptionJson(const std::string& description, 489 std::pair<bool, std::string>& autoEventPair, std::pair<bool, std::string>& descriptionPair); 490 491 static void JSCreateAnimatableProperty(const JSCallbackInfo& info); 492 static void JSUpdateAnimatableProperty(const JSCallbackInfo& info); 493 static void JSRenderGroup(const JSCallbackInfo& info); 494 static void JSRenderFit(const JSCallbackInfo& info); 495 static void JsExpandSafeArea(const JSCallbackInfo& info); 496 static void JsGestureModifier(const JSCallbackInfo& info); 497 static void JsCustomProperty(const JSCallbackInfo& info); 498 499 static void JsBackgroundImageResizable(const JSCallbackInfo& info); 500 static void JsSetDragEventStrictReportingEnabled(const JSCallbackInfo& info); 501 static void JsCancelDataLoading(const std::string& key); 502 static void SetSymbolOptionApply(const JSCallbackInfo& info, 503 std::function<void(WeakPtr<NG::FrameNode>)>& symbolApply, const JSRef<JSVal> modifierObj); 504 static void SetTextStyleApply(const JSCallbackInfo& info, 505 std::function<void(WeakPtr<NG::FrameNode>)>& textStyleApply, const JSRef<JSVal>& modifierObj); 506 507 #ifndef WEARABLE_PRODUCT 508 static void JsBindPopup(const JSCallbackInfo& info); 509 static void JsBindTips(const JSCallbackInfo& info); 510 static void SetPopupDismiss( 511 const JSCallbackInfo& info, const JSRef<JSObject>& popupObj, const RefPtr<PopupParam>& popupParam); 512 static PopupOnWillDismiss ParsePopupCallback(const JSCallbackInfo& info, const JSRef<JSObject>& paramObj); 513 static panda::Local<panda::JSValueRef> JsDismissPopup(panda::JsiRuntimeCallInfo* runtimeCallInfo); 514 static void ParseContentPopupCommonParam( 515 const JSCallbackInfo& info, const JSRef<JSObject>& popupObj, const RefPtr<PopupParam>& popupParam); 516 static int32_t OpenPopup(const RefPtr<PopupParam>& param, const RefPtr<NG::UINode>& customNode); 517 static int32_t UpdatePopup(const RefPtr<PopupParam>& param, const RefPtr<NG::UINode>& customNode); 518 static int32_t ClosePopup(const RefPtr<NG::UINode>& customNode); 519 static int32_t GetPopupParam(RefPtr<PopupParam>& param, const RefPtr<NG::UINode>& customNode); 520 #endif 521 522 /** 523 * Binds the native methods to the the js object 524 */ 525 static void JSBind(BindingTarget globalObj); 526 static void JsNotifyDragStartRequest(const JSCallbackInfo& info); 527 static void ParseDialogCallback(const JSRef<JSObject>& paramObj, 528 std::function<void(const int32_t& info, const int32_t& instanceId)>& onWillDismiss); 529 static void ParseAppearDialogCallback(const JSCallbackInfo& info, DialogProperties& dialogProperties); 530 static panda::Local<panda::JSValueRef> JsDismissDialog(panda::JsiRuntimeCallInfo* runtimeCallInfo); 531 GetPipelineContext()532 static RefPtr<PipelineBase> GetPipelineContext() 533 { 534 auto container = Container::Current(); 535 CHECK_NULL_RETURN(container, nullptr); 536 return container->GetPipelineContext(); 537 } 538 539 template<typename T> GetTheme()540 static RefPtr<T> GetTheme() 541 { 542 auto pipelineContext = GetPipelineContext(); 543 CHECK_NULL_RETURN(pipelineContext, nullptr); 544 auto themeManager = pipelineContext->GetThemeManager(); 545 CHECK_NULL_RETURN(themeManager, nullptr); 546 auto node = NG::ViewStackProcessor::GetInstance()->GetMainFrameNode(); 547 return node ? themeManager->GetTheme<T>(node->GetThemeScopeId()) : themeManager->GetTheme<T>(); 548 } 549 550 template<typename T> GetTheme(int32_t themeScopeId)551 static RefPtr<T> GetTheme(int32_t themeScopeId) 552 { 553 auto pipelineContext = GetPipelineContext(); 554 CHECK_NULL_RETURN(pipelineContext, nullptr); 555 auto themeManager = pipelineContext->GetThemeManager(); 556 CHECK_NULL_RETURN(themeManager, nullptr); 557 return themeManager->GetTheme<T>(themeScopeId); 558 } 559 560 /** 561 * box properties setter 562 */ 563 static const Border& GetBorder(); 564 static void SetMarginTop(const JSCallbackInfo& info); 565 static void SetMarginBottom(const JSCallbackInfo& info); 566 static void SetMarginLeft(const JSCallbackInfo& info); 567 static void SetMarginRight(const JSCallbackInfo& info); 568 static void SetPaddingTop(const JSCallbackInfo& info); 569 static void SetPaddingBottom(const JSCallbackInfo& info); 570 static void SetPaddingLeft(const JSCallbackInfo& info); 571 static void SetPaddingRight(const JSCallbackInfo& info); 572 static void SetBorder(const Border& border); 573 static void SetBorderStyle(int32_t style); 574 static void SetBorderColor(const Color& color, const AnimationOption& option); 575 static void SetBorderWidth(const CalcDimension& value, const AnimationOption& option); 576 static void SetColorBlend(Color color); 577 static void SetLinearGradientBlur(NG::LinearGradientBlurPara blurPara); 578 static void SetDynamicLightUp(float rate, float lightUpDegree); 579 static void SetBgDynamicBrightness(BrightnessOption brightnessOption); 580 static void SetFgDynamicBrightness(BrightnessOption brightnessOption); 581 static void SetWindowBlur(float progress, WindowBlurStyle blurStyle); 582 static RefPtr<ThemeConstants> GetThemeConstants(const JSRef<JSObject>& jsObj = JSRef<JSObject>()); 583 static bool JsWidth(const JSRef<JSVal>& jsValue); 584 static bool JsHeight(const JSRef<JSVal>& jsValue); 585 static void GetBorderRadius(const char* key, JSRef<JSObject>& object, CalcDimension& radius); 586 static bool ParseAllBorderRadiuses(JSRef<JSObject>& object, CalcDimension& topLeft, CalcDimension& topRight, 587 CalcDimension& bottomLeft, CalcDimension& bottomRight); 588 static void JsPointLight(const JSCallbackInfo& info); 589 590 template<typename T> ParseJsInteger(const JSRef<JSVal> & jsValue,T & result)591 static bool ParseJsInteger(const JSRef<JSVal>& jsValue, T& result) 592 { 593 if (jsValue->IsNumber()) { 594 result = jsValue->ToNumber<T>(); 595 return true; 596 } 597 598 if (!jsValue->IsObject()) { 599 return false; 600 } 601 JSRef<JSObject> jsObj = JSRef<JSObject>::Cast(jsValue); 602 CompleteResourceObject(jsObj); 603 int32_t resType = jsObj->GetPropertyValue<int32_t>("type", -1); 604 if (resType == -1) { 605 return false; 606 } 607 608 JSRef<JSVal> resId = jsObj->GetProperty("id"); 609 if (!resId->IsNumber()) { 610 return false; 611 } 612 613 auto resourceObject = GetResourceObjectByBundleAndModule(jsObj); 614 auto resourceWrapper = CreateResourceWrapper(jsObj, resourceObject); 615 auto resIdNum = resId->ToNumber<int32_t>(); 616 if (resIdNum == -1) { 617 if (!IsGetResourceByName(jsObj)) { 618 return false; 619 } 620 JSRef<JSVal> args = jsObj->GetProperty("params"); 621 if (!args->IsArray()) { 622 return false; 623 } 624 JSRef<JSArray> params = JSRef<JSArray>::Cast(args); 625 auto param = params->GetValueAt(0); 626 if (resType == static_cast<int32_t>(ResourceType::INTEGER)) { 627 result = static_cast<T>(resourceWrapper->GetIntByName(param->ToString())); 628 return true; 629 } 630 return false; 631 } 632 if (resType == static_cast<int32_t>(ResourceType::INTEGER)) { 633 result = static_cast<T>(resourceWrapper->GetInt(resId->ToNumber<uint32_t>())); 634 return true; 635 } 636 return false; 637 } 638 GetFunctionKeyName(FunctionKey functionkey)639 static std::string GetFunctionKeyName(FunctionKey functionkey) 640 { 641 std::map<FunctionKey, std::string> keyNameMap { 642 {FunctionKey::ESC, "ESC"}, 643 {FunctionKey::F1, "F1"}, 644 {FunctionKey::F2, "F2"}, 645 {FunctionKey::F3, "F3"}, 646 {FunctionKey::F4, "F4"}, 647 {FunctionKey::F5, "F5"}, 648 {FunctionKey::F6, "F6"}, 649 {FunctionKey::F7, "F7"}, 650 {FunctionKey::F8, "F8"}, 651 {FunctionKey::F9, "F9"}, 652 {FunctionKey::F10, "F10"}, 653 {FunctionKey::F11, "F11"}, 654 {FunctionKey::F12, "F12"}, 655 {FunctionKey::TAB, "TAB"}, 656 {FunctionKey::DPAD_UP, "DPAD_UP"}, 657 {FunctionKey::DPAD_DOWN, "DPAD_DOWN"}, 658 {FunctionKey::DPAD_LEFT, "DPAD_LEFT"}, 659 {FunctionKey::DPAD_RIGHT, "DPAD_RIGHT"} 660 }; 661 auto result = keyNameMap.find(functionkey); 662 return (result != keyNameMap.end()) ? result->second : std::string(); 663 } 664 665 static bool CheckColor(const JSRef<JSVal>& jsValue, Color& result, const char* componentName, const char* propName); 666 static bool CheckLength( 667 const JSRef<JSVal>& jsValue, CalcDimension& result, const char* componentName, const char* propName); 668 static bool CheckResource(RefPtr<ResourceObject> resourceObject, 669 RefPtr<ResourceWrapper> resourceWrapper); 670 static bool CheckCustomSymbolId(RefPtr<ResourceWrapper> resourceWrapper, JSRef<JSVal>& resId, 671 std::uint32_t& symbolId); 672 static bool ParseJsSymbolId( 673 const JSRef<JSVal>& jsValue, uint32_t& symbolId, RefPtr<ResourceObject>& symbolResourceObject); 674 static void ParseJsSymbolCustomFamilyNames(std::vector<std::string>& customFamilyNames, 675 const JSRef<JSVal>& jsValue); 676 static bool ParseJsSymbolColor(const JSRef<JSVal>& jsValue, std::vector<Color>& result); 677 static bool ParseBorderWidthProps(const JSRef<JSVal>& args, NG::BorderWidthProperty& borderWidthProperty); 678 static bool ParseBorderColorProps(const JSRef<JSVal>& args, NG::BorderColorProperty& colorProperty); 679 static bool ParseBorderStyleProps(const JSRef<JSVal>& args, NG::BorderStyleProperty& borderStyleProperty); 680 static bool ParseBorderRadius(const JSRef<JSVal>& args, NG::BorderRadiusProperty& radius); 681 static void ParseCommonBorderRadiusProps(const JSRef<JSObject>& object, NG::BorderRadiusProperty& radius); 682 static void ParseBorderRadiusProps(const JSRef<JSObject>& object, NG::BorderRadiusProperty& radius); 683 static bool ParseEditMenuOptions(const JSCallbackInfo& info, NG::OnCreateMenuCallback& onCreateMenuCallback, 684 NG::OnMenuItemClickCallback& onMenuItemClick); 685 static void SetDialogProperties(const JSRef<JSObject>& obj, DialogProperties& properties); 686 static void SetDialogHoverModeProperties(const JSRef<JSObject>& obj, DialogProperties& properties); 687 static void SetDialogBlurStyleOption(const JSRef<JSObject>& obj, DialogProperties& properties); 688 static void SetDialogEffectOption(const JSRef<JSObject>& obj, DialogProperties& properties); 689 static std::function<void(NG::DrawingContext& context)> GetDrawCallback( 690 const RefPtr<JsFunction>& jsDraw, const JSExecutionContext& execCtx, JSRef<JSObject> modifier); 691 692 static RefPtr<NG::ChainedTransitionEffect> ParseNapiChainedTransition( 693 const JSRef<JSObject>& object, const JSExecutionContext& context); 694 static void JsFocusScopeId(const JSCallbackInfo& info); 695 static void JsFocusScopePriority(const JSCallbackInfo& info); 696 static int32_t ParseJsPropertyId(const JSRef<JSVal>& jsValue); 697 static void JsVisualEffect(const JSCallbackInfo& info); 698 static void JsBackgroundFilter(const JSCallbackInfo& info); 699 static void JsForegroundFilter(const JSCallbackInfo& info); 700 static void JsCompositingFilter(const JSCallbackInfo& info); 701 static NG::PaddingProperty GetLocalizedPadding(const std::optional<CalcDimension>& top, 702 const std::optional<CalcDimension>& bottom, const std::optional<CalcDimension>& start, 703 const std::optional<CalcDimension>& end); 704 static NG::BorderColorProperty GetLocalizedBorderColor(const std::optional<Color>& colorStart, 705 const std::optional<Color>& colorEnd, const std::optional<Color>& colorTop, 706 const std::optional<Color>& colorBottom); 707 static NG::BorderRadiusProperty GetLocalizedBorderRadius(const std::optional<Dimension>& radiusTopStart, 708 const std::optional<Dimension>& radiusTopEnd, const std::optional<Dimension>& radiusBottomStart, 709 const std::optional<Dimension>& radiusBottomEnd); 710 static void ParseDetentSelection(const JSRef<JSObject>& paramObj, NG::SheetStyle& sheetStyle); 711 712 private: 713 static bool ParseJsStringObj(const JSRef<JSVal>& jsValue, std::string& result); 714 static bool ParseJSMediaInternal(const JSRef<JSObject>& jsValue, std::string& result); 715 static bool ParseResourceToDoubleByName( 716 const JSRef<JSObject>& jsObj, int32_t resType, const RefPtr<ResourceWrapper>& resourceWrapper, double& result); 717 static bool ParseResourceToDoubleById( 718 int32_t resId, int32_t resType, const RefPtr<ResourceWrapper>& resourceWrapper, double& result); 719 720 static std::vector<NG::MenuOptionsParam> ParseMenuItems(const JSRef<JSArray>& menuItemsArray); 721 static void ParseOnCreateMenu( 722 const JSCallbackInfo& info, const JSRef<JSVal>& jsFunc, NG::OnCreateMenuCallback& onCreateMenuCallback); 723 static JSRef<JSVal> CreateJsTextMenuItem(const NG::MenuItemParam& menuItemParam); 724 static JSRef<JSVal> CreateJsTextRange(const NG::MenuItemParam& menuItemParam); 725 static JSRef<JSObject> CreateJsTextMenuId(const std::string& id); 726 static JSRef<JSArray> CreateJsOnMenuItemClick(const NG::MenuItemParam& menuItemParam); 727 static JSRef<JSVal> CreateJsSystemMenuItems(const std::vector<NG::MenuItemParam>& systemMenuItems); 728 static void CompleteResourceObjectInner( 729 JSRef<JSObject>& jsObj, std::string& bundleName, std::string& moduleName, int32_t& resIdValue); 730 }; 731 } // namespace OHOS::Ace::Framework 732 #endif // JS_VIEW_ABSTRACT_H 733