1 /* 2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_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 "bridge/declarative_frontend/engine/bindings.h" 27 #include "bridge/declarative_frontend/engine/functions/js_function.h" 28 #include "bridge/declarative_frontend/engine/js_ref_ptr.h" 29 #include "core/common/container.h" 30 #include "core/components/common/properties/popup_param.h" 31 #include "core/components/theme/theme_manager.h" 32 #include "core/components_ng/event/gesture_event_hub.h" 33 #include "core/components_ng/pattern/overlay/sheet_presentation_pattern.h" 34 #include "core/components_ng/pattern/text/text_menu_extension.h" 35 #include "core/components_ng/property/gradient_property.h" 36 #include "core/components_ng/property/transition_property.h" 37 38 namespace OHOS::Ace::Framework { 39 40 constexpr int32_t DEFAULT_TAP_FINGERS = 1; 41 constexpr int32_t DEFAULT_TAP_COUNTS = 1; 42 constexpr float DEFAULT_PROGRESS_TOTAL = 100.0f; 43 44 enum class ResourceType : uint32_t { 45 COLOR = 10001, 46 FLOAT, 47 STRING, 48 PLURAL, 49 BOOLEAN, 50 INTARRAY, 51 INTEGER, 52 PATTERN, 53 STRARRAY, 54 MEDIA = 20000, 55 RAWFILE = 30000 56 }; 57 58 enum class JSCallbackInfoType { STRING, NUMBER, OBJECT, BOOLEAN, FUNCTION }; 59 60 class JSViewAbstract { 61 public: 62 static void GetAngle( 63 const std::string& key, const std::unique_ptr<JsonValue>& jsonValue, std::optional<float>& angle); 64 static void CheckAngle(std::optional<float>& angle); 65 static void GetPerspective(const std::string& key, const std::unique_ptr<JsonValue>& jsonValue, float& perspective); 66 static void GetGradientColorStops(Gradient& gradient, const std::unique_ptr<JsonValue>& jsonValue); 67 static void GetFractionStops( 68 std::vector<std::pair<float, float>>& fractionStops, const std::unique_ptr<JsonValue>& array); 69 static void NewGetGradientColorStops(NG::Gradient& gradient, const std::unique_ptr<JsonValue>& jsonValue); 70 71 static void JsScale(const JSCallbackInfo& info); 72 static void SetDefaultScale(); 73 static void JsScaleX(const JSCallbackInfo& info); 74 static void JsScaleY(const JSCallbackInfo& info); 75 static void JsOpacity(const JSCallbackInfo& info); 76 static void JsTranslate(const JSCallbackInfo& info); 77 static void SetDefaultTranslate(); 78 static void JsTranslateX(const JSCallbackInfo& info); 79 static void JsTranslateY(const JSCallbackInfo& info); 80 static void JsRotate(const JSCallbackInfo& info); 81 static void SetDefaultRotate(); 82 static void JsRotateX(const JSCallbackInfo& info); 83 static void JsRotateY(const JSCallbackInfo& info); 84 static void JsTransform(const JSCallbackInfo& info); 85 static void SetDefaultTransform(); 86 static void JsTransition(const JSCallbackInfo& info); 87 static NG::TransitionOptions ParseTransition(std::unique_ptr<JsonValue>& transitionArgs); 88 static void JsWidth(const JSCallbackInfo& info); 89 static void JsHeight(const JSCallbackInfo& info); 90 static void JsBackgroundColor(const JSCallbackInfo& info); 91 static void JsBackgroundImage(const JSCallbackInfo& info); 92 static void JsBackgroundImageSize(const JSCallbackInfo& info); 93 static void JsBackgroundImagePosition(const JSCallbackInfo& info); 94 static void JsBackgroundBlurStyle(const JSCallbackInfo& info); 95 static void JsBackgroundEffect(const JSCallbackInfo& info); 96 static void JsForegroundBlurStyle(const JSCallbackInfo& info); 97 static void JsSphericalEffect(const JSCallbackInfo& info); 98 static void JsPixelStretchEffect(const JSCallbackInfo& info); 99 static void JsLightUpEffect(const JSCallbackInfo& info); 100 static void JsBackground(const JSCallbackInfo& info); 101 static void JsBindMenu(const JSCallbackInfo& info); 102 static void JsBindContextMenu(const JSCallbackInfo& info); 103 static void JsBindContentCover(const JSCallbackInfo& info); 104 static void ParseModalStyle(const JSRef<JSObject>& paramObj, NG::ModalStyle& modalStyle); 105 static void JsBindSheet(const JSCallbackInfo& info); 106 static void ParseSheetStyle(const JSRef<JSObject>& paramObj, NG::SheetStyle& sheetStyle); 107 static void ParseOverlayCallback( 108 const JSRef<JSObject>& paramObj, std::function<void()>& onAppear, std::function<void()>& onDisappear); 109 static void JsBorderColor(const JSCallbackInfo& info); 110 static void ParseBorderColor(const JSRef<JSVal>& args); 111 static void JsPadding(const JSCallbackInfo& info); 112 static void JsMargin(const JSCallbackInfo& info); 113 static void ParseMarginOrPadding(const JSCallbackInfo& info, bool isMargin); 114 static void JsBorder(const JSCallbackInfo& info); 115 static void JsBorderWidth(const JSCallbackInfo& info); 116 static void ParseBorderWidth(const JSRef<JSVal>& args); 117 static void JsBorderRadius(const JSCallbackInfo& info); 118 static void ParseBorderRadius(const JSRef<JSVal>& args); 119 static void JsBorderStyle(const JSCallbackInfo& info); 120 static void ParseBorderStyle(const JSRef<JSVal>& args); 121 static void JsBorderImage(const JSCallbackInfo& info); 122 static void ParseBorderImageRepeat(const JSRef<JSVal>& args, RefPtr<BorderImage>& borderImage); 123 static void ParseBorderImageOutset(const JSRef<JSVal>& args, RefPtr<BorderImage>& borderImage); 124 static void ParseBorderImageSlice(const JSRef<JSVal>& args, RefPtr<BorderImage>& borderImage); 125 static void ParseBorderImageWidth(const JSRef<JSVal>& args, RefPtr<BorderImage>& borderImage); 126 static void ParseBorderImageDimension( 127 const JSRef<JSVal>& args, BorderImage::BorderImageOption& borderImageDimension); 128 static void ParseBorderImageLinearGradient(const JSRef<JSVal>& args, uint8_t& bitset); 129 static void JsUseEffect(const JSCallbackInfo& info); 130 static void JsBlur(const JSCallbackInfo& info); 131 static void JsColorBlend(const JSCallbackInfo& info); 132 static void JsBackdropBlur(const JSCallbackInfo& info); 133 static void JsLinearGradientBlur(const JSCallbackInfo& info); 134 static void JsDynamicLightUp(const JSCallbackInfo& info); 135 static void JsWindowBlur(const JSCallbackInfo& info); 136 static void JsFlexBasis(const JSCallbackInfo& info); 137 static void JsFlexGrow(const JSCallbackInfo& info); 138 static void JsFlexShrink(const JSCallbackInfo& info); 139 static void JsAlignSelf(const JSCallbackInfo& info); 140 static void JsDisplayPriority(const JSCallbackInfo& info); 141 static void JsSharedTransition(const JSCallbackInfo& info); 142 static void JsGeometryTransition(const JSCallbackInfo& info); 143 static void JsGridSpan(const JSCallbackInfo& Info); 144 static void JsGridOffset(const JSCallbackInfo& info); 145 static void JsUseSizeType(const JSCallbackInfo& Info); 146 static void JsHoverEffect(const JSCallbackInfo& info); 147 static void JsOnMouse(const JSCallbackInfo& info); 148 static void JsOnHover(const JSCallbackInfo& info); 149 static void JsOnClick(const JSCallbackInfo& info); 150 static void JsClickEffect(const JSCallbackInfo& info); 151 static void JsRestoreId(int32_t restoreId); 152 static void JsOnVisibleAreaChange(const JSCallbackInfo& info); 153 static void JsHitTestBehavior(const JSCallbackInfo& info); 154 static void JsForegroundColor(const JSCallbackInfo& info); 155 156 // response region 157 static void JsResponseRegion(const JSCallbackInfo& info); 158 static bool ParseJsResponseRegionArray(const JSRef<JSVal>& jsValue, std::vector<DimensionRect>& result); 159 static bool ParseJsDimensionRect(const JSRef<JSVal>& jsValue, DimensionRect& result); 160 161 // mouse response response region 162 static void JsMouseResponseRegion(const JSCallbackInfo& info); 163 164 // for number and string with no unit, use default dimension unit. 165 static bool ParseJsDimension(const JSRef<JSVal>& jsValue, CalcDimension& result, DimensionUnit defaultUnit); 166 static bool ParseJsDimensionVp(const JSRef<JSVal>& jsValue, CalcDimension& result); 167 static bool ParseJsDimensionFp(const JSRef<JSVal>& jsValue, CalcDimension& result); 168 static bool ParseJsDimensionPx(const JSRef<JSVal>& jsValue, CalcDimension& result); 169 static bool ParseJsDouble(const JSRef<JSVal>& jsValue, double& result); 170 static bool ParseJsInt32(const JSRef<JSVal>& jsValue, int32_t& result); 171 static bool ParseJsColorFromResource(const JSRef<JSVal>& jsValue, Color& result); 172 static bool ParseJsColor(const JSRef<JSVal>& jsValue, Color& result); 173 static bool ParseJsColorStrategy(const JSRef<JSVal>& jsValue, ForegroundColorStrategy& strategy); 174 static bool ParseJsFontFamilies(const JSRef<JSVal>& jsValue, std::vector<std::string>& result); 175 176 static bool ParseJsDimensionNG( 177 const JSRef<JSVal>& jsValue, CalcDimension& result, DimensionUnit defaultUnit, bool isSupportPercent = true); 178 static bool ParseJsDimensionVpNG(const JSRef<JSVal>& jsValue, CalcDimension& result, bool isSupportPercent = true); 179 180 static bool ParseJsonDimension(const std::unique_ptr<JsonValue>& jsonValue, CalcDimension& result, 181 DimensionUnit defaultUnit, bool checkIllegal = false); 182 static bool ParseJsonDimensionVp( 183 const std::unique_ptr<JsonValue>& jsonValue, CalcDimension& result, bool checkIllegal = false); 184 static bool ParseJsonDouble(const std::unique_ptr<JsonValue>& jsonValue, double& result); 185 static bool ParseJsonColor(const std::unique_ptr<JsonValue>& jsonValue, Color& result); 186 static bool ParseJsString(const JSRef<JSVal>& jsValue, std::string& result); 187 static bool ParseJsMedia(const JSRef<JSVal>& jsValue, std::string& result); 188 static bool ParseResourceToDouble(const JSRef<JSVal>& jsValue, double& result); 189 static bool ParseJsBool(const JSRef<JSVal>& jsValue, bool& result); 190 static bool ParseJsInteger(const JSRef<JSVal>& jsValue, uint32_t& result); 191 static bool ParseJsInteger(const JSRef<JSVal>& jsValue, int32_t& result); 192 static bool ParseJsIntegerArray(const JSRef<JSVal>& jsValue, std::vector<uint32_t>& result); 193 static bool ParseJsStrArray(const JSRef<JSVal>& jsValue, std::vector<std::string>& result); 194 static bool IsGetResourceByName(const JSRef<JSObject>& jsObj); 195 static void GetJsMediaBundleInfo(const JSRef<JSVal>& jsValue, std::string& bundleName, std::string& moduleName); 196 197 static std::pair<CalcDimension, CalcDimension> ParseSize(const JSCallbackInfo& info); 198 static void JsUseAlign(const JSCallbackInfo& info); 199 static void JsZIndex(const JSCallbackInfo& info); 200 static void SetDirection(const std::string& dir); 201 static void JsSize(const JSCallbackInfo& info); 202 static void JsConstraintSize(const JSCallbackInfo& info); 203 static void JsLayoutPriority(const JSCallbackInfo& info); 204 static void JsLayoutWeight(const JSCallbackInfo& info); 205 206 static void JsAlign(const JSCallbackInfo& info); 207 static void JsPosition(const JSCallbackInfo& info); 208 static void JsMarkAnchor(const JSCallbackInfo& info); 209 static void JsOffset(const JSCallbackInfo& info); 210 static void JsEnabled(const JSCallbackInfo& info); 211 static void JsAspectRatio(const JSCallbackInfo& info); 212 static void JsOverlay(const JSCallbackInfo& info); 213 static Alignment ParseAlignment(int32_t align); 214 static void JsAlignRules(const JSCallbackInfo& info); 215 216 static void SetVisibility(const JSCallbackInfo& info); 217 static void Pop(); 218 219 static void JsSetDraggable(bool draggable); 220 static void JsOnDragStart(const JSCallbackInfo& info); 221 static bool ParseAndUpdateDragItemInfo(const JSRef<JSVal>& info, NG::DragDropBaseInfo& dragInfo); 222 static RefPtr<AceType> ParseDragNode(const JSRef<JSVal>& info); 223 static void JsOnDragEnter(const JSCallbackInfo& info); 224 static void JsOnDragEnd(const JSCallbackInfo& info); 225 static void JsOnDragMove(const JSCallbackInfo& info); 226 static void JsOnDragLeave(const JSCallbackInfo& info); 227 static void JsOnDrop(const JSCallbackInfo& info); 228 static void JsOnAreaChange(const JSCallbackInfo& info); 229 230 static void JsLinearGradient(const JSCallbackInfo& info); 231 static void JsRadialGradient(const JSCallbackInfo& info); 232 static void JsSweepGradient(const JSCallbackInfo& info); 233 static void NewJsLinearGradient(const JSCallbackInfo& info, NG::Gradient& gradient); 234 static void NewJsRadialGradient(const JSCallbackInfo& info, NG::Gradient& gradient); 235 static void NewJsSweepGradient(const JSCallbackInfo& info, NG::Gradient& gradient); 236 static void JsMotionPath(const JSCallbackInfo& info); 237 static void JsShadow(const JSCallbackInfo& info); 238 static void JsGrayScale(const JSCallbackInfo& info); 239 static void JsBrightness(const JSCallbackInfo& info); 240 static void JsContrast(const JSCallbackInfo& info); 241 static void JsSaturate(const JSCallbackInfo& info); 242 static void JsSepia(const JSCallbackInfo& info); 243 static void JsInvert(const JSCallbackInfo& info); 244 static void JsHueRotate(const JSCallbackInfo& info); 245 246 static void JsClip(const JSCallbackInfo& info); 247 static void JsMask(const JSCallbackInfo& info); 248 249 static void JsKey(const std::string& key); 250 static void JsId(const JSCallbackInfo& info); 251 252 static void JsFocusable(const JSCallbackInfo& info); 253 static void JsOnFocusMove(const JSCallbackInfo& args); 254 static void JsOnKeyEvent(const JSCallbackInfo& args); 255 static void JsOnFocus(const JSCallbackInfo& args); 256 static void JsOnBlur(const JSCallbackInfo& args); 257 static void JsTabIndex(const JSCallbackInfo& info); 258 static void JsFocusOnTouch(const JSCallbackInfo& info); 259 static void JsDefaultFocus(const JSCallbackInfo& info); 260 static void JsGroupDefaultFocus(const JSCallbackInfo& info); 261 #if defined(PREVIEW) 262 static void JsDebugLine(const JSCallbackInfo& info); 263 #endif 264 static void JsOpacityPassThrough(const JSCallbackInfo& info); 265 static void JsTransitionPassThrough(const JSCallbackInfo& info); 266 static void JsKeyboardShortcut(const JSCallbackInfo& info); 267 268 static void JsObscured(const JSCallbackInfo& info); 269 270 static void JsAccessibilityGroup(bool accessible); 271 static void JsAccessibilityText(const std::string& text); 272 static void JsAccessibilityDescription(const std::string& description); 273 static void JsAccessibilityImportance(const std::string& importance); 274 static void JsAccessibilityLevel(const std::string& level); 275 static void JsAllowDrop(const JSCallbackInfo& info); 276 277 static void JSCreateAnimatableProperty(const JSCallbackInfo& info); 278 static void JSUpdateAnimatableProperty(const JSCallbackInfo& info); 279 static void JSRenderGroup(const JSCallbackInfo& info); 280 static void JSRenderFit(const JSCallbackInfo& info); 281 282 static void JsExpandSafeArea(const JSCallbackInfo& info); 283 284 static void ParseMenuOptions( 285 const JSCallbackInfo& info, const JSRef<JSArray>& jsArray, std::vector<NG::MenuOptionsParam>& items); 286 287 #ifndef WEARABLE_PRODUCT 288 static void JsBindPopup(const JSCallbackInfo& info); 289 #endif 290 291 /** 292 * Binds the native methods to the the js object 293 */ 294 static void JSBind(BindingTarget globalObj); 295 GetPipelineContext()296 static RefPtr<PipelineBase> GetPipelineContext() 297 { 298 auto container = Container::Current(); 299 CHECK_NULL_RETURN(container, nullptr); 300 return container->GetPipelineContext(); 301 } 302 303 template<typename T> GetTheme()304 static RefPtr<T> GetTheme() 305 { 306 auto pipelineContext = GetPipelineContext(); 307 CHECK_NULL_RETURN(pipelineContext, nullptr); 308 auto themeManager = pipelineContext->GetThemeManager(); 309 CHECK_NULL_RETURN(themeManager, nullptr); 310 return themeManager->GetTheme<T>(); 311 } 312 313 /** 314 * box properties setter 315 */ 316 static const Border& GetBorder(); 317 static void SetMarginTop(const JSCallbackInfo& info); 318 static void SetMarginBottom(const JSCallbackInfo& info); 319 static void SetMarginLeft(const JSCallbackInfo& info); 320 static void SetMarginRight(const JSCallbackInfo& info); 321 static void SetPaddingTop(const JSCallbackInfo& info); 322 static void SetPaddingBottom(const JSCallbackInfo& info); 323 static void SetPaddingLeft(const JSCallbackInfo& info); 324 static void SetPaddingRight(const JSCallbackInfo& info); 325 static void SetBorder(const Border& border); 326 static void SetBorderStyle(int32_t style); 327 static void SetBorderColor(const Color& color, const AnimationOption& option); 328 static void SetBorderWidth(const CalcDimension& value, const AnimationOption& option); 329 static void SetBlur(float radius); 330 static void SetColorBlend(Color color); 331 static void SetBackdropBlur(float radius); 332 static void SetLinearGradientBlur(NG::LinearGradientBlurPara blurPara); 333 static void SetDynamicLightUp(float rate, float lightUpDegree); 334 static void SetWindowBlur(float progress, WindowBlurStyle blurStyle); 335 static RefPtr<ThemeConstants> GetThemeConstants(const JSRef<JSObject>& jsObj = JSRef<JSObject>()); 336 static bool JsWidth(const JSRef<JSVal>& jsValue); 337 static bool JsHeight(const JSRef<JSVal>& jsValue); 338 static void GetBorderRadius(const char* key, JSRef<JSObject>& object, CalcDimension& radius); 339 340 template<typename T> ParseJsInteger(const JSRef<JSVal> & jsValue,T & result)341 static bool ParseJsInteger(const JSRef<JSVal>& jsValue, T& result) 342 { 343 if (!jsValue->IsNumber() && !jsValue->IsObject()) { 344 LOGE("arg is not number or Object."); 345 return false; 346 } 347 348 if (jsValue->IsNumber()) { 349 LOGD("jsValue->IsNumber()"); 350 result = jsValue->ToNumber<T>(); 351 return true; 352 } 353 354 JSRef<JSObject> jsObj = JSRef<JSObject>::Cast(jsValue); 355 JSRef<JSVal> type = jsObj->GetProperty("type"); 356 if (!type->IsNumber()) { 357 LOGD("type is not number"); 358 return false; 359 } 360 361 JSRef<JSVal> resId = jsObj->GetProperty("id"); 362 if (!resId->IsNumber()) { 363 LOGW("resId is not number"); 364 return false; 365 } 366 367 auto themeConstants = GetThemeConstants(); 368 if (!themeConstants) { 369 LOGW("themeConstants is nullptr"); 370 return false; 371 } 372 373 auto resIdNum = resId->ToNumber<int32_t>(); 374 if (resIdNum == -1) { 375 if (!IsGetResourceByName(jsObj)) { 376 return false; 377 } 378 JSRef<JSVal> args = jsObj->GetProperty("params"); 379 JSRef<JSArray> params = JSRef<JSArray>::Cast(args); 380 auto param = params->GetValueAt(0); 381 if (type->ToNumber<uint32_t>() == static_cast<uint32_t>(ResourceType::INTEGER)) { 382 result = static_cast<T>(themeConstants->GetIntByName(param->ToString())); 383 return true; 384 } 385 return false; 386 } 387 if (type->ToNumber<uint32_t>() == static_cast<uint32_t>(ResourceType::INTEGER)) { 388 result = static_cast<T>(themeConstants->GetInt(resId->ToNumber<uint32_t>())); 389 return true; 390 } 391 return false; 392 } 393 GetFunctionKeyName(FunctionKey functionkey)394 static std::string GetFunctionKeyName(FunctionKey functionkey) 395 { 396 switch (functionkey) { 397 case FunctionKey::ESC: 398 return "ESC"; 399 break; 400 case FunctionKey::F1: 401 return "F1"; 402 break; 403 case FunctionKey::F2: 404 return "F2"; 405 break; 406 case FunctionKey::F3: 407 return "F3"; 408 break; 409 case FunctionKey::F4: 410 return "F4"; 411 break; 412 case FunctionKey::F5: 413 return "F5"; 414 break; 415 case FunctionKey::F6: 416 return "F6"; 417 break; 418 case FunctionKey::F7: 419 return "F7"; 420 break; 421 case FunctionKey::F8: 422 return "F8"; 423 break; 424 case FunctionKey::F9: 425 return "F9"; 426 break; 427 case FunctionKey::F10: 428 return "F10"; 429 break; 430 case FunctionKey::F11: 431 return "F11"; 432 break; 433 case FunctionKey::F12: 434 return "F12"; 435 break; 436 default: 437 return ""; 438 break; 439 } 440 } 441 442 static bool CheckColor(const JSRef<JSVal>& jsValue, Color& result, const char* componentName, const char* propName); 443 static bool CheckLength( 444 const JSRef<JSVal>& jsValue, CalcDimension& result, const char* componentName, const char* propName); 445 }; 446 } // namespace OHOS::Ace::Framework 447 #endif // JS_VIEW_ABSTRACT_H 448