• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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