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