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