• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 OHOS_JS_WINDOW_UTILS_H
17 #define OHOS_JS_WINDOW_UTILS_H
18 #include <map>
19 #include "js_runtime_utils.h"
20 #include "native_engine/native_engine.h"
21 #include "native_engine/native_value.h"
22 #include "window.h"
23 #include "window_helper.h"
24 
25 #ifndef WINDOW_PREVIEW
26 #include "window_manager.h"
27 #else
28 #include "mock/window_manager.h"
29 #endif
30 
31 #include "window_option.h"
32 #include "window_visibility_info.h"
33 #include "wm_common.h"
34 namespace OHOS {
35 namespace Rosen {
36 constexpr int32_t RGB_LENGTH = 6;
37 constexpr int32_t RGBA_LENGTH = 8;
38 
39 #define CHECK_NAPI_RETCODE(errCode, code, call)                                           \
40     do {                                                                                  \
41         napi_status retCode = (call);                                                     \
42         if (retCode != napi_ok) {                                                         \
43             WLOGFE("napi call failed, return %{public}d", static_cast<int32_t>(retCode)); \
44             errCode = code;                                                               \
45         }                                                                                 \
46     } while (0)
47 
48 #define CHECK_NAPI_ENV_RETURN_IF_NULL(env)               \
49     do {                                                 \
50         if ((env) == nullptr) {                          \
51             TLOGE(WmsLogTag::DEFAULT, "env is invalid"); \
52             return nullptr;                              \
53         }                                                \
54     } while (0)
55 
56 #define CHECK_NAPI_CREATE_OBJECT_RETURN_IF_NULL(env, objValue) \
57     do {                                                       \
58         napi_create_object((env), &(objValue));                \
59         if ((objValue) == nullptr) {                           \
60             TLOGE(WmsLogTag::DEFAULT, "Failed to get object"); \
61             return nullptr;                                    \
62         }                                                      \
63     } while (0)
64 
65 enum class ApiWindowType : uint32_t {
66     TYPE_BASE,
67     TYPE_APP = TYPE_BASE,
68     TYPE_SYSTEM_ALERT,
69     TYPE_INPUT_METHOD,
70     TYPE_STATUS_BAR,
71     TYPE_PANEL,
72     TYPE_KEYGUARD,
73     TYPE_VOLUME_OVERLAY,
74     TYPE_NAVIGATION_BAR,
75     TYPE_FLOAT,
76     TYPE_WALLPAPER,
77     TYPE_DESKTOP,
78     TYPE_LAUNCHER_RECENT,
79     TYPE_LAUNCHER_DOCK,
80     TYPE_VOICE_INTERACTION,
81     TYPE_POINTER,
82     TYPE_FLOAT_CAMERA,
83     TYPE_DIALOG,
84     TYPE_SCREENSHOT,
85     TYPE_SYSTEM_TOAST,
86     TYPE_DIVIDER,
87     TYPE_GLOBAL_SEARCH,
88     TYPE_HANDWRITE,
89     TYPE_WALLET_SWIPE_CARD,
90     TYPE_SCREEN_CONTROL,
91     TYPE_FLOAT_NAVIGATION,
92     TYPE_END
93 };
94 
95 enum class LifeCycleEventType : uint32_t {
96     FOREGROUND = 1,
97     ACTIVE,
98     INACTIVE,
99     BACKGROUND,
100     RESUMED,
101     PAUSED,
102     DESTROYED,
103 };
104 
105 const std::map<WindowType, ApiWindowType> NATIVE_JS_TO_WINDOW_TYPE_MAP {
106     { WindowType::WINDOW_TYPE_APP_SUB_WINDOW,      ApiWindowType::TYPE_APP               },
107     { WindowType::WINDOW_TYPE_DIALOG,              ApiWindowType::TYPE_DIALOG            },
108     { WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW, ApiWindowType::TYPE_SYSTEM_ALERT      },
109     { WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT,  ApiWindowType::TYPE_INPUT_METHOD      },
110     { WindowType::WINDOW_TYPE_STATUS_BAR,          ApiWindowType::TYPE_STATUS_BAR        },
111     { WindowType::WINDOW_TYPE_PANEL,               ApiWindowType::TYPE_PANEL             },
112     { WindowType::WINDOW_TYPE_KEYGUARD,            ApiWindowType::TYPE_KEYGUARD          },
113     { WindowType::WINDOW_TYPE_VOLUME_OVERLAY,      ApiWindowType::TYPE_VOLUME_OVERLAY    },
114     { WindowType::WINDOW_TYPE_NAVIGATION_BAR,      ApiWindowType::TYPE_NAVIGATION_BAR    },
115     { WindowType::WINDOW_TYPE_FLOAT,               ApiWindowType::TYPE_FLOAT             },
116     { WindowType::WINDOW_TYPE_FLOAT_CAMERA,        ApiWindowType::TYPE_FLOAT_CAMERA      },
117     { WindowType::WINDOW_TYPE_WALLPAPER,           ApiWindowType::TYPE_WALLPAPER         },
118     { WindowType::WINDOW_TYPE_DESKTOP,             ApiWindowType::TYPE_DESKTOP           },
119     { WindowType::WINDOW_TYPE_LAUNCHER_RECENT,     ApiWindowType::TYPE_LAUNCHER_RECENT   },
120     { WindowType::WINDOW_TYPE_LAUNCHER_DOCK,       ApiWindowType::TYPE_LAUNCHER_DOCK     },
121     { WindowType::WINDOW_TYPE_VOICE_INTERACTION,   ApiWindowType::TYPE_VOICE_INTERACTION },
122     { WindowType::WINDOW_TYPE_POINTER,             ApiWindowType::TYPE_POINTER           },
123     { WindowType::WINDOW_TYPE_SCREENSHOT,          ApiWindowType::TYPE_SCREENSHOT        },
124     { WindowType::WINDOW_TYPE_SYSTEM_TOAST,        ApiWindowType::TYPE_SYSTEM_TOAST      },
125     { WindowType::WINDOW_TYPE_DOCK_SLICE,          ApiWindowType::TYPE_DIVIDER           },
126     { WindowType::WINDOW_TYPE_GLOBAL_SEARCH,       ApiWindowType::TYPE_GLOBAL_SEARCH     },
127     { WindowType::WINDOW_TYPE_HANDWRITE,           ApiWindowType::TYPE_HANDWRITE         },
128     { WindowType::WINDOW_TYPE_WALLET_SWIPE_CARD,   ApiWindowType::TYPE_WALLET_SWIPE_CARD },
129     { WindowType::WINDOW_TYPE_SCREEN_CONTROL,      ApiWindowType::TYPE_SCREEN_CONTROL    },
130     { WindowType::WINDOW_TYPE_FLOAT_NAVIGATION,    ApiWindowType::TYPE_FLOAT_NAVIGATION  },
131 };
132 
133 const std::map<ApiWindowType, WindowType> JS_TO_NATIVE_WINDOW_TYPE_MAP {
134     { ApiWindowType::TYPE_APP,                 WindowType::WINDOW_TYPE_APP_SUB_WINDOW      },
135     { ApiWindowType::TYPE_DIALOG,              WindowType::WINDOW_TYPE_DIALOG              },
136     { ApiWindowType::TYPE_SYSTEM_ALERT,        WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW },
137     { ApiWindowType::TYPE_INPUT_METHOD,        WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT  },
138     { ApiWindowType::TYPE_STATUS_BAR,          WindowType::WINDOW_TYPE_STATUS_BAR          },
139     { ApiWindowType::TYPE_PANEL,               WindowType::WINDOW_TYPE_PANEL               },
140     { ApiWindowType::TYPE_KEYGUARD,            WindowType::WINDOW_TYPE_KEYGUARD            },
141     { ApiWindowType::TYPE_VOLUME_OVERLAY,      WindowType::WINDOW_TYPE_VOLUME_OVERLAY      },
142     { ApiWindowType::TYPE_NAVIGATION_BAR,      WindowType::WINDOW_TYPE_NAVIGATION_BAR      },
143     { ApiWindowType::TYPE_FLOAT,               WindowType::WINDOW_TYPE_FLOAT               },
144     { ApiWindowType::TYPE_FLOAT_CAMERA,        WindowType::WINDOW_TYPE_FLOAT_CAMERA        },
145     { ApiWindowType::TYPE_WALLPAPER,           WindowType::WINDOW_TYPE_WALLPAPER           },
146     { ApiWindowType::TYPE_DESKTOP,             WindowType::WINDOW_TYPE_DESKTOP             },
147     { ApiWindowType::TYPE_LAUNCHER_RECENT,     WindowType::WINDOW_TYPE_LAUNCHER_RECENT     },
148     { ApiWindowType::TYPE_LAUNCHER_DOCK,       WindowType::WINDOW_TYPE_LAUNCHER_DOCK       },
149     { ApiWindowType::TYPE_VOICE_INTERACTION,   WindowType::WINDOW_TYPE_VOICE_INTERACTION   },
150     { ApiWindowType::TYPE_POINTER,             WindowType::WINDOW_TYPE_POINTER             },
151     { ApiWindowType::TYPE_SCREENSHOT,          WindowType::WINDOW_TYPE_SCREENSHOT          },
152     { ApiWindowType::TYPE_SYSTEM_TOAST,        WindowType::WINDOW_TYPE_SYSTEM_TOAST        },
153     { ApiWindowType::TYPE_DIVIDER,             WindowType::WINDOW_TYPE_DOCK_SLICE          },
154     { ApiWindowType::TYPE_GLOBAL_SEARCH,       WindowType::WINDOW_TYPE_GLOBAL_SEARCH       },
155     { ApiWindowType::TYPE_HANDWRITE,           WindowType::WINDOW_TYPE_HANDWRITE           },
156     { ApiWindowType::TYPE_WALLET_SWIPE_CARD,   WindowType::WINDOW_TYPE_WALLET_SWIPE_CARD   },
157     { ApiWindowType::TYPE_SCREEN_CONTROL,      WindowType::WINDOW_TYPE_SCREEN_CONTROL      },
158     { ApiWindowType::TYPE_FLOAT_NAVIGATION,    WindowType::WINDOW_TYPE_FLOAT_NAVIGATION    },
159 };
160 
161 enum class ApiWindowMode : uint32_t {
162     UNDEFINED = 1,
163     FULLSCREEN,
164     PRIMARY,
165     SECONDARY,
166     FLOATING,
167     MODE_END = FLOATING
168 };
169 
170 const std::map<WindowMode, ApiWindowMode> NATIVE_TO_JS_WINDOW_MODE_MAP {
171     { WindowMode::WINDOW_MODE_UNDEFINED,       ApiWindowMode::UNDEFINED  },
172     { WindowMode::WINDOW_MODE_FULLSCREEN,      ApiWindowMode::FULLSCREEN },
173     { WindowMode::WINDOW_MODE_SPLIT_PRIMARY,   ApiWindowMode::PRIMARY    },
174     { WindowMode::WINDOW_MODE_SPLIT_SECONDARY, ApiWindowMode::SECONDARY  },
175     { WindowMode::WINDOW_MODE_FLOATING,        ApiWindowMode::FLOATING   },
176 };
177 
178 const std::map<ApiWindowMode, WindowMode> JS_TO_NATIVE_WINDOW_MODE_MAP {
179     {ApiWindowMode::UNDEFINED,  WindowMode::WINDOW_MODE_UNDEFINED       },
180     {ApiWindowMode::FULLSCREEN, WindowMode::WINDOW_MODE_FULLSCREEN      },
181     {ApiWindowMode::PRIMARY,    WindowMode::WINDOW_MODE_SPLIT_PRIMARY   },
182     {ApiWindowMode::SECONDARY,  WindowMode::WINDOW_MODE_SPLIT_SECONDARY },
183     {ApiWindowMode::FLOATING,   WindowMode::WINDOW_MODE_FLOATING        },
184 };
185 
186 enum class ApiOrientation : uint32_t {
187     BEGIN = 0,
188     UNSPECIFIED = BEGIN,
189     PORTRAIT = 1,
190     LANDSCAPE = 2,
191     PORTRAIT_INVERTED = 3,
192     LANDSCAPE_INVERTED = 4,
193     AUTO_ROTATION = 5,
194     AUTO_ROTATION_PORTRAIT = 6,
195     AUTO_ROTATION_LANDSCAPE = 7,
196     AUTO_ROTATION_RESTRICTED = 8,
197     AUTO_ROTATION_PORTRAIT_RESTRICTED = 9,
198     AUTO_ROTATION_LANDSCAPE_RESTRICTED = 10,
199     LOCKED = 11,
200     AUTO_ROTATION_UNSPECIFIED = 12,
201     USER_ROTATION_PORTRAIT = 13,
202     USER_ROTATION_LANDSCAPE = 14,
203     USER_ROTATION_PORTRAIT_INVERTED = 15,
204     USER_ROTATION_LANDSCAPE_INVERTED = 16,
205     FOLLOW_DESKTOP = 17,
206     END = FOLLOW_DESKTOP,
207 };
208 
209 const std::map<ApiOrientation, Orientation> JS_TO_NATIVE_ORIENTATION_MAP {
210     {ApiOrientation::UNSPECIFIED,                           Orientation::UNSPECIFIED                        },
211     {ApiOrientation::PORTRAIT,                              Orientation::VERTICAL                           },
212     {ApiOrientation::LANDSCAPE,                             Orientation::HORIZONTAL                         },
213     {ApiOrientation::PORTRAIT_INVERTED,                     Orientation::REVERSE_VERTICAL                   },
214     {ApiOrientation::LANDSCAPE_INVERTED,                    Orientation::REVERSE_HORIZONTAL                 },
215     {ApiOrientation::AUTO_ROTATION,                         Orientation::SENSOR                             },
216     {ApiOrientation::AUTO_ROTATION_PORTRAIT,                Orientation::SENSOR_VERTICAL                    },
217     {ApiOrientation::AUTO_ROTATION_LANDSCAPE,               Orientation::SENSOR_HORIZONTAL                  },
218     {ApiOrientation::AUTO_ROTATION_RESTRICTED,              Orientation::AUTO_ROTATION_RESTRICTED           },
219     {ApiOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED,     Orientation::AUTO_ROTATION_PORTRAIT_RESTRICTED  },
220     {ApiOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED,    Orientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED },
221     {ApiOrientation::LOCKED,                                Orientation::LOCKED                             },
222     {ApiOrientation::AUTO_ROTATION_UNSPECIFIED,             Orientation::AUTO_ROTATION_UNSPECIFIED          },
223     {ApiOrientation::USER_ROTATION_PORTRAIT,                Orientation::USER_ROTATION_PORTRAIT             },
224     {ApiOrientation::USER_ROTATION_LANDSCAPE,               Orientation::USER_ROTATION_LANDSCAPE            },
225     {ApiOrientation::USER_ROTATION_PORTRAIT_INVERTED,       Orientation::USER_ROTATION_PORTRAIT_INVERTED    },
226     {ApiOrientation::USER_ROTATION_LANDSCAPE_INVERTED,      Orientation::USER_ROTATION_LANDSCAPE_INVERTED   },
227     {ApiOrientation::FOLLOW_DESKTOP,                        Orientation::FOLLOW_DESKTOP                     },
228 };
229 
230 const std::map<Orientation, ApiOrientation> NATIVE_TO_JS_ORIENTATION_MAP {
231     {Orientation::UNSPECIFIED,                           ApiOrientation::UNSPECIFIED                        },
232     {Orientation::VERTICAL,                              ApiOrientation::PORTRAIT                           },
233     {Orientation::HORIZONTAL,                            ApiOrientation::LANDSCAPE                          },
234     {Orientation::REVERSE_VERTICAL,                      ApiOrientation::PORTRAIT_INVERTED                  },
235     {Orientation::REVERSE_HORIZONTAL,                    ApiOrientation::LANDSCAPE_INVERTED                 },
236     {Orientation::SENSOR,                                ApiOrientation::AUTO_ROTATION                      },
237     {Orientation::SENSOR_VERTICAL,                       ApiOrientation::AUTO_ROTATION_PORTRAIT             },
238     {Orientation::SENSOR_HORIZONTAL,                     ApiOrientation::AUTO_ROTATION_LANDSCAPE            },
239     {Orientation::AUTO_ROTATION_RESTRICTED,              ApiOrientation::AUTO_ROTATION_RESTRICTED           },
240     {Orientation::AUTO_ROTATION_PORTRAIT_RESTRICTED,     ApiOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED  },
241     {Orientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED,    ApiOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED },
242     {Orientation::LOCKED,                                ApiOrientation::LOCKED                             },
243     {Orientation::FOLLOW_RECENT,                         ApiOrientation::UNSPECIFIED                        },
244     {Orientation::AUTO_ROTATION_UNSPECIFIED,             ApiOrientation::AUTO_ROTATION_UNSPECIFIED          },
245     {Orientation::USER_ROTATION_PORTRAIT,                ApiOrientation::USER_ROTATION_PORTRAIT             },
246     {Orientation::USER_ROTATION_LANDSCAPE,               ApiOrientation::USER_ROTATION_LANDSCAPE            },
247     {Orientation::USER_ROTATION_PORTRAIT_INVERTED,       ApiOrientation::USER_ROTATION_PORTRAIT_INVERTED    },
248     {Orientation::USER_ROTATION_LANDSCAPE_INVERTED,      ApiOrientation::USER_ROTATION_LANDSCAPE_INVERTED   },
249     {Orientation::FOLLOW_DESKTOP,                        ApiOrientation::FOLLOW_DESKTOP                     },
250 };
251 
252 enum class RectChangeReason : uint32_t {
253     UNDEFINED = 0,
254     MAXIMIZE,
255     RECOVER,
256     MOVE,
257     DRAG,
258     DRAG_START,
259     DRAG_END,
260 };
261 
262 const std::map<WindowSizeChangeReason, RectChangeReason> JS_SIZE_CHANGE_REASON {
263     { WindowSizeChangeReason::UNDEFINED,             RectChangeReason::UNDEFINED  },
264     { WindowSizeChangeReason::MAXIMIZE,              RectChangeReason::MAXIMIZE   },
265     { WindowSizeChangeReason::RECOVER,               RectChangeReason::RECOVER    },
266     { WindowSizeChangeReason::ROTATION,              RectChangeReason::UNDEFINED  },
267     { WindowSizeChangeReason::DRAG,                  RectChangeReason::DRAG       },
268     { WindowSizeChangeReason::DRAG_START,            RectChangeReason::DRAG_START },
269     { WindowSizeChangeReason::DRAG_MOVE,             RectChangeReason::MOVE       },
270     { WindowSizeChangeReason::DRAG_END,              RectChangeReason::DRAG_END   },
271     { WindowSizeChangeReason::RESIZE,                RectChangeReason::UNDEFINED  },
272     { WindowSizeChangeReason::MOVE,                  RectChangeReason::MOVE       },
273     { WindowSizeChangeReason::HIDE,                  RectChangeReason::UNDEFINED  },
274     { WindowSizeChangeReason::TRANSFORM,             RectChangeReason::UNDEFINED  },
275     { WindowSizeChangeReason::CUSTOM_ANIMATION_SHOW, RectChangeReason::UNDEFINED  },
276     { WindowSizeChangeReason::FULL_TO_SPLIT,         RectChangeReason::UNDEFINED  },
277     { WindowSizeChangeReason::SPLIT_TO_FULL,         RectChangeReason::UNDEFINED  },
278     { WindowSizeChangeReason::FULL_TO_FLOATING,      RectChangeReason::UNDEFINED  },
279     { WindowSizeChangeReason::FLOATING_TO_FULL,      RectChangeReason::UNDEFINED  },
280     { WindowSizeChangeReason::END,                   RectChangeReason::UNDEFINED  },
281 };
282 
283 enum class ApiModalityType : uint32_t {
284     BEGIN = 0,
285     WINDOW_MODALITY = BEGIN,
286     APPLICATION_MODALITY,
287     END = APPLICATION_MODALITY,
288 };
289 
290 inline const std::map<ApiModalityType, ModalityType> JS_TO_NATIVE_MODALITY_TYPE_MAP {
291     { ApiModalityType::WINDOW_MODALITY,         ModalityType::WINDOW_MODALITY      },
292     { ApiModalityType::APPLICATION_MODALITY,    ModalityType::APPLICATION_MODALITY },
293 };
294 
295 using AsyncCallbackFunc_ = std::function<void(napi_env env, size_t argc, napi_value* argv)>;
296 
297 class AsyncCallback : virtual public RefBase {
298 public:
299     AsyncCallbackFunc_ resolvedCallback_ = nullptr;
300     AsyncCallbackFunc_ rejectedCallback_ = nullptr;
AsyncCallback(AsyncCallbackFunc_ resolvedCallback,AsyncCallbackFunc_ rejectedCallback)301     AsyncCallback(AsyncCallbackFunc_ resolvedCallback, AsyncCallbackFunc_ rejectedCallback)
302         : resolvedCallback_(resolvedCallback), rejectedCallback_(rejectedCallback) {}
303 };
304 
305     /*
306      * Promise
307      */
308     bool CheckPromise(napi_env env, napi_value promiseObj);
309     napi_value ResolvedCallback(napi_env env, napi_callback_info info);
310     napi_value RejectedCallback(napi_env env, napi_callback_info info);
311     bool CallPromise(napi_env env, napi_value promiseObj, AsyncCallback* asyncCallback);
312 
313     napi_value CreateJsWindowLayoutInfoArrayObject(napi_env env, const std::vector<sptr<WindowLayoutInfo>>& infos);
314     napi_value CreateJsWindowLayoutInfoObject(napi_env env, const sptr<WindowLayoutInfo>& info);
315     napi_value CreateJsWindowInfoArrayObject(napi_env env, const std::vector<sptr<WindowVisibilityInfo>>& infos);
316     napi_value CreateJsWindowInfoObject(napi_env env, const sptr<WindowVisibilityInfo>& window);
317     napi_value GetRectAndConvertToJsValue(napi_env env, const Rect& rect);
318     napi_value CreateJsWindowPropertiesObject(napi_env env, sptr<Window>& window, const Rect& drawableRect);
319     napi_value CreateJsSystemBarPropertiesObject(napi_env env, sptr<Window>& window);
320     bool GetSystemBarPropertiesFromJs(napi_env env, napi_value jsObject,
321         std::map<WindowType, SystemBarProperty>& properties,
322         std::map<WindowType, SystemBarPropertyFlag>& propertyFlags);
323     bool SetWindowStatusBarContentColor(napi_env env, napi_value jsObject,
324         std::map<WindowType, SystemBarProperty>& properties,
325         std::map<WindowType, SystemBarPropertyFlag>& propertyFlags);
326     bool SetWindowNavigationBarContentColor(napi_env env, napi_value jsObject,
327         std::map<WindowType, SystemBarProperty>& properties,
328         std::map<WindowType, SystemBarPropertyFlag>& propertyFlags);
329     bool GetSystemBarStatus(napi_env env, napi_callback_info info,
330         std::map<WindowType, SystemBarProperty>& systemBarProperties,
331         std::map<WindowType, SystemBarPropertyFlag>& systemBarpropertyFlags);
332     bool ParseAndCheckRect(napi_env env, napi_value jsObject, const Rect& windowRect, Rect& touchableRect);
333     WmErrorCode ParseTouchableAreas(napi_env env, napi_callback_info info, const Rect& windowRect,
334         std::vector<Rect>& touchableAreas);
335     bool GetSpecificBarStatus(napi_env env, napi_callback_info info,
336         bool& systemBarEnable, bool& systemBarEnableAnimation);
337     napi_value CreateJsSystemBarRegionTintArrayObject(napi_env env,
338         const SystemBarRegionTints& tints);
339     napi_value ConvertAvoidAreaToJsValue(napi_env env, const AvoidArea& avoidArea, AvoidAreaType type);
340     bool CheckCallingPermission(std::string permission);
341     bool ParseSystemWindowTypeForApiWindowType(int32_t apiWindowType, WindowType& windowType);
342     napi_value WindowTypeInit(napi_env env);
343     napi_value AvoidAreaTypeInit(napi_env env);
344     napi_value WindowModeInit(napi_env env);
345     napi_value ColorSpaceInit(napi_env env);
346     napi_value OrientationInit(napi_env env);
347     napi_value WindowStageEventTypeInit(napi_env env);
348     napi_value WindowEventTypeInit(napi_env env);
349     napi_value WindowLayoutModeInit(napi_env env);
350     napi_value BlurStyleInit(napi_env env);
351     napi_value MaximizePresentationInit(napi_env env);
352     napi_value WindowErrorCodeInit(napi_env env);
353     napi_value WindowErrorInit(napi_env env);
354     napi_value WindowStatusTypeInit(napi_env env);
355     napi_value RectChangeReasonInit(napi_env env);
356     napi_value GetWindowLimitsAndConvertToJsValue(napi_env env, const WindowLimits& windowLimits);
357     napi_value ConvertTitleButtonAreaToJsValue(napi_env env, const TitleButtonRect& titleButtonRect);
358     napi_value ModalityTypeInit(napi_env env);
359     napi_value ConvertWindowDensityInfoToJsValue(napi_env env, const WindowDensityInfo& windowDensityInfo);
360     napi_value ExtensionWindowAttributeInit(napi_env env);
361     bool GetAPI7Ability(napi_env env, AppExecFwk::Ability* &ability);
362     bool GetWindowMaskFromJsValue(napi_env env, napi_value jsObject, std::vector<std::vector<uint32_t>>& windowMask);
363     bool GetMoveConfigurationFromJsValue(napi_env env, napi_value jsObject, MoveConfiguration& moveConfiguration);
364     void ConvertJSSystemBarStyleToSystemBarProperties(napi_env env, napi_value jsObject,
365         std::map<WindowType, SystemBarProperty>& properties,
366         std::map<WindowType, SystemBarPropertyFlag>& propertyFlags);
367     std::unique_ptr<AbilityRuntime::NapiAsyncTask> CreateAsyncTask(napi_env env, napi_value lastParam,
368         std::unique_ptr<AbilityRuntime::NapiAsyncTask::ExecuteCallback>&& execute,
369         std::unique_ptr<AbilityRuntime::NapiAsyncTask::CompleteCallback>&& complete, napi_value* result);
370     std::unique_ptr<AbilityRuntime::NapiAsyncTask> CreateEmptyAsyncTask(
371         napi_env env, napi_value lastParam, napi_value* result);
372     bool ParseSubWindowOptions(napi_env env, napi_value jsObject, const sptr<WindowOption>& windowOption);
373     template<class T>
ParseJsValue(napi_value jsObject,napi_env env,const std::string & name,T & data)374     bool ParseJsValue(napi_value jsObject, napi_env env, const std::string& name, T& data)
375     {
376         napi_value value = nullptr;
377         napi_get_named_property(env, jsObject, name.c_str(), &value);
378         napi_valuetype type = napi_undefined;
379         napi_typeof(env, value, &type);
380         if (type != napi_undefined) {
381             if (!AbilityRuntime::ConvertFromJsValue(env, value, data)) {
382                 return false;
383             }
384         } else {
385             return false;
386         }
387         return true;
388     }
389     template<class T>
ConvertNativeValueToVector(napi_env env,napi_value nativeArray,std::vector<T> & out)390     inline bool ConvertNativeValueToVector(napi_env env, napi_value nativeArray, std::vector<T>& out)
391     {
392         if (nativeArray == nullptr) {
393             return false;
394         }
395         T value;
396         uint32_t size = 0;
397         napi_get_array_length(env, nativeArray, &size);
398         for (uint32_t i = 0; i < size; i++) {
399             napi_value getElementValue = nullptr;
400             napi_get_element(env, nativeArray, i, &getElementValue);
401             if (!AbilityRuntime::ConvertFromJsValue(env, getElementValue, value)) {
402                 return false;
403             }
404             out.emplace_back(value);
405         }
406         return true;
407     }
408 }
409 }
410 #endif