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