• 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 <array>
19 #include <map>
20 #include "js_runtime_utils.h"
21 #include "native_engine/native_engine.h"
22 #include "native_engine/native_value.h"
23 #include "window.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 #include "window_helper.h"
35 namespace OHOS {
36 namespace Rosen {
37 constexpr int32_t RGB_LENGTH = 6;
38 constexpr int32_t RGBA_LENGTH = 8;
39 
40 #define CHECK_NAPI_RETCODE(errCode, code, call)                                           \
41     do {                                                                                  \
42         napi_status retCode = (call);                                                     \
43         if (retCode != napi_ok) {                                                         \
44             WLOGFE("napi call failed, return %{public}d", static_cast<int32_t>(retCode)); \
45             errCode = code;                                                               \
46         }                                                                                 \
47     } while (0)
48 
49 #define CHECK_NAPI_ENV_RETURN_IF_NULL(env)               \
50     do {                                                 \
51         if ((env) == nullptr) {                          \
52             TLOGE(WmsLogTag::DEFAULT, "env is invalid"); \
53             return nullptr;                              \
54         }                                                \
55     } while (0)
56 
57 #define CHECK_NAPI_CREATE_OBJECT_RETURN_IF_NULL(env, objValue) \
58     do {                                                       \
59         napi_create_object((env), &(objValue));                \
60         if ((objValue) == nullptr) {                           \
61             TLOGE(WmsLogTag::DEFAULT, "Failed to get object"); \
62             return nullptr;                                    \
63         }                                                      \
64     } while (0)
65 
66 enum class ApiWindowType : uint32_t {
67     TYPE_BASE,
68     TYPE_APP = TYPE_BASE,
69     TYPE_SYSTEM_ALERT,
70     TYPE_INPUT_METHOD,
71     TYPE_STATUS_BAR,
72     TYPE_PANEL,
73     TYPE_KEYGUARD,
74     TYPE_VOLUME_OVERLAY,
75     TYPE_NAVIGATION_BAR,
76     TYPE_FLOAT,
77     TYPE_WALLPAPER,
78     TYPE_DESKTOP,
79     TYPE_LAUNCHER_RECENT,
80     TYPE_LAUNCHER_DOCK,
81     TYPE_VOICE_INTERACTION,
82     TYPE_POINTER,
83     TYPE_FLOAT_CAMERA,
84     TYPE_DIALOG,
85     TYPE_SCREENSHOT,
86     TYPE_SYSTEM_TOAST,
87     TYPE_DIVIDER,
88     TYPE_GLOBAL_SEARCH,
89     TYPE_HANDWRITE,
90     TYPE_WALLET_SWIPE_CARD,
91     TYPE_SCREEN_CONTROL,
92     TYPE_FLOAT_NAVIGATION,
93     TYPE_DYNAMIC,
94     TYPE_MUTISCREEN_COLLABORATION,
95     TYPE_FB,
96     TYPE_END
97 };
98 
99 enum class LifeCycleEventType : uint32_t {
100     FOREGROUND = 1,
101     ACTIVE,
102     INACTIVE,
103     BACKGROUND,
104     RESUMED,
105     PAUSED,
106     DESTROYED,
107 };
108 
109 enum class WindowStageLifeCycleEventType : uint32_t {
110     FOREGROUND = 1,
111     RESUMED,
112     PAUSED,
113     BACKGROUND,
114 };
115 
116 const std::map<WindowType, ApiWindowType> NATIVE_JS_TO_WINDOW_TYPE_MAP {
117     { WindowType::WINDOW_TYPE_APP_SUB_WINDOW,           ApiWindowType::TYPE_APP                      },
118     { WindowType::WINDOW_TYPE_DIALOG,                   ApiWindowType::TYPE_DIALOG                   },
119     { WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW,      ApiWindowType::TYPE_SYSTEM_ALERT             },
120     { WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT,       ApiWindowType::TYPE_INPUT_METHOD             },
121     { WindowType::WINDOW_TYPE_STATUS_BAR,               ApiWindowType::TYPE_STATUS_BAR               },
122     { WindowType::WINDOW_TYPE_PANEL,                    ApiWindowType::TYPE_PANEL                    },
123     { WindowType::WINDOW_TYPE_KEYGUARD,                 ApiWindowType::TYPE_KEYGUARD                 },
124     { WindowType::WINDOW_TYPE_VOLUME_OVERLAY,           ApiWindowType::TYPE_VOLUME_OVERLAY           },
125     { WindowType::WINDOW_TYPE_NAVIGATION_BAR,           ApiWindowType::TYPE_NAVIGATION_BAR           },
126     { WindowType::WINDOW_TYPE_FLOAT,                    ApiWindowType::TYPE_FLOAT                    },
127     { WindowType::WINDOW_TYPE_FLOAT_CAMERA,             ApiWindowType::TYPE_FLOAT_CAMERA             },
128     { WindowType::WINDOW_TYPE_WALLPAPER,                ApiWindowType::TYPE_WALLPAPER                },
129     { WindowType::WINDOW_TYPE_DESKTOP,                  ApiWindowType::TYPE_DESKTOP                  },
130     { WindowType::WINDOW_TYPE_LAUNCHER_RECENT,          ApiWindowType::TYPE_LAUNCHER_RECENT          },
131     { WindowType::WINDOW_TYPE_LAUNCHER_DOCK,            ApiWindowType::TYPE_LAUNCHER_DOCK            },
132     { WindowType::WINDOW_TYPE_VOICE_INTERACTION,        ApiWindowType::TYPE_VOICE_INTERACTION        },
133     { WindowType::WINDOW_TYPE_POINTER,                  ApiWindowType::TYPE_POINTER                  },
134     { WindowType::WINDOW_TYPE_SCREENSHOT,               ApiWindowType::TYPE_SCREENSHOT               },
135     { WindowType::WINDOW_TYPE_SYSTEM_TOAST,             ApiWindowType::TYPE_SYSTEM_TOAST             },
136     { WindowType::WINDOW_TYPE_DOCK_SLICE,               ApiWindowType::TYPE_DIVIDER                  },
137     { WindowType::WINDOW_TYPE_GLOBAL_SEARCH,            ApiWindowType::TYPE_GLOBAL_SEARCH            },
138     { WindowType::WINDOW_TYPE_HANDWRITE,                ApiWindowType::TYPE_HANDWRITE                },
139     { WindowType::WINDOW_TYPE_WALLET_SWIPE_CARD,        ApiWindowType::TYPE_WALLET_SWIPE_CARD        },
140     { WindowType::WINDOW_TYPE_SCREEN_CONTROL,           ApiWindowType::TYPE_SCREEN_CONTROL           },
141     { WindowType::WINDOW_TYPE_FLOAT_NAVIGATION,         ApiWindowType::TYPE_FLOAT_NAVIGATION         },
142     { WindowType::WINDOW_TYPE_DYNAMIC,                  ApiWindowType::TYPE_DYNAMIC                  },
143     { WindowType::WINDOW_TYPE_MUTISCREEN_COLLABORATION, ApiWindowType::TYPE_MUTISCREEN_COLLABORATION },
144     { WindowType::WINDOW_TYPE_FB,                       ApiWindowType::TYPE_FB                       },
145 };
146 
147 const std::map<ApiWindowType, WindowType> JS_TO_NATIVE_WINDOW_TYPE_MAP {
148     { ApiWindowType::TYPE_APP,                      WindowType::WINDOW_TYPE_APP_SUB_WINDOW           },
149     { ApiWindowType::TYPE_DIALOG,                   WindowType::WINDOW_TYPE_DIALOG                   },
150     { ApiWindowType::TYPE_SYSTEM_ALERT,             WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW      },
151     { ApiWindowType::TYPE_INPUT_METHOD,             WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT       },
152     { ApiWindowType::TYPE_STATUS_BAR,               WindowType::WINDOW_TYPE_STATUS_BAR               },
153     { ApiWindowType::TYPE_PANEL,                    WindowType::WINDOW_TYPE_PANEL                    },
154     { ApiWindowType::TYPE_KEYGUARD,                 WindowType::WINDOW_TYPE_KEYGUARD                 },
155     { ApiWindowType::TYPE_VOLUME_OVERLAY,           WindowType::WINDOW_TYPE_VOLUME_OVERLAY           },
156     { ApiWindowType::TYPE_NAVIGATION_BAR,           WindowType::WINDOW_TYPE_NAVIGATION_BAR           },
157     { ApiWindowType::TYPE_FLOAT,                    WindowType::WINDOW_TYPE_FLOAT                    },
158     { ApiWindowType::TYPE_FLOAT_CAMERA,             WindowType::WINDOW_TYPE_FLOAT_CAMERA             },
159     { ApiWindowType::TYPE_WALLPAPER,                WindowType::WINDOW_TYPE_WALLPAPER                },
160     { ApiWindowType::TYPE_DESKTOP,                  WindowType::WINDOW_TYPE_DESKTOP                  },
161     { ApiWindowType::TYPE_LAUNCHER_RECENT,          WindowType::WINDOW_TYPE_LAUNCHER_RECENT          },
162     { ApiWindowType::TYPE_LAUNCHER_DOCK,            WindowType::WINDOW_TYPE_LAUNCHER_DOCK            },
163     { ApiWindowType::TYPE_VOICE_INTERACTION,        WindowType::WINDOW_TYPE_VOICE_INTERACTION        },
164     { ApiWindowType::TYPE_POINTER,                  WindowType::WINDOW_TYPE_POINTER                  },
165     { ApiWindowType::TYPE_SCREENSHOT,               WindowType::WINDOW_TYPE_SCREENSHOT               },
166     { ApiWindowType::TYPE_SYSTEM_TOAST,             WindowType::WINDOW_TYPE_SYSTEM_TOAST             },
167     { ApiWindowType::TYPE_DIVIDER,                  WindowType::WINDOW_TYPE_DOCK_SLICE               },
168     { ApiWindowType::TYPE_GLOBAL_SEARCH,            WindowType::WINDOW_TYPE_GLOBAL_SEARCH            },
169     { ApiWindowType::TYPE_HANDWRITE,                WindowType::WINDOW_TYPE_HANDWRITE                },
170     { ApiWindowType::TYPE_WALLET_SWIPE_CARD,        WindowType::WINDOW_TYPE_WALLET_SWIPE_CARD        },
171     { ApiWindowType::TYPE_SCREEN_CONTROL,           WindowType::WINDOW_TYPE_SCREEN_CONTROL           },
172     { ApiWindowType::TYPE_FLOAT_NAVIGATION,         WindowType::WINDOW_TYPE_FLOAT_NAVIGATION         },
173     { ApiWindowType::TYPE_DYNAMIC,                  WindowType::WINDOW_TYPE_DYNAMIC                  },
174     { ApiWindowType::TYPE_MUTISCREEN_COLLABORATION, WindowType::WINDOW_TYPE_MUTISCREEN_COLLABORATION },
175     { ApiWindowType::TYPE_FB,                       WindowType::WINDOW_TYPE_FB                       },
176 };
177 
178 enum class ApiWindowMode : uint32_t {
179     UNDEFINED = 1,
180     FULLSCREEN,
181     PRIMARY,
182     SECONDARY,
183     FLOATING,
184     MODE_END = FLOATING
185 };
186 
187 const std::map<WindowMode, ApiWindowMode> NATIVE_TO_JS_WINDOW_MODE_MAP {
188     { WindowMode::WINDOW_MODE_UNDEFINED,       ApiWindowMode::UNDEFINED  },
189     { WindowMode::WINDOW_MODE_FULLSCREEN,      ApiWindowMode::FULLSCREEN },
190     { WindowMode::WINDOW_MODE_SPLIT_PRIMARY,   ApiWindowMode::PRIMARY    },
191     { WindowMode::WINDOW_MODE_SPLIT_SECONDARY, ApiWindowMode::SECONDARY  },
192     { WindowMode::WINDOW_MODE_FLOATING,        ApiWindowMode::FLOATING   },
193 };
194 
195 const std::map<ApiWindowMode, WindowMode> JS_TO_NATIVE_WINDOW_MODE_MAP {
196     {ApiWindowMode::UNDEFINED,  WindowMode::WINDOW_MODE_UNDEFINED       },
197     {ApiWindowMode::FULLSCREEN, WindowMode::WINDOW_MODE_FULLSCREEN      },
198     {ApiWindowMode::PRIMARY,    WindowMode::WINDOW_MODE_SPLIT_PRIMARY   },
199     {ApiWindowMode::SECONDARY,  WindowMode::WINDOW_MODE_SPLIT_SECONDARY },
200     {ApiWindowMode::FLOATING,   WindowMode::WINDOW_MODE_FLOATING        },
201 };
202 
203 enum class ApiOrientation : uint32_t {
204     BEGIN = 0,
205     UNSPECIFIED = BEGIN,
206     PORTRAIT = 1,
207     LANDSCAPE = 2,
208     PORTRAIT_INVERTED = 3,
209     LANDSCAPE_INVERTED = 4,
210     AUTO_ROTATION = 5,
211     AUTO_ROTATION_PORTRAIT = 6,
212     AUTO_ROTATION_LANDSCAPE = 7,
213     AUTO_ROTATION_RESTRICTED = 8,
214     AUTO_ROTATION_PORTRAIT_RESTRICTED = 9,
215     AUTO_ROTATION_LANDSCAPE_RESTRICTED = 10,
216     LOCKED = 11,
217     AUTO_ROTATION_UNSPECIFIED = 12,
218     USER_ROTATION_PORTRAIT = 13,
219     USER_ROTATION_LANDSCAPE = 14,
220     USER_ROTATION_PORTRAIT_INVERTED = 15,
221     USER_ROTATION_LANDSCAPE_INVERTED = 16,
222     FOLLOW_DESKTOP = 17,
223     END = FOLLOW_DESKTOP,
224 };
225 
226 const std::map<ApiOrientation, Orientation> JS_TO_NATIVE_ORIENTATION_MAP {
227     {ApiOrientation::UNSPECIFIED,                           Orientation::UNSPECIFIED                        },
228     {ApiOrientation::PORTRAIT,                              Orientation::VERTICAL                           },
229     {ApiOrientation::LANDSCAPE,                             Orientation::HORIZONTAL                         },
230     {ApiOrientation::PORTRAIT_INVERTED,                     Orientation::REVERSE_VERTICAL                   },
231     {ApiOrientation::LANDSCAPE_INVERTED,                    Orientation::REVERSE_HORIZONTAL                 },
232     {ApiOrientation::AUTO_ROTATION,                         Orientation::SENSOR                             },
233     {ApiOrientation::AUTO_ROTATION_PORTRAIT,                Orientation::SENSOR_VERTICAL                    },
234     {ApiOrientation::AUTO_ROTATION_LANDSCAPE,               Orientation::SENSOR_HORIZONTAL                  },
235     {ApiOrientation::AUTO_ROTATION_RESTRICTED,              Orientation::AUTO_ROTATION_RESTRICTED           },
236     {ApiOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED,     Orientation::AUTO_ROTATION_PORTRAIT_RESTRICTED  },
237     {ApiOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED,    Orientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED },
238     {ApiOrientation::LOCKED,                                Orientation::LOCKED                             },
239     {ApiOrientation::AUTO_ROTATION_UNSPECIFIED,             Orientation::AUTO_ROTATION_UNSPECIFIED          },
240     {ApiOrientation::USER_ROTATION_PORTRAIT,                Orientation::USER_ROTATION_PORTRAIT             },
241     {ApiOrientation::USER_ROTATION_LANDSCAPE,               Orientation::USER_ROTATION_LANDSCAPE            },
242     {ApiOrientation::USER_ROTATION_PORTRAIT_INVERTED,       Orientation::USER_ROTATION_PORTRAIT_INVERTED    },
243     {ApiOrientation::USER_ROTATION_LANDSCAPE_INVERTED,      Orientation::USER_ROTATION_LANDSCAPE_INVERTED   },
244     {ApiOrientation::FOLLOW_DESKTOP,                        Orientation::FOLLOW_DESKTOP                     },
245 };
246 
247 const std::map<Orientation, ApiOrientation> NATIVE_TO_JS_ORIENTATION_MAP {
248     {Orientation::UNSPECIFIED,                           ApiOrientation::UNSPECIFIED                        },
249     {Orientation::VERTICAL,                              ApiOrientation::PORTRAIT                           },
250     {Orientation::HORIZONTAL,                            ApiOrientation::LANDSCAPE                          },
251     {Orientation::REVERSE_VERTICAL,                      ApiOrientation::PORTRAIT_INVERTED                  },
252     {Orientation::REVERSE_HORIZONTAL,                    ApiOrientation::LANDSCAPE_INVERTED                 },
253     {Orientation::SENSOR,                                ApiOrientation::AUTO_ROTATION                      },
254     {Orientation::SENSOR_VERTICAL,                       ApiOrientation::AUTO_ROTATION_PORTRAIT             },
255     {Orientation::SENSOR_HORIZONTAL,                     ApiOrientation::AUTO_ROTATION_LANDSCAPE            },
256     {Orientation::AUTO_ROTATION_RESTRICTED,              ApiOrientation::AUTO_ROTATION_RESTRICTED           },
257     {Orientation::AUTO_ROTATION_PORTRAIT_RESTRICTED,     ApiOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED  },
258     {Orientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED,    ApiOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED },
259     {Orientation::LOCKED,                                ApiOrientation::LOCKED                             },
260     {Orientation::FOLLOW_RECENT,                         ApiOrientation::UNSPECIFIED                        },
261     {Orientation::AUTO_ROTATION_UNSPECIFIED,             ApiOrientation::AUTO_ROTATION_UNSPECIFIED          },
262     {Orientation::USER_ROTATION_PORTRAIT,                ApiOrientation::USER_ROTATION_PORTRAIT             },
263     {Orientation::USER_ROTATION_LANDSCAPE,               ApiOrientation::USER_ROTATION_LANDSCAPE            },
264     {Orientation::USER_ROTATION_PORTRAIT_INVERTED,       ApiOrientation::USER_ROTATION_PORTRAIT_INVERTED    },
265     {Orientation::USER_ROTATION_LANDSCAPE_INVERTED,      ApiOrientation::USER_ROTATION_LANDSCAPE_INVERTED   },
266     {Orientation::FOLLOW_DESKTOP,                        ApiOrientation::FOLLOW_DESKTOP                     },
267 };
268 
269 enum class RectChangeReason : uint32_t {
270     UNDEFINED = 0,
271     MAXIMIZE,
272     RECOVER,
273     MOVE,
274     DRAG,
275     DRAG_START,
276     DRAG_END,
277 };
278 
279 const std::map<WindowSizeChangeReason, RectChangeReason> JS_SIZE_CHANGE_REASON {
280     { WindowSizeChangeReason::UNDEFINED,                       RectChangeReason::UNDEFINED  },
281     { WindowSizeChangeReason::MAXIMIZE,                        RectChangeReason::MAXIMIZE   },
282     { WindowSizeChangeReason::RECOVER,                         RectChangeReason::RECOVER    },
283     { WindowSizeChangeReason::ROTATION,                        RectChangeReason::UNDEFINED  },
284     { WindowSizeChangeReason::DRAG,                            RectChangeReason::DRAG       },
285     { WindowSizeChangeReason::DRAG_START,                      RectChangeReason::DRAG_START },
286     { WindowSizeChangeReason::DRAG_MOVE,                       RectChangeReason::MOVE       },
287     { WindowSizeChangeReason::DRAG_END,                        RectChangeReason::DRAG_END   },
288     { WindowSizeChangeReason::RESIZE,                          RectChangeReason::UNDEFINED  },
289     { WindowSizeChangeReason::MOVE,                            RectChangeReason::MOVE       },
290     { WindowSizeChangeReason::HIDE,                            RectChangeReason::UNDEFINED  },
291     { WindowSizeChangeReason::TRANSFORM,                       RectChangeReason::UNDEFINED  },
292     { WindowSizeChangeReason::CUSTOM_ANIMATION_SHOW,           RectChangeReason::UNDEFINED  },
293     { WindowSizeChangeReason::FULL_TO_SPLIT,                   RectChangeReason::UNDEFINED  },
294     { WindowSizeChangeReason::SPLIT_TO_FULL,                   RectChangeReason::UNDEFINED  },
295     { WindowSizeChangeReason::FULL_TO_FLOATING,                RectChangeReason::UNDEFINED  },
296     { WindowSizeChangeReason::FLOATING_TO_FULL,                RectChangeReason::UNDEFINED  },
297     { WindowSizeChangeReason::MAXIMIZE_TO_SPLIT,               RectChangeReason::UNDEFINED  },
298     { WindowSizeChangeReason::SPLIT_TO_MAXIMIZE,               RectChangeReason::UNDEFINED  },
299     { WindowSizeChangeReason::PAGE_ROTATION,                   RectChangeReason::UNDEFINED  },
300     { WindowSizeChangeReason::SPLIT_DRAG_START,                RectChangeReason::UNDEFINED  },
301     { WindowSizeChangeReason::SPLIT_DRAG,                      RectChangeReason::UNDEFINED  },
302     { WindowSizeChangeReason::SPLIT_DRAG_END,                  RectChangeReason::UNDEFINED  },
303     { WindowSizeChangeReason::RESIZE_BY_LIMIT,                 RectChangeReason::UNDEFINED  },
304     { WindowSizeChangeReason::MAXIMIZE_IN_IMPLICT,             RectChangeReason::MAXIMIZE   },
305     { WindowSizeChangeReason::RECOVER_IN_IMPLICIT,             RectChangeReason::RECOVER    },
306     { WindowSizeChangeReason::SCREEN_RELATIVE_POSITION_CHANGE, RectChangeReason::UNDEFINED  },
307     { WindowSizeChangeReason::SNAPSHOT_ROTATION,               RectChangeReason::UNDEFINED  },
308     { WindowSizeChangeReason::END,                             RectChangeReason::UNDEFINED  },
309 };
310 
311 enum class ApiModalityType : uint32_t {
312     BEGIN = 0,
313     WINDOW_MODALITY = BEGIN,
314     APPLICATION_MODALITY,
315     END = APPLICATION_MODALITY,
316 };
317 
318 inline const std::map<ApiModalityType, ModalityType> JS_TO_NATIVE_MODALITY_TYPE_MAP {
319     { ApiModalityType::WINDOW_MODALITY,         ModalityType::WINDOW_MODALITY      },
320     { ApiModalityType::APPLICATION_MODALITY,    ModalityType::APPLICATION_MODALITY },
321 };
322 
323 using AsyncCallbackFunc_ = std::function<void(napi_env env, size_t argc, napi_value* argv)>;
324 
325 class AsyncCallback : virtual public RefBase {
326 public:
327     AsyncCallbackFunc_ resolvedCallback_ = nullptr;
328     AsyncCallbackFunc_ rejectedCallback_ = nullptr;
AsyncCallback(AsyncCallbackFunc_ resolvedCallback,AsyncCallbackFunc_ rejectedCallback)329     AsyncCallback(AsyncCallbackFunc_ resolvedCallback, AsyncCallbackFunc_ rejectedCallback)
330         : resolvedCallback_(resolvedCallback), rejectedCallback_(rejectedCallback) {}
331 };
332 
333     /*
334      * Promise
335      */
336     bool CheckPromise(napi_env env, napi_value promiseObj);
337     napi_value ResolvedCallback(napi_env env, napi_callback_info info);
338     napi_value RejectedCallback(napi_env env, napi_callback_info info);
339     bool CallPromise(napi_env env, napi_value promiseObj, AsyncCallback* asyncCallback);
340 
341     napi_value CreateJsWindowLayoutInfoArrayObject(napi_env env, const std::vector<sptr<WindowLayoutInfo>>& infos);
342     napi_value CreateJsWindowLayoutInfoObject(napi_env env, const sptr<WindowLayoutInfo>& info);
343     napi_value CreateJsWindowInfoArrayObject(napi_env env, const std::vector<sptr<WindowVisibilityInfo>>& infos);
344     napi_value CreateJsWindowInfoObject(napi_env env, const sptr<WindowVisibilityInfo>& window);
345     napi_value GetRectAndConvertToJsValue(napi_env env, const Rect& rect);
346     napi_value CreateJsWindowAnimationConfigObject(napi_env env, const KeyboardAnimationCurve& curve);
347     napi_value CreateJsWindowPropertiesObject(napi_env env, const WindowPropertyInfo& windowPropertyInfo);
348     napi_value CreateJsSystemBarPropertiesObject(napi_env env, sptr<Window>& window);
349     napi_value CreateRotationChangeInfoObject(napi_env env, const RotationChangeInfo& rotationChangeInfo);
350     bool GetSystemBarPropertiesFromJs(napi_env env, napi_value jsObject,
351         std::unordered_map<WindowType, SystemBarProperty>& properties,
352         std::unordered_map<WindowType, SystemBarPropertyFlag>& propertyFlags);
353     bool SetWindowStatusBarContentColor(napi_env env, napi_value jsObject,
354         std::unordered_map<WindowType, SystemBarProperty>& properties,
355         std::unordered_map<WindowType, SystemBarPropertyFlag>& propertyFlags);
356     bool SetWindowNavigationBarContentColor(napi_env env, napi_value jsObject,
357         std::unordered_map<WindowType, SystemBarProperty>& properties,
358         std::unordered_map<WindowType, SystemBarPropertyFlag>& propertyFlags);
359     bool GetSystemBarStatus(napi_env env, napi_callback_info info,
360         std::unordered_map<WindowType, SystemBarProperty>& systemBarProperties,
361         std::unordered_map<WindowType, SystemBarPropertyFlag>& systemBarpropertyFlags);
362     napi_value GetStatusBarPropertyObject(napi_env env, sptr<Window>& window);
363     bool ParseColorMetrics(napi_env env, napi_value value, uint32_t& colorValue);
364     bool GetWindowBackgroundColorFromJs(napi_env env, napi_value value, std::string& colorStr);
365     bool ParseAndCheckRect(napi_env env, napi_value jsObject, const Rect& windowRect, Rect& touchableRect);
366     WmErrorCode ParseTouchableAreas(napi_env env, napi_callback_info info, const Rect& windowRect,
367         std::vector<Rect>& touchableAreas);
368     bool GetSpecificBarStatus(napi_env env, napi_callback_info info,
369         bool& systemBarEnable, bool& systemBarEnableAnimation);
370     napi_value CreateJsSystemBarRegionTintArrayObject(napi_env env,
371         const SystemBarRegionTints& tints);
372     napi_value ConvertAvoidAreaToJsValue(napi_env env, const AvoidArea& avoidArea, AvoidAreaType type);
373     bool CheckCallingPermission(std::string permission);
374     bool ParseSystemWindowTypeForApiWindowType(int32_t apiWindowType, WindowType& windowType);
375     napi_value WindowTypeInit(napi_env env);
376     napi_value AvoidAreaTypeInit(napi_env env);
377     napi_value WindowModeInit(napi_env env);
378     napi_value GlobalWindowModeInit(napi_env env);
379     napi_value ScreenshotEventTypeInit(napi_env env);
380     napi_value ColorSpaceInit(napi_env env);
381     napi_value OrientationInit(napi_env env);
382     napi_value WindowStageEventTypeInit(napi_env env);
383     napi_value WindowStageLifecycleEventTypeInit(napi_env env);
384     napi_value WindowAnchorInit(napi_env env);
385     napi_value WindowEventTypeInit(napi_env env);
386     napi_value WindowLayoutModeInit(napi_env env);
387     napi_value BlurStyleInit(napi_env env);
388     napi_value MaximizePresentationInit(napi_env env);
389     napi_value WindowErrorCodeInit(napi_env env);
390     napi_value WindowErrorInit(napi_env env);
391     napi_value WindowStatusTypeInit(napi_env env);
392     napi_value RectChangeReasonInit(napi_env env);
393     napi_value RotationChangeTypeInit(napi_env env);
394     napi_value RectTypeInit(napi_env env);
395     napi_value AnimationTypeInit(napi_env env);
396     napi_value WindowTransitionTypeInit(napi_env env);
397     napi_value WindowAnimationCurveInit(napi_env env);
398     napi_value GetWindowLimitsAndConvertToJsValue(napi_env env, const WindowLimits& windowLimits);
399     napi_value ConvertTitleButtonAreaToJsValue(napi_env env, const TitleButtonRect& titleButtonRect);
400     napi_value ExtensionWindowAttributeInit(napi_env env);
401     napi_value ModalityTypeInit(napi_env env);
402     napi_value CreateJsDecorButtonStyleObj(napi_env env, DecorButtonStyle decorButtonStyle);
403     napi_value ConvertWindowDensityInfoToJsValue(napi_env env, const WindowDensityInfo& windowDensityInfo);
404     bool ConvertDecorButtonStyleFromJs(napi_env env, napi_value jsObject, DecorButtonStyle& decorButtonStyle);
405     bool GetAPI7Ability(napi_env env, AppExecFwk::Ability* &ability);
406     bool GetWindowMaskFromJsValue(napi_env env, napi_value jsObject, std::vector<std::vector<uint32_t>>& windowMask);
407     bool GetMoveConfigurationFromJsValue(napi_env env, napi_value jsObject, MoveConfiguration& moveConfiguration);
408     bool ParseRectAnimationConfig(napi_env env, napi_value jsObject, RectAnimationConfig& rectAnimationConfig);
409     void ConvertJSSystemBarStyleToSystemBarProperties(napi_env env, napi_value jsObject,
410         std::map<WindowType, SystemBarProperty>& properties,
411         std::map<WindowType, SystemBarPropertyFlag>& propertyFlags);
412     std::unique_ptr<AbilityRuntime::NapiAsyncTask> CreateAsyncTask(napi_env env, napi_value lastParam,
413         std::unique_ptr<AbilityRuntime::NapiAsyncTask::ExecuteCallback>&& execute,
414         std::unique_ptr<AbilityRuntime::NapiAsyncTask::CompleteCallback>&& complete, napi_value* result);
415     std::unique_ptr<AbilityRuntime::NapiAsyncTask> CreateEmptyAsyncTask(
416         napi_env env, napi_value lastParam, napi_value* result);
417     bool ParseSubWindowOptions(napi_env env, napi_value jsObject, const sptr<WindowOption>& windowOption);
418     WmErrorCode ParseShowWindowOptions(napi_env env, napi_value showWindowOptions, bool& focusOnShow);
419     bool ParseKeyFramePolicy(napi_env env, napi_value jsObject, KeyFramePolicy& keyFramePolicy);
420     napi_value ConvertKeyFramePolicyToJsValue(napi_env env, const KeyFramePolicy& keyFramePolicy);
421     bool GetRotationResultFromJs(napi_env env, napi_value jsObject, RotationChangeResult& rotationChangeResult);
422     bool ConvertRectFromJsValue(napi_env env, napi_value jsObject, Rect& displayRect);
423     bool CheckZIndex(int32_t zIndex);
424     bool ParseZIndex(napi_env env, napi_value jsObject, WindowOption& option);
425     template<class T>
ParseJsValue(napi_value jsObject,napi_env env,const std::string & name,T & data)426     bool ParseJsValue(napi_value jsObject, napi_env env, const std::string& name, T& data)
427     {
428         napi_value value = nullptr;
429         napi_get_named_property(env, jsObject, name.c_str(), &value);
430         napi_valuetype type = napi_undefined;
431         napi_typeof(env, value, &type);
432         if (type != napi_undefined) {
433             if (!AbilityRuntime::ConvertFromJsValue(env, value, data)) {
434                 return false;
435             }
436         } else {
437             return false;
438         }
439         return true;
440     }
441 
442     template<class T>
ParseJsValueOrGetDefault(napi_value jsObject,napi_env env,const std::string & name,T & data,const T & defaultVal)443     bool ParseJsValueOrGetDefault(napi_value jsObject, napi_env env,
444         const std::string& name, T& data, const T& defaultVal)
445     {
446         napi_value value = nullptr;
447         napi_get_named_property(env, jsObject, name.c_str(), &value);
448         napi_valuetype type = napi_undefined;
449         napi_typeof(env, value, &type);
450         if (type != napi_undefined) {
451             if (!AbilityRuntime::ConvertFromJsValue(env, value, data)) {
452                 return false;
453             }
454         } else {
455             data = defaultVal;
456             return true;
457         }
458         return true;
459     }
460 
461     template<class T>
ConvertNativeValueToVector(napi_env env,napi_value nativeArray,std::vector<T> & out)462     inline bool ConvertNativeValueToVector(napi_env env, napi_value nativeArray, std::vector<T>& out)
463     {
464         if (nativeArray == nullptr) {
465             return false;
466         }
467         T value;
468         uint32_t size = 0;
469         napi_get_array_length(env, nativeArray, &size);
470         for (uint32_t i = 0; i < size; i++) {
471             napi_value getElementValue = nullptr;
472             napi_get_element(env, nativeArray, i, &getElementValue);
473             if (!AbilityRuntime::ConvertFromJsValue(env, getElementValue, value)) {
474                 return false;
475             }
476             out.emplace_back(value);
477         }
478         return true;
479     }
480 
481     /**
482      * @brief Create a JS object representing a window rectangle change event.
483      *
484      * The resulting object has the following structure:
485      * {
486      *   rect: { x, y, width, height },
487      *   reason: <RectChangeReason enum value>
488      * }
489      *
490      * Used to pass rectangle change info from native code to JavaScript.
491      *
492      * @param env The NAPI environment.
493      * @param rect The window rectangle.
494      * @param reason The change reason.
495      * @return The JS object on success, or nullptr on failure.
496      */
497     napi_value BuildJsRectChangeOptions(napi_env env, const Rect& rect, RectChangeReason reason);
498 
499     /**
500      * @brief Create a JS object from a native Position.
501      *
502      * The resulting object has the form:
503      * {
504      *   x: <number>,
505      *   y: <number>
506      * }
507      *
508      * @param env The NAPI environment.
509      * @param position The Position to convert.
510      * @return The JS object on success, or nullptr on failure.
511      */
512     napi_value BuildJsPosition(napi_env env, const Position& position);
513 }
514 }
515 #endif