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