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