• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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 #include "js_window.h"
17 #include <new>
18 
19 #ifndef WINDOW_PREVIEW
20 #include "js_transition_controller.h"
21 #else
22 #include "mock/js_transition_controller.h"
23 #endif
24 
25 #include "js_err_utils.h"
26 #include "js_window_animation_utils.h"
27 #include "js_window_utils.h"
28 #include "window.h"
29 #include "window_helper.h"
30 #include "window_manager_hilog.h"
31 #include "window_option.h"
32 #include "wm_math.h"
33 #include "pixel_map.h"
34 #include "pixel_map_napi.h"
35 #include "napi_remote_object.h"
36 #include "permission.h"
37 #include "request_info.h"
38 #include "ui_content.h"
39 
40 namespace OHOS {
41 namespace Rosen {
42 using namespace AbilityRuntime;
43 namespace {
44 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "JsWindow"};
45 constexpr Rect g_emptyRect = {0, 0, 0, 0};
46 constexpr int32_t MIN_DECOR_HEIGHT = 37;
47 constexpr int32_t MAX_DECOR_HEIGHT = 112;
48 constexpr size_t INDEX_ZERO = 0;
49 constexpr size_t INDEX_ONE = 1;
50 constexpr size_t INDEX_TWO = 2;
51 constexpr size_t INDEX_THREE = 3;
52 constexpr size_t ONE_PARAMS_SIZE = 1;
53 constexpr size_t TWO_PARAMS_SIZE = 2;
54 constexpr size_t THREE_PARAMS_SIZE = 3;
55 constexpr size_t FOUR_PARAMS_SIZE = 4;
56 constexpr size_t ARG_COUNT_ZERO = 0;
57 constexpr size_t ARG_COUNT_ONE = 1;
58 constexpr size_t ARG_COUNT_TWO = 2;
59 constexpr double MIN_GRAY_SCALE = 0.0;
60 constexpr double MAX_GRAY_SCALE = 1.0;
61 constexpr uint32_t DEFAULT_WINDOW_MAX_WIDTH = 3840;
62 }
63 
64 static thread_local std::map<std::string, std::shared_ptr<NativeReference>> g_jsWindowMap;
65 static std::mutex g_mutex;
66 static int g_ctorCnt = 0;
67 static int g_dtorCnt = 0;
68 static int g_finalizerCnt = 0;
JsWindow(const sptr<Window> & window)69 JsWindow::JsWindow(const sptr<Window>& window)
70     : windowToken_(window), registerManager_(std::make_unique<JsWindowRegisterManager>())
71 {
72     NotifyNativeWinDestroyFunc func = [this](const std::string& windowName) {
73         {
74             std::lock_guard<std::mutex> lock(g_mutex);
75             if (windowName.empty() || g_jsWindowMap.count(windowName) == 0) {
76                 TLOGE(WmsLogTag::WMS_LIFE, "Can not find window %{public}s ", windowName.c_str());
77                 return;
78             }
79             g_jsWindowMap.erase(windowName);
80             TLOGI(WmsLogTag::WMS_LIFE, "Remove window %{public}s", windowName.c_str());
81         }
82         windowToken_ = nullptr;
83         TLOGI(WmsLogTag::WMS_LIFE, "Destroy window %{public}s in js window", windowName.c_str());
84     };
85     windowToken_->RegisterWindowDestroyedListener(func);
86     windowName_ = windowToken_->GetWindowName();
87     TLOGI(WmsLogTag::WMS_LIFE, "window: %{public}s, ctorCnt: %{public}d", windowName_.c_str(), ++g_ctorCnt);
88 }
89 
~JsWindow()90 JsWindow::~JsWindow()
91 {
92     TLOGI(WmsLogTag::WMS_LIFE, "window: %{public}s, dtorCnt: %{public}d", windowName_.c_str(), ++g_dtorCnt);
93     if (windowToken_ != nullptr) {
94         windowToken_->UnregisterWindowDestroyedListener();
95     }
96     windowToken_ = nullptr;
97 }
98 
GetWindowName() const99 const std::string& JsWindow::GetWindowName() const
100 {
101     return windowName_;
102 }
103 
Finalizer(napi_env env,void * data,void * hint)104 void JsWindow::Finalizer(napi_env env, void* data, void* hint)
105 {
106     WLOGI("g_finalizerCnt:%{public}d", ++g_finalizerCnt);
107     auto jsWin = std::unique_ptr<JsWindow>(static_cast<JsWindow*>(data));
108     if (jsWin == nullptr) {
109         WLOGFE("jsWin is nullptr");
110         return;
111     }
112     std::string windowName = jsWin->GetWindowName();
113     std::lock_guard<std::mutex> lock(g_mutex);
114     g_jsWindowMap.erase(windowName);
115     TLOGI(WmsLogTag::WMS_LIFE, "Remove window %{public}s", windowName.c_str());
116 }
117 
Show(napi_env env,napi_callback_info info)118 napi_value JsWindow::Show(napi_env env, napi_callback_info info)
119 {
120     TLOGD(WmsLogTag::DEFAULT, "Show");
121     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
122     return (me != nullptr) ? me->OnShow(env, info) : nullptr;
123 }
124 
ShowWindow(napi_env env,napi_callback_info info)125 napi_value JsWindow::ShowWindow(napi_env env, napi_callback_info info)
126 {
127     TLOGD(WmsLogTag::DEFAULT, "Show");
128     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
129     return (me != nullptr) ? me->OnShowWindow(env, info) : nullptr;
130 }
131 
ShowWithAnimation(napi_env env,napi_callback_info info)132 napi_value JsWindow::ShowWithAnimation(napi_env env, napi_callback_info info)
133 {
134     TLOGD(WmsLogTag::DEFAULT, "ShowWithAnimation");
135     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
136     return (me != nullptr) ? me->OnShowWithAnimation(env, info) : nullptr;
137 }
138 
Destroy(napi_env env,napi_callback_info info)139 napi_value JsWindow::Destroy(napi_env env, napi_callback_info info)
140 {
141     TLOGD(WmsLogTag::DEFAULT, "Destroy");
142     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
143     return (me != nullptr) ? me->OnDestroy(env, info) : nullptr;
144 }
145 
DestroyWindow(napi_env env,napi_callback_info info)146 napi_value JsWindow::DestroyWindow(napi_env env, napi_callback_info info)
147 {
148     TLOGD(WmsLogTag::DEFAULT, "Destroy");
149     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
150     return (me != nullptr) ? me->OnDestroyWindow(env, info) : nullptr;
151 }
152 
Hide(napi_env env,napi_callback_info info)153 napi_value JsWindow::Hide(napi_env env, napi_callback_info info)
154 {
155     TLOGD(WmsLogTag::DEFAULT, "Hide");
156     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
157     return (me != nullptr) ? me->OnHide(env, info) : nullptr;
158 }
159 
HideWithAnimation(napi_env env,napi_callback_info info)160 napi_value JsWindow::HideWithAnimation(napi_env env, napi_callback_info info)
161 {
162     TLOGD(WmsLogTag::DEFAULT, "HideWithAnimation");
163     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
164     return (me != nullptr) ? me->OnHideWithAnimation(env, info) : nullptr;
165 }
166 
Recover(napi_env env,napi_callback_info info)167 napi_value JsWindow::Recover(napi_env env, napi_callback_info info)
168 {
169     TLOGD(WmsLogTag::WMS_LAYOUT_PC, "[NAPI]");
170     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
171     return (me != nullptr) ? me->OnRecover(env, info) : nullptr;
172 }
173 
Restore(napi_env env,napi_callback_info info)174 napi_value JsWindow::Restore(napi_env env, napi_callback_info info)
175 {
176     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
177     return (me != nullptr) ? me->OnRestore(env, info) : nullptr;
178 }
179 
180 /** @note @window.layout */
MoveTo(napi_env env,napi_callback_info info)181 napi_value JsWindow::MoveTo(napi_env env, napi_callback_info info)
182 {
183     TLOGD(WmsLogTag::DEFAULT, "MoveTo");
184     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
185     return (me != nullptr) ? me->OnMoveTo(env, info) : nullptr;
186 }
187 
188 /** @note @window.layout */
MoveWindowTo(napi_env env,napi_callback_info info)189 napi_value JsWindow::MoveWindowTo(napi_env env, napi_callback_info info)
190 {
191     TLOGD(WmsLogTag::DEFAULT, "MoveTo");
192     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
193     return (me != nullptr) ? me->OnMoveWindowTo(env, info) : nullptr;
194 }
195 
196 /** @note @window.layout */
MoveWindowToAsync(napi_env env,napi_callback_info info)197 napi_value JsWindow::MoveWindowToAsync(napi_env env, napi_callback_info info)
198 {
199     TLOGI(WmsLogTag::WMS_LAYOUT, "MoveToAsync");
200     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
201     return (me != nullptr) ? me->OnMoveWindowToAsync(env, info) : nullptr;
202 }
203 
204 /** @note @window.layout */
MoveWindowToGlobal(napi_env env,napi_callback_info info)205 napi_value JsWindow::MoveWindowToGlobal(napi_env env, napi_callback_info info)
206 {
207     TLOGI(WmsLogTag::WMS_LAYOUT, "MoveWindowToGlobal");
208     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
209     return (me != nullptr) ? me->OnMoveWindowToGlobal(env, info) : nullptr;
210 }
211 
212 /** @note @window.layout */
MoveWindowToGlobalDisplay(napi_env env,napi_callback_info info)213 napi_value JsWindow::MoveWindowToGlobalDisplay(napi_env env, napi_callback_info info)
214 {
215     TLOGD(WmsLogTag::WMS_LAYOUT, "[NAPI]");
216     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
217     return (me != nullptr) ? me->OnMoveWindowToGlobalDisplay(env, info) : nullptr;
218 }
219 
220 /** @note @window.layout */
GetGlobalScaledRect(napi_env env,napi_callback_info info)221 napi_value JsWindow::GetGlobalScaledRect(napi_env env, napi_callback_info info)
222 {
223     TLOGD(WmsLogTag::WMS_LAYOUT, "[NAPI]");
224     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
225     return (me != nullptr) ? me->OnGetGlobalScaledRect(env, info) : nullptr;
226 }
227 
228 /** @note @window.layout */
Resize(napi_env env,napi_callback_info info)229 napi_value JsWindow::Resize(napi_env env, napi_callback_info info)
230 {
231     TLOGD(WmsLogTag::DEFAULT, "Resize");
232     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
233     return (me != nullptr) ? me->OnResize(env, info) : nullptr;
234 }
235 
236 /** @note @window.layout */
ResizeWindow(napi_env env,napi_callback_info info)237 napi_value JsWindow::ResizeWindow(napi_env env, napi_callback_info info)
238 {
239     TLOGD(WmsLogTag::DEFAULT, "Resize");
240     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
241     return (me != nullptr) ? me->OnResizeWindow(env, info) : nullptr;
242 }
243 
244 /** @note @window.layout */
ResizeWindowAsync(napi_env env,napi_callback_info info)245 napi_value JsWindow::ResizeWindowAsync(napi_env env, napi_callback_info info)
246 {
247     TLOGI(WmsLogTag::WMS_LAYOUT, "ResizeAsync");
248     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
249     return (me != nullptr) ? me->OnResizeWindowAsync(env, info) : nullptr;
250 }
251 
ResizeWindowWithAnimation(napi_env env,napi_callback_info info)252 napi_value JsWindow::ResizeWindowWithAnimation(napi_env env, napi_callback_info info)
253 {
254     TLOGD(WmsLogTag::WMS_LAYOUT, "in");
255     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
256     return (me != nullptr) ? me->OnResizeWindowWithAnimation(env, info) : nullptr;
257 }
258 
259 /** @note @window.layout */
ClientToGlobalDisplay(napi_env env,napi_callback_info info)260 napi_value JsWindow::ClientToGlobalDisplay(napi_env env, napi_callback_info info)
261 {
262     TLOGD(WmsLogTag::WMS_LAYOUT, "[NAPI]");
263     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
264     return (me != nullptr) ? me->OnClientToGlobalDisplay(env, info) : nullptr;
265 }
266 
267 /** @note @window.layout */
GlobalDisplayToClient(napi_env env,napi_callback_info info)268 napi_value JsWindow::GlobalDisplayToClient(napi_env env, napi_callback_info info)
269 {
270     TLOGD(WmsLogTag::WMS_LAYOUT, "[NAPI]");
271     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
272     return (me != nullptr) ? me->OnGlobalDisplayToClient(env, info) : nullptr;
273 }
274 
SetWindowType(napi_env env,napi_callback_info info)275 napi_value JsWindow::SetWindowType(napi_env env, napi_callback_info info)
276 {
277     TLOGD(WmsLogTag::DEFAULT, "SetWindowType");
278     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
279     return (me != nullptr) ? me->OnSetWindowType(env, info) : nullptr;
280 }
281 
282 /** @note @window.layout */
SetWindowMode(napi_env env,napi_callback_info info)283 napi_value JsWindow::SetWindowMode(napi_env env, napi_callback_info info)
284 {
285     TLOGD(WmsLogTag::DEFAULT, "SetWindowMode");
286     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
287     return (me != nullptr) ? me->OnSetWindowMode(env, info) : nullptr;
288 }
289 
GetProperties(napi_env env,napi_callback_info info)290 napi_value JsWindow::GetProperties(napi_env env, napi_callback_info info)
291 {
292     TLOGD(WmsLogTag::DEFAULT, "GetProperties");
293     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
294     return (me != nullptr) ? me->OnGetProperties(env, info) : nullptr;
295 }
296 
GetWindowPropertiesSync(napi_env env,napi_callback_info info)297 napi_value JsWindow::GetWindowPropertiesSync(napi_env env, napi_callback_info info)
298 {
299     TLOGD(WmsLogTag::DEFAULT, "GetProperties");
300     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
301     return (me != nullptr) ? me->OnGetWindowPropertiesSync(env, info) : nullptr;
302 }
303 
RegisterWindowCallback(napi_env env,napi_callback_info info)304 napi_value JsWindow::RegisterWindowCallback(napi_env env, napi_callback_info info)
305 {
306     TLOGD(WmsLogTag::WMS_ATTRIBUTE, "Enter");
307     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
308     return (me != nullptr) ? me->OnRegisterWindowCallback(env, info) : nullptr;
309 }
310 
UnregisterWindowCallback(napi_env env,napi_callback_info info)311 napi_value JsWindow::UnregisterWindowCallback(napi_env env, napi_callback_info info)
312 {
313     TLOGD(WmsLogTag::WMS_ATTRIBUTE, "Enter");
314     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
315     return (me != nullptr) ? me->OnUnregisterWindowCallback(env, info) : nullptr;
316 }
317 
BindDialogTarget(napi_env env,napi_callback_info info)318 napi_value JsWindow::BindDialogTarget(napi_env env, napi_callback_info info)
319 {
320     TLOGD(WmsLogTag::DEFAULT, "BindDialogTarget");
321     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
322     return (me != nullptr) ? me->OnBindDialogTarget(env, info) : nullptr;
323 }
324 
SetDialogBackGestureEnabled(napi_env env,napi_callback_info info)325 napi_value JsWindow::SetDialogBackGestureEnabled(napi_env env, napi_callback_info info)
326 {
327     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
328     return (me != nullptr) ? me->OnSetDialogBackGestureEnabled(env, info) : nullptr;
329 }
330 
LoadContent(napi_env env,napi_callback_info info)331 napi_value JsWindow::LoadContent(napi_env env, napi_callback_info info)
332 {
333     TLOGD(WmsLogTag::DEFAULT, "[NAPI]");
334     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
335     return (me != nullptr) ? me->OnLoadContent(env, info, false) : nullptr;
336 }
337 
LoadContentByName(napi_env env,napi_callback_info info)338 napi_value JsWindow::LoadContentByName(napi_env env, napi_callback_info info)
339 {
340     TLOGD(WmsLogTag::DEFAULT, "[NAPI]");
341     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
342     return (me != nullptr) ? me->OnLoadContent(env, info, true) : nullptr;
343 }
344 
GetUIContext(napi_env env,napi_callback_info info)345 napi_value JsWindow::GetUIContext(napi_env env, napi_callback_info info)
346 {
347     TLOGD(WmsLogTag::DEFAULT, "GetUIContext");
348     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
349     return (me != nullptr) ? me->OnGetUIContext(env, info) : nullptr;
350 }
351 
SetUIContent(napi_env env,napi_callback_info info)352 napi_value JsWindow::SetUIContent(napi_env env, napi_callback_info info)
353 {
354     TLOGD(WmsLogTag::DEFAULT, "[NAPI]");
355     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
356     return (me != nullptr) ? me->OnSetUIContent(env, info) : nullptr;
357 }
358 
SetFullScreen(napi_env env,napi_callback_info info)359 napi_value JsWindow::SetFullScreen(napi_env env, napi_callback_info info)
360 {
361     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
362     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
363     return (me != nullptr) ? me->OnSetFullScreen(env, info) : nullptr;
364 }
365 
SetLayoutFullScreen(napi_env env,napi_callback_info info)366 napi_value JsWindow::SetLayoutFullScreen(napi_env env, napi_callback_info info)
367 {
368     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
369     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
370     return (me != nullptr) ? me->OnSetLayoutFullScreen(env, info) : nullptr;
371 }
372 
SetTitleAndDockHoverShown(napi_env env,napi_callback_info info)373 napi_value JsWindow::SetTitleAndDockHoverShown(napi_env env, napi_callback_info info)
374 {
375     TLOGD(WmsLogTag::WMS_LAYOUT_PC, "[NAPI]");
376     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
377     return (me != nullptr) ? me->OnSetTitleAndDockHoverShown(env, info) : nullptr;
378 }
379 
SetWindowLayoutFullScreen(napi_env env,napi_callback_info info)380 napi_value JsWindow::SetWindowLayoutFullScreen(napi_env env, napi_callback_info info)
381 {
382     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
383     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
384     return (me != nullptr) ? me->OnSetWindowLayoutFullScreen(env, info) : nullptr;
385 }
386 
SetSystemBarEnable(napi_env env,napi_callback_info info)387 napi_value JsWindow::SetSystemBarEnable(napi_env env, napi_callback_info info)
388 {
389     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
390     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
391     return (me != nullptr) ? me->OnSetSystemBarEnable(env, info) : nullptr;
392 }
393 
SetWindowSystemBarEnable(napi_env env,napi_callback_info info)394 napi_value JsWindow::SetWindowSystemBarEnable(napi_env env, napi_callback_info info)
395 {
396     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
397     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
398     return (me != nullptr) ? me->OnSetWindowSystemBarEnable(env, info) : nullptr;
399 }
400 
SetSpecificSystemBarEnabled(napi_env env,napi_callback_info info)401 napi_value JsWindow::SetSpecificSystemBarEnabled(napi_env env, napi_callback_info info)
402 {
403     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
404     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
405     return (me != nullptr) ? me->OnSetSpecificSystemBarEnabled(env, info) : nullptr;
406 }
407 
EnableLandscapeMultiWindow(napi_env env,napi_callback_info info)408 napi_value JsWindow::EnableLandscapeMultiWindow(napi_env env, napi_callback_info info)
409 {
410     TLOGD(WmsLogTag::WMS_MULTI_WINDOW, "EnableLandscapeMultiWindow");
411     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
412     return (me != nullptr) ? me->OnEnableLandscapeMultiWindow(env, info) : nullptr;
413 }
414 
DisableLandscapeMultiWindow(napi_env env,napi_callback_info info)415 napi_value JsWindow::DisableLandscapeMultiWindow(napi_env env, napi_callback_info info)
416 {
417     TLOGD(WmsLogTag::WMS_MULTI_WINDOW, "DisableLandscapeMultiWindow");
418     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
419     return (me != nullptr) ? me->OnDisableLandscapeMultiWindow(env, info) : nullptr;
420 }
421 
SetSystemBarProperties(napi_env env,napi_callback_info info)422 napi_value JsWindow::SetSystemBarProperties(napi_env env, napi_callback_info info)
423 {
424     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
425     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
426     return (me != nullptr) ? me->OnSetSystemBarProperties(env, info) : nullptr;
427 }
428 
GetWindowSystemBarPropertiesSync(napi_env env,napi_callback_info info)429 napi_value JsWindow::GetWindowSystemBarPropertiesSync(napi_env env, napi_callback_info info)
430 {
431     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
432     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
433     return (me != nullptr) ? me->OnGetWindowSystemBarPropertiesSync(env, info) : nullptr;
434 }
435 
SetWindowSystemBarProperties(napi_env env,napi_callback_info info)436 napi_value JsWindow::SetWindowSystemBarProperties(napi_env env, napi_callback_info info)
437 {
438     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
439     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
440     return (me != nullptr) ? me->OnSetWindowSystemBarProperties(env, info) : nullptr;
441 }
442 
SetStatusBarColor(napi_env env,napi_callback_info info)443 napi_value JsWindow::SetStatusBarColor(napi_env env, napi_callback_info info)
444 {
445     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
446     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
447     return (me != nullptr) ? me->OnSetStatusBarColor(env, info) : nullptr;
448 }
449 
GetStatusBarProperty(napi_env env,napi_callback_info info)450 napi_value JsWindow::GetStatusBarProperty(napi_env env, napi_callback_info info)
451 {
452     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
453     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
454     return (me != nullptr) ? me->OnGetStatusBarPropertySync(env, info) : nullptr;
455 }
456 
GetAvoidArea(napi_env env,napi_callback_info info)457 napi_value JsWindow::GetAvoidArea(napi_env env, napi_callback_info info)
458 {
459     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
460     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
461     return (me != nullptr) ? me->OnGetAvoidArea(env, info) : nullptr;
462 }
463 
GetWindowAvoidAreaSync(napi_env env,napi_callback_info info)464 napi_value JsWindow::GetWindowAvoidAreaSync(napi_env env, napi_callback_info info)
465 {
466     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
467     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
468     return (me != nullptr) ? me->OnGetWindowAvoidAreaSync(env, info) : nullptr;
469 }
470 
IsShowing(napi_env env,napi_callback_info info)471 napi_value JsWindow::IsShowing(napi_env env, napi_callback_info info)
472 {
473     TLOGD(WmsLogTag::DEFAULT, "IsShowing");
474     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
475     return (me != nullptr) ? me->OnIsShowing(env, info) : nullptr;
476 }
477 
IsWindowShowingSync(napi_env env,napi_callback_info info)478 napi_value JsWindow::IsWindowShowingSync(napi_env env, napi_callback_info info)
479 {
480     TLOGD(WmsLogTag::WMS_LIFE, "IsShowing");
481     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
482     return (me != nullptr) ? me->OnIsWindowShowingSync(env, info) : nullptr;
483 }
484 
IsSupportWideGamut(napi_env env,napi_callback_info info)485 napi_value JsWindow::IsSupportWideGamut(napi_env env, napi_callback_info info)
486 {
487     TLOGD(WmsLogTag::DEFAULT, "IsSupportWideGamut");
488     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
489     return (me != nullptr) ? me->OnIsSupportWideGamut(env, info) : nullptr;
490 }
491 
IsWindowSupportWideGamut(napi_env env,napi_callback_info info)492 napi_value JsWindow::IsWindowSupportWideGamut(napi_env env, napi_callback_info info)
493 {
494     TLOGD(WmsLogTag::DEFAULT, "IsSupportWideGamut");
495     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
496     return (me != nullptr) ? me->OnIsWindowSupportWideGamut(env, info) : nullptr;
497 }
498 
SetBackgroundColor(napi_env env,napi_callback_info info)499 napi_value JsWindow::SetBackgroundColor(napi_env env, napi_callback_info info)
500 {
501     TLOGD(WmsLogTag::DEFAULT, "SetBackgroundColor");
502     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
503     return (me != nullptr) ? me->OnSetBackgroundColor(env, info) : nullptr;
504 }
505 
SetWindowBackgroundColorSync(napi_env env,napi_callback_info info)506 napi_value JsWindow::SetWindowBackgroundColorSync(napi_env env, napi_callback_info info)
507 {
508     TLOGD(WmsLogTag::DEFAULT, "SetBackgroundColor");
509     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
510     return (me != nullptr) ? me->OnSetWindowBackgroundColorSync(env, info) : nullptr;
511 }
512 
SetBrightness(napi_env env,napi_callback_info info)513 napi_value JsWindow::SetBrightness(napi_env env, napi_callback_info info)
514 {
515     TLOGD(WmsLogTag::DEFAULT, "SetBrightness");
516     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
517     return (me != nullptr) ? me->OnSetBrightness(env, info) : nullptr;
518 }
519 
SetWindowBrightness(napi_env env,napi_callback_info info)520 napi_value JsWindow::SetWindowBrightness(napi_env env, napi_callback_info info)
521 {
522     TLOGD(WmsLogTag::DEFAULT, "SetBrightness");
523     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
524     return (me != nullptr) ? me->OnSetWindowBrightness(env, info) : nullptr;
525 }
526 
SetDimBehind(napi_env env,napi_callback_info info)527 napi_value JsWindow::SetDimBehind(napi_env env, napi_callback_info info)
528 {
529     TLOGD(WmsLogTag::DEFAULT, "SetDimBehind");
530     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
531     return (me != nullptr) ? me->OnSetDimBehind(env, info) : nullptr;
532 }
533 
SetFocusable(napi_env env,napi_callback_info info)534 napi_value JsWindow::SetFocusable(napi_env env, napi_callback_info info)
535 {
536     TLOGD(WmsLogTag::WMS_FOCUS, "SetFocusable");
537     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
538     return (me != nullptr) ? me->OnSetFocusable(env, info) : nullptr;
539 }
540 
SetWindowFocusable(napi_env env,napi_callback_info info)541 napi_value JsWindow::SetWindowFocusable(napi_env env, napi_callback_info info)
542 {
543     TLOGD(WmsLogTag::DEFAULT, "SetFocusable");
544     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
545     return (me != nullptr) ? me->OnSetWindowFocusable(env, info) : nullptr;
546 }
547 
548 /** @note @window.hierarchy */
SetTopmost(napi_env env,napi_callback_info info)549 napi_value JsWindow::SetTopmost(napi_env env, napi_callback_info info)
550 {
551     TLOGD(WmsLogTag::WMS_HIERARCHY, "SetTopmost");
552     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
553     return (me != nullptr) ? me->OnSetTopmost(env, info) : nullptr;
554 }
555 
556 /** @note @window.hierarchy */
SetWindowTopmost(napi_env env,napi_callback_info info)557 napi_value JsWindow::SetWindowTopmost(napi_env env, napi_callback_info info)
558 {
559     TLOGD(WmsLogTag::WMS_HIERARCHY, "[NAPI]");
560     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
561     return (me != nullptr) ? me->OnSetWindowTopmost(env, info) : nullptr;
562 }
563 
564 /** @note @window.hierarchy */
SetSubWindowZLevel(napi_env env,napi_callback_info info)565 napi_value JsWindow::SetSubWindowZLevel(napi_env env, napi_callback_info info)
566 {
567     TLOGD(WmsLogTag::WMS_HIERARCHY, "[NAPI]");
568     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
569     return (me != nullptr) ? me->OnSetSubWindowZLevel(env, info) : nullptr;
570 }
571 
572 /** @note @window.hierarchy */
GetSubWindowZLevel(napi_env env,napi_callback_info info)573 napi_value JsWindow::GetSubWindowZLevel(napi_env env, napi_callback_info info)
574 {
575     TLOGD(WmsLogTag::WMS_HIERARCHY, "[NAPI]");
576     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
577     return (me != nullptr) ? me->OnGetSubWindowZLevel(env, info) : nullptr;
578 }
579 
SetWindowDelayRaiseOnDrag(napi_env env,napi_callback_info info)580 napi_value JsWindow::SetWindowDelayRaiseOnDrag(napi_env env, napi_callback_info info)
581 {
582     TLOGD(WmsLogTag::WMS_FOCUS, "[NAPI]");
583     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
584     return (me != nullptr) ? me->OnSetWindowDelayRaiseOnDrag(env, info) : nullptr;
585 }
586 
SetKeepScreenOn(napi_env env,napi_callback_info info)587 napi_value JsWindow::SetKeepScreenOn(napi_env env, napi_callback_info info)
588 {
589     TLOGD(WmsLogTag::DEFAULT, "SetKeepScreenOn");
590     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
591     return (me != nullptr) ? me->OnSetKeepScreenOn(env, info) : nullptr;
592 }
593 
SetWindowKeepScreenOn(napi_env env,napi_callback_info info)594 napi_value JsWindow::SetWindowKeepScreenOn(napi_env env, napi_callback_info info)
595 {
596     TLOGD(WmsLogTag::DEFAULT, "SetKeepScreenOn");
597     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
598     return (me != nullptr) ? me->OnSetWindowKeepScreenOn(env, info) : nullptr;
599 }
600 
SetWakeUpScreen(napi_env env,napi_callback_info info)601 napi_value JsWindow::SetWakeUpScreen(napi_env env, napi_callback_info info)
602 {
603     TLOGD(WmsLogTag::DEFAULT, "SetWakeUpScreen");
604     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
605     return (me != nullptr) ? me->OnSetWakeUpScreen(env, info) : nullptr;
606 }
607 
SetOutsideTouchable(napi_env env,napi_callback_info info)608 napi_value JsWindow::SetOutsideTouchable(napi_env env, napi_callback_info info)
609 {
610     TLOGD(WmsLogTag::DEFAULT, "SetOutsideTouchable");
611     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
612     return (me != nullptr) ? me->OnSetOutsideTouchable(env, info) : nullptr;
613 }
614 
SetPrivacyMode(napi_env env,napi_callback_info info)615 napi_value JsWindow::SetPrivacyMode(napi_env env, napi_callback_info info)
616 {
617     TLOGD(WmsLogTag::DEFAULT, "SetPrivacyMode");
618     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
619     return (me != nullptr) ? me->OnSetPrivacyMode(env, info) : nullptr;
620 }
621 
SetWindowPrivacyMode(napi_env env,napi_callback_info info)622 napi_value JsWindow::SetWindowPrivacyMode(napi_env env, napi_callback_info info)
623 {
624     TLOGD(WmsLogTag::DEFAULT, "SetPrivacyMode");
625     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
626     return (me != nullptr) ? me->OnSetWindowPrivacyMode(env, info) : nullptr;
627 }
628 
SetTouchable(napi_env env,napi_callback_info info)629 napi_value JsWindow::SetTouchable(napi_env env, napi_callback_info info)
630 {
631     TLOGD(WmsLogTag::DEFAULT, "Enter");
632     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
633     return (me != nullptr) ? me->OnSetTouchable(env, info) : nullptr;
634 }
635 
SetTouchableAreas(napi_env env,napi_callback_info info)636 napi_value JsWindow::SetTouchableAreas(napi_env env, napi_callback_info info)
637 {
638     TLOGD(WmsLogTag::WMS_EVENT, "[NAPI]");
639     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
640     return (me != nullptr) ? me->OnSetTouchableAreas(env, info) : nullptr;
641 }
642 
SetResizeByDragEnabled(napi_env env,napi_callback_info info)643 napi_value JsWindow::SetResizeByDragEnabled(napi_env env, napi_callback_info info)
644 {
645     TLOGD(WmsLogTag::DEFAULT, "[NAPI]");
646     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
647     return (me != nullptr) ? me->OnSetResizeByDragEnabled(env, info) : nullptr;
648 }
649 
650 /** @note @window.hierarchy */
SetRaiseByClickEnabled(napi_env env,napi_callback_info info)651 napi_value JsWindow::SetRaiseByClickEnabled(napi_env env, napi_callback_info info)
652 {
653     TLOGD(WmsLogTag::DEFAULT, "SetRaiseByClickEnabled");
654     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
655     return (me != nullptr) ? me->OnSetRaiseByClickEnabled(env, info) : nullptr;
656 }
657 
HideNonSystemFloatingWindows(napi_env env,napi_callback_info info)658 napi_value JsWindow::HideNonSystemFloatingWindows(napi_env env, napi_callback_info info)
659 {
660     TLOGD(WmsLogTag::WMS_ATTRIBUTE, "in");
661     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
662     return (me != nullptr) ? me->OnHideNonSystemFloatingWindows(env, info) : nullptr;
663 }
664 
SetWindowTouchable(napi_env env,napi_callback_info info)665 napi_value JsWindow::SetWindowTouchable(napi_env env, napi_callback_info info)
666 {
667     TLOGD(WmsLogTag::DEFAULT, "Enter");
668     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
669     return (me != nullptr) ? me->OnSetWindowTouchable(env, info) : nullptr;
670 }
671 
SetTransparent(napi_env env,napi_callback_info info)672 napi_value JsWindow::SetTransparent(napi_env env, napi_callback_info info)
673 {
674     TLOGD(WmsLogTag::DEFAULT, "SetTransparent");
675     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
676     return (me != nullptr) ? me->OnSetTransparent(env, info) : nullptr;
677 }
678 
SetCallingWindow(napi_env env,napi_callback_info info)679 napi_value JsWindow::SetCallingWindow(napi_env env, napi_callback_info info)
680 {
681     TLOGD(WmsLogTag::DEFAULT, "SetCallingWindow");
682     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
683     return (me != nullptr) ? me->OnSetCallingWindow(env, info) : nullptr;
684 }
685 
SetPreferredOrientation(napi_env env,napi_callback_info info)686 napi_value JsWindow::SetPreferredOrientation(napi_env env, napi_callback_info info)
687 {
688     TLOGD(WmsLogTag::DEFAULT, "SetPreferredOrientation");
689     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
690     return (me != nullptr) ? me->OnSetPreferredOrientation(env, info) : nullptr;
691 }
692 
GetPreferredOrientation(napi_env env,napi_callback_info info)693 napi_value JsWindow::GetPreferredOrientation(napi_env env, napi_callback_info info)
694 {
695     TLOGD(WmsLogTag::WMS_ROTATION, "GetPreferredOrientation");
696     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
697     return (me != nullptr) ? me->OnGetPreferredOrientation(env, info) : nullptr;
698 }
699 
SetSnapshotSkip(napi_env env,napi_callback_info info)700 napi_value JsWindow::SetSnapshotSkip(napi_env env, napi_callback_info info)
701 {
702     TLOGD(WmsLogTag::DEFAULT, "SetSnapshotSkip");
703     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
704     return (me != nullptr) ? me->OnSetSnapshotSkip(env, info) : nullptr;
705 }
706 
SetSingleFrameComposerEnabled(napi_env env,napi_callback_info info)707 napi_value JsWindow::SetSingleFrameComposerEnabled(napi_env env, napi_callback_info info)
708 {
709     TLOGD(WmsLogTag::DEFAULT, "SetSingleFrameComposerEnabled");
710     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
711     return (me != nullptr) ? me->OnSetSingleFrameComposerEnabled(env, info) : nullptr;
712 }
713 
714 /** @note @window.hierarchy */
RaiseToAppTop(napi_env env,napi_callback_info info)715 napi_value JsWindow::RaiseToAppTop(napi_env env, napi_callback_info info)
716 {
717     TLOGD(WmsLogTag::DEFAULT, "RaiseToAppTop");
718     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
719     return (me != nullptr) ? me->OnRaiseToAppTop(env, info) : nullptr;
720 }
721 
DisableWindowDecor(napi_env env,napi_callback_info info)722 napi_value JsWindow::DisableWindowDecor(napi_env env, napi_callback_info info)
723 {
724     TLOGD(WmsLogTag::WMS_DECOR, "[NAPI]");
725     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
726     return (me != nullptr) ? me->OnDisableWindowDecor(env, info) : nullptr;
727 }
728 
SetColorSpace(napi_env env,napi_callback_info info)729 napi_value JsWindow::SetColorSpace(napi_env env, napi_callback_info info)
730 {
731     TLOGD(WmsLogTag::DEFAULT, "SetColorSpace");
732     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
733     return (me != nullptr) ? me->OnSetColorSpace(env, info) : nullptr;
734 }
735 
SetWindowColorSpace(napi_env env,napi_callback_info info)736 napi_value JsWindow::SetWindowColorSpace(napi_env env, napi_callback_info info)
737 {
738     TLOGD(WmsLogTag::DEFAULT, "SetColorSpace");
739     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
740     return (me != nullptr) ? me->OnSetWindowColorSpace(env, info) : nullptr;
741 }
742 
GetColorSpace(napi_env env,napi_callback_info info)743 napi_value JsWindow::GetColorSpace(napi_env env, napi_callback_info info)
744 {
745     TLOGD(WmsLogTag::DEFAULT, "GetColorSpace");
746     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
747     return (me != nullptr) ? me->OnGetColorSpace(env, info) : nullptr;
748 }
749 
GetWindowColorSpaceSync(napi_env env,napi_callback_info info)750 napi_value JsWindow::GetWindowColorSpaceSync(napi_env env, napi_callback_info info)
751 {
752     TLOGD(WmsLogTag::DEFAULT, "GetColorSpace");
753     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
754     return (me != nullptr) ? me->OnGetWindowColorSpaceSync(env, info) : nullptr;
755 }
756 
Dump(napi_env env,napi_callback_info info)757 napi_value JsWindow::Dump(napi_env env, napi_callback_info info)
758 {
759     TLOGD(WmsLogTag::DEFAULT, "Dump");
760     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
761     return (me != nullptr) ? me->OnDump(env, info) : nullptr;
762 }
763 
SetForbidSplitMove(napi_env env,napi_callback_info info)764 napi_value JsWindow::SetForbidSplitMove(napi_env env, napi_callback_info info)
765 {
766     TLOGD(WmsLogTag::DEFAULT, "SetForbidSplitMove");
767     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
768     return (me != nullptr) ? me->OnSetForbidSplitMove(env, info) : nullptr;
769 }
770 
Opacity(napi_env env,napi_callback_info info)771 napi_value JsWindow::Opacity(napi_env env, napi_callback_info info)
772 {
773     TLOGD(WmsLogTag::DEFAULT, "Opacity");
774     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
775     return (me != nullptr) ? me->OnOpacity(env, info) : nullptr;
776 }
777 
Scale(napi_env env,napi_callback_info info)778 napi_value JsWindow::Scale(napi_env env, napi_callback_info info)
779 {
780     TLOGD(WmsLogTag::DEFAULT, "Scale");
781     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
782     return (me != nullptr) ? me->OnScale(env, info) : nullptr;
783 }
784 
Rotate(napi_env env,napi_callback_info info)785 napi_value JsWindow::Rotate(napi_env env, napi_callback_info info)
786 {
787     TLOGD(WmsLogTag::DEFAULT, "Rotate");
788     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
789     return (me != nullptr) ? me->OnRotate(env, info) : nullptr;
790 }
791 
Translate(napi_env env,napi_callback_info info)792 napi_value JsWindow::Translate(napi_env env, napi_callback_info info)
793 {
794     TLOGD(WmsLogTag::DEFAULT, "Translate");
795     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
796     return (me != nullptr) ? me->OnTranslate(env, info) : nullptr;
797 }
798 
GetTransitionController(napi_env env,napi_callback_info info)799 napi_value JsWindow::GetTransitionController(napi_env env, napi_callback_info info)
800 {
801     TLOGD(WmsLogTag::DEFAULT, "GetTransitionController");
802     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
803     return (me != nullptr) ? me->OnGetTransitionController(env, info) : nullptr;
804 }
805 
SetCornerRadius(napi_env env,napi_callback_info info)806 napi_value JsWindow::SetCornerRadius(napi_env env, napi_callback_info info)
807 {
808     TLOGD(WmsLogTag::DEFAULT, "SetCornerRadius");
809     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
810     return (me != nullptr) ? me->OnSetCornerRadius(env, info) : nullptr;
811 }
812 
SetWindowCornerRadius(napi_env env,napi_callback_info info)813 napi_value JsWindow::SetWindowCornerRadius(napi_env env, napi_callback_info info)
814 {
815     TLOGD(WmsLogTag::WMS_ATTRIBUTE, "[NAPI]");
816     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
817     return (me != nullptr) ? me->OnSetWindowCornerRadius(env, info) : nullptr;
818 }
819 
GetWindowCornerRadius(napi_env env,napi_callback_info info)820 napi_value JsWindow::GetWindowCornerRadius(napi_env env, napi_callback_info info)
821 {
822     TLOGD(WmsLogTag::WMS_ATTRIBUTE, "[NAPI]");
823     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
824     return (me != nullptr) ? me->OnGetWindowCornerRadius(env, info) : nullptr;
825 }
826 
SetShadow(napi_env env,napi_callback_info info)827 napi_value JsWindow::SetShadow(napi_env env, napi_callback_info info)
828 {
829     TLOGD(WmsLogTag::DEFAULT, "SetShadow");
830     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
831     return (me != nullptr) ? me->OnSetShadow(env, info) : nullptr;
832 }
833 
SetWindowShadowRadius(napi_env env,napi_callback_info info)834 napi_value JsWindow::SetWindowShadowRadius(napi_env env, napi_callback_info info)
835 {
836     TLOGD(WmsLogTag::WMS_ATTRIBUTE, "[NAPI]");
837     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
838     return (me != nullptr) ? me->OnSetWindowShadowRadius(env, info) : nullptr;
839 }
840 
SetBlur(napi_env env,napi_callback_info info)841 napi_value JsWindow::SetBlur(napi_env env, napi_callback_info info)
842 {
843     TLOGD(WmsLogTag::DEFAULT, "SetBlur");
844     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
845     return (me != nullptr) ? me->OnSetBlur(env, info) : nullptr;
846 }
847 
SetBackdropBlur(napi_env env,napi_callback_info info)848 napi_value JsWindow::SetBackdropBlur(napi_env env, napi_callback_info info)
849 {
850     TLOGD(WmsLogTag::DEFAULT, "SetBackdropBlur");
851     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
852     return (me != nullptr) ? me->OnSetBackdropBlur(env, info) : nullptr;
853 }
854 
SetBackdropBlurStyle(napi_env env,napi_callback_info info)855 napi_value JsWindow::SetBackdropBlurStyle(napi_env env, napi_callback_info info)
856 {
857     TLOGD(WmsLogTag::DEFAULT, "SetBackdropBlurStyle");
858     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
859     return (me != nullptr) ? me->OnSetBackdropBlurStyle(env, info) : nullptr;
860 }
861 
SetWaterMarkFlag(napi_env env,napi_callback_info info)862 napi_value JsWindow::SetWaterMarkFlag(napi_env env, napi_callback_info info)
863 {
864     TLOGD(WmsLogTag::DEFAULT, "SetWaterMarkFlag");
865     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
866     return (me != nullptr) ? me->OnSetWaterMarkFlag(env, info) : nullptr;
867 }
868 
SetHandwritingFlag(napi_env env,napi_callback_info info)869 napi_value JsWindow::SetHandwritingFlag(napi_env env, napi_callback_info info)
870 {
871     TLOGD(WmsLogTag::DEFAULT, "[NAPI]");
872     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
873     return (me != nullptr) ? me->OnSetHandwritingFlag(env, info) : nullptr;
874 }
875 
SetAspectRatio(napi_env env,napi_callback_info info)876 napi_value JsWindow::SetAspectRatio(napi_env env, napi_callback_info info)
877 {
878     TLOGD(WmsLogTag::DEFAULT, "[NAPI]");
879     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
880     return (me != nullptr) ? me->OnSetAspectRatio(env, info) : nullptr;
881 }
882 
ResetAspectRatio(napi_env env,napi_callback_info info)883 napi_value JsWindow::ResetAspectRatio(napi_env env, napi_callback_info info)
884 {
885     TLOGD(WmsLogTag::DEFAULT, "[NAPI]");
886     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
887     return (me != nullptr) ? me->OnResetAspectRatio(env, info) : nullptr;
888 }
889 
Minimize(napi_env env,napi_callback_info info)890 napi_value JsWindow::Minimize(napi_env env, napi_callback_info info)
891 {
892     TLOGD(WmsLogTag::WMS_LAYOUT, "[NAPI]");
893     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
894     return (me != nullptr) ? me->OnMinimize(env, info) : nullptr;
895 }
896 
Maximize(napi_env env,napi_callback_info info)897 napi_value JsWindow::Maximize(napi_env env, napi_callback_info info)
898 {
899     TLOGD(WmsLogTag::WMS_LAYOUT_PC, "[NAPI]");
900     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
901     return (me != nullptr) ? me->OnMaximize(env, info) : nullptr;
902 }
903 
904 /** @note @window.hierarchy */
RaiseAboveTarget(napi_env env,napi_callback_info info)905 napi_value JsWindow::RaiseAboveTarget(napi_env env, napi_callback_info info)
906 {
907     TLOGD(WmsLogTag::DEFAULT, "[NAPI]");
908     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
909     return (me != nullptr) ? me->OnRaiseAboveTarget(env, info) : nullptr;
910 }
911 
912 /** @note @window.hierarchy */
RaiseMainWindowAboveTarget(napi_env env,napi_callback_info info)913 napi_value JsWindow::RaiseMainWindowAboveTarget(napi_env env, napi_callback_info info)
914 {
915     TLOGD(WmsLogTag::WMS_HIERARCHY, "[NAPI]");
916     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
917     return (me != nullptr) ? me->OnRaiseMainWindowAboveTarget(env, info) : nullptr;
918 }
919 
KeepKeyboardOnFocus(napi_env env,napi_callback_info info)920 napi_value JsWindow::KeepKeyboardOnFocus(napi_env env, napi_callback_info info)
921 {
922     TLOGD(WmsLogTag::DEFAULT, "[NAPI]");
923     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
924     return (me != nullptr) ? me->OnKeepKeyboardOnFocus(env, info) : nullptr;
925 }
926 
EnableDrag(napi_env env,napi_callback_info info)927 napi_value JsWindow::EnableDrag(napi_env env, napi_callback_info info)
928 {
929     TLOGD(WmsLogTag::WMS_LAYOUT, "[NAPI]");
930     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
931     return (me != nullptr) ? me->OnEnableDrag(env, info) : nullptr;
932 }
933 
934 /** @note @window.layout */
GetWindowLimits(napi_env env,napi_callback_info info)935 napi_value JsWindow::GetWindowLimits(napi_env env, napi_callback_info info)
936 {
937     TLOGD(WmsLogTag::DEFAULT, "[NAPI]");
938     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
939     return (me != nullptr) ? me->OnGetWindowLimits(env, info) : nullptr;
940 }
941 
942 /** @note @window.layout */
SetWindowLimits(napi_env env,napi_callback_info info)943 napi_value JsWindow::SetWindowLimits(napi_env env, napi_callback_info info)
944 {
945     TLOGD(WmsLogTag::DEFAULT, "[NAPI]");
946     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
947     return (me != nullptr) ? me->OnSetWindowLimits(env, info) : nullptr;
948 }
949 
SetWindowDecorVisible(napi_env env,napi_callback_info info)950 napi_value JsWindow::SetWindowDecorVisible(napi_env env, napi_callback_info info)
951 {
952     TLOGD(WmsLogTag::WMS_DECOR, "[NAPI]");
953     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
954     return (me != nullptr) ? me->OnSetWindowDecorVisible(env, info) : nullptr;
955 }
956 
GetWindowDecorVisible(napi_env env,napi_callback_info info)957 napi_value JsWindow::GetWindowDecorVisible(napi_env env, napi_callback_info info)
958 {
959     TLOGD(WmsLogTag::WMS_DECOR, "[NAPI]");
960     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
961     return (me != nullptr) ? me->OnGetWindowDecorVisible(env, info) : nullptr;
962 }
963 
SetWindowTitleMoveEnabled(napi_env env,napi_callback_info info)964 napi_value JsWindow::SetWindowTitleMoveEnabled(napi_env env, napi_callback_info info)
965 {
966     TLOGD(WmsLogTag::WMS_DECOR, "[NAPI]");
967     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
968     return (me != nullptr) ? me->OnSetWindowTitleMoveEnabled(env, info) : nullptr;
969 }
970 
SetSubWindowModal(napi_env env,napi_callback_info info)971 napi_value JsWindow::SetSubWindowModal(napi_env env, napi_callback_info info)
972 {
973     TLOGD(WmsLogTag::WMS_SUB, "[NAPI]");
974     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
975     return (me != nullptr) ? me->OnSetSubWindowModal(env, info) : nullptr;
976 }
977 
SetFollowParentMultiScreenPolicy(napi_env env,napi_callback_info info)978 napi_value JsWindow::SetFollowParentMultiScreenPolicy(napi_env env, napi_callback_info info)
979 {
980     TLOGD(WmsLogTag::WMS_MAIN, "[NAPI]");
981     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
982     return (me != nullptr) ? me->OnSetFollowParentMultiScreenPolicy(env, info) : nullptr;
983 }
984 
SetWindowTransitionAnimation(napi_env env,napi_callback_info info)985 napi_value JsWindow::SetWindowTransitionAnimation(napi_env env, napi_callback_info info)
986 {
987     TLOGD(WmsLogTag::WMS_ANIMATION, "[NAPI]");
988     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
989     return (me != nullptr) ? me->OnSetWindowTransitionAnimation(env, info) : nullptr;
990 }
991 
GetWindowTransitionAnimation(napi_env env,napi_callback_info info)992 napi_value JsWindow::GetWindowTransitionAnimation(napi_env env, napi_callback_info info)
993 {
994     TLOGD(WmsLogTag::WMS_ANIMATION, "[NAPI]");
995     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
996     return (me != nullptr) ? me->OnGetWindowTransitionAnimation(env, info) : nullptr;
997 }
998 
SetWindowDecorHeight(napi_env env,napi_callback_info info)999 napi_value JsWindow::SetWindowDecorHeight(napi_env env, napi_callback_info info)
1000 {
1001     TLOGD(WmsLogTag::WMS_DECOR, "[NAPI]");
1002     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1003     return (me != nullptr) ? me->OnSetWindowDecorHeight(env, info) : nullptr;
1004 }
1005 
GetWindowDecorHeight(napi_env env,napi_callback_info info)1006 napi_value JsWindow::GetWindowDecorHeight(napi_env env, napi_callback_info info)
1007 {
1008     TLOGD(WmsLogTag::WMS_DECOR, "[NAPI]");
1009     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1010     return (me != nullptr) ? me->OnGetWindowDecorHeight(env, info) : nullptr;
1011 }
1012 
SetDecorButtonStyle(napi_env env,napi_callback_info info)1013 napi_value JsWindow::SetDecorButtonStyle(napi_env env, napi_callback_info info)
1014 {
1015     TLOGD(WmsLogTag::WMS_DECOR, "[NAPI]");
1016     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1017     return (me != nullptr) ? me->OnSetDecorButtonStyle(env, info) : nullptr;
1018 }
1019 
GetDecorButtonStyle(napi_env env,napi_callback_info info)1020 napi_value JsWindow::GetDecorButtonStyle(napi_env env, napi_callback_info info)
1021 {
1022     TLOGD(WmsLogTag::WMS_DECOR, "[NAPI]");
1023     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1024     return (me != nullptr) ? me->OnGetDecorButtonStyle(env, info) : nullptr;
1025 }
1026 
GetTitleButtonRect(napi_env env,napi_callback_info info)1027 napi_value JsWindow::GetTitleButtonRect(napi_env env, napi_callback_info info)
1028 {
1029     TLOGD(WmsLogTag::WMS_DECOR, "[NAPI]");
1030     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1031     return (me != nullptr) ? me->OnGetTitleButtonRect(env, info) : nullptr;
1032 }
1033 
SetWindowContainerColor(napi_env env,napi_callback_info info)1034 napi_value JsWindow::SetWindowContainerColor(napi_env env, napi_callback_info info)
1035 {
1036     TLOGD(WmsLogTag::WMS_DECOR, "[NAPI]");
1037     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1038     return (me != nullptr) ? me->OnSetWindowContainerColor(env, info) : nullptr;
1039 }
1040 
SetWindowContainerModalColor(napi_env env,napi_callback_info info)1041 napi_value JsWindow::SetWindowContainerModalColor(napi_env env, napi_callback_info info)
1042 {
1043     TLOGD(WmsLogTag::WMS_DECOR, "[NAPI]");
1044     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1045     return (me != nullptr) ? me->OnSetWindowContainerModalColor(env, info) : nullptr;
1046 }
1047 
SetWindowMask(napi_env env,napi_callback_info info)1048 napi_value JsWindow::SetWindowMask(napi_env env, napi_callback_info info)
1049 {
1050     TLOGD(WmsLogTag::WMS_PC, "[NAPI]");
1051     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1052     return (me != nullptr) ? me->OnSetWindowMask(env, info) : nullptr;
1053 }
1054 
SetTitleButtonVisible(napi_env env,napi_callback_info info)1055 napi_value JsWindow::SetTitleButtonVisible(napi_env env, napi_callback_info info)
1056 {
1057     TLOGD(WmsLogTag::WMS_DECOR, "[NAPI]");
1058     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1059     return (me != nullptr) ? me->OnSetTitleButtonVisible(env, info) : nullptr;
1060 }
1061 
SetWindowTitleButtonVisible(napi_env env,napi_callback_info info)1062 napi_value JsWindow::SetWindowTitleButtonVisible(napi_env env, napi_callback_info info)
1063 {
1064     TLOGD(WmsLogTag::WMS_DECOR, "[NAPI]");
1065     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1066     return (me != nullptr) ? me->OnSetWindowTitleButtonVisible(env, info) : nullptr;
1067 }
1068 
SetWindowTitle(napi_env env,napi_callback_info info)1069 napi_value JsWindow::SetWindowTitle(napi_env env, napi_callback_info info)
1070 {
1071     TLOGD(WmsLogTag::WMS_DECOR, "[NAPI]");
1072     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1073     return (me != nullptr) ? me->OnSetWindowTitle(env, info) : nullptr;
1074 }
1075 
SetWindowGrayScale(napi_env env,napi_callback_info info)1076 napi_value JsWindow::SetWindowGrayScale(napi_env env, napi_callback_info info)
1077 {
1078     TLOGD(WmsLogTag::DEFAULT, "[NAPI]");
1079     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1080     return (me != nullptr) ? me->OnSetWindowGrayScale(env, info) : nullptr;
1081 }
1082 
SetImmersiveModeEnabledState(napi_env env,napi_callback_info info)1083 napi_value JsWindow::SetImmersiveModeEnabledState(napi_env env, napi_callback_info info)
1084 {
1085     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
1086     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1087     return (me != nullptr) ? me->OnSetImmersiveModeEnabledState(env, info) : nullptr;
1088 }
1089 
GetImmersiveModeEnabledState(napi_env env,napi_callback_info info)1090 napi_value JsWindow::GetImmersiveModeEnabledState(napi_env env, napi_callback_info info)
1091 {
1092     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
1093     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1094     return (me != nullptr) ? me->OnGetImmersiveModeEnabledState(env, info) : nullptr;
1095 }
1096 
IsImmersiveLayout(napi_env env,napi_callback_info info)1097 napi_value JsWindow::IsImmersiveLayout(napi_env env, napi_callback_info info)
1098 {
1099     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
1100     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1101     return (me != nullptr) ? me->OnIsImmersiveLayout(env, info) : nullptr;
1102 }
1103 
GetWindowStatus(napi_env env,napi_callback_info info)1104 napi_value JsWindow::GetWindowStatus(napi_env env, napi_callback_info info)
1105 {
1106     TLOGD(WmsLogTag::WMS_PC, "[NAPI]");
1107     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1108     return (me != nullptr) ? me->OnGetWindowStatus(env, info) : nullptr;
1109 }
1110 
IsFocused(napi_env env,napi_callback_info info)1111 napi_value JsWindow::IsFocused(napi_env env, napi_callback_info info)
1112 {
1113     TLOGD(WmsLogTag::WMS_FOCUS, "[NAPI]");
1114     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1115     return (me != nullptr) ? me->OnIsFocused(env, info) : nullptr;
1116 }
1117 
RequestFocus(napi_env env,napi_callback_info info)1118 napi_value JsWindow::RequestFocus(napi_env env, napi_callback_info info)
1119 {
1120     TLOGD(WmsLogTag::WMS_FOCUS, "[NAPI]");
1121     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1122     return (me != nullptr) ? me->OnRequestFocus(env, info) : nullptr;
1123 }
1124 
StartMoving(napi_env env,napi_callback_info info)1125 napi_value JsWindow::StartMoving(napi_env env, napi_callback_info info)
1126 {
1127     TLOGD(WmsLogTag::WMS_LAYOUT, "[NAPI]");
1128     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1129     return (me != nullptr) ? me->OnStartMoving(env, info) : nullptr;
1130 }
1131 
StopMoving(napi_env env,napi_callback_info info)1132 napi_value JsWindow::StopMoving(napi_env env, napi_callback_info info)
1133 {
1134     TLOGD(WmsLogTag::WMS_LAYOUT_PC, "[NAPI]");
1135     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1136     return (me != nullptr) ? me->OnStopMoving(env, info) : nullptr;
1137 }
1138 
CreateSubWindowWithOptions(napi_env env,napi_callback_info info)1139 napi_value JsWindow::CreateSubWindowWithOptions(napi_env env, napi_callback_info info)
1140 {
1141     TLOGD(WmsLogTag::WMS_SUB, "[NAPI]");
1142     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1143     return (me != nullptr) ? me->OnCreateSubWindowWithOptions(env, info) : nullptr;
1144 }
1145 
SetParentWindow(napi_env env,napi_callback_info info)1146 napi_value JsWindow::SetParentWindow(napi_env env, napi_callback_info info)
1147 {
1148     TLOGD(WmsLogTag::WMS_SUB, "[NAPI]");
1149     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1150     return (me != nullptr) ? me->OnSetParentWindow(env, info) : nullptr;
1151 }
1152 
GetParentWindow(napi_env env,napi_callback_info info)1153 napi_value JsWindow::GetParentWindow(napi_env env, napi_callback_info info)
1154 {
1155     TLOGD(WmsLogTag::WMS_SUB, "[NAPI]");
1156     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1157     return (me != nullptr) ? me->OnGetParentWindow(env, info) : nullptr;
1158 }
1159 
SetGestureBackEnabled(napi_env env,napi_callback_info info)1160 napi_value JsWindow::SetGestureBackEnabled(napi_env env, napi_callback_info info)
1161 {
1162     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
1163     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1164     return (me != nullptr) ? me->OnSetGestureBackEnabled(env, info) : nullptr;
1165 }
1166 
GetGestureBackEnabled(napi_env env,napi_callback_info info)1167 napi_value JsWindow::GetGestureBackEnabled(napi_env env, napi_callback_info info)
1168 {
1169     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
1170     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1171     return (me != nullptr) ? me->OnGetGestureBackEnabled(env, info) : nullptr;
1172 }
1173 
GetWindowDensityInfo(napi_env env,napi_callback_info info)1174 napi_value JsWindow::GetWindowDensityInfo(napi_env env, napi_callback_info info)
1175 {
1176     TLOGD(WmsLogTag::WMS_ATTRIBUTE, "[NAPI]");
1177     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1178     return (me != nullptr) ? me->OnGetWindowDensityInfo(env, info) : nullptr;
1179 }
1180 
SetDefaultDensityEnabled(napi_env env,napi_callback_info info)1181 napi_value JsWindow::SetDefaultDensityEnabled(napi_env env, napi_callback_info info)
1182 {
1183     TLOGD(WmsLogTag::WMS_ATTRIBUTE, "[NAPI]");
1184     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1185     return (me != nullptr) ? me->OnSetDefaultDensityEnabled(env, info) : nullptr;
1186 }
1187 
IsMainWindowFullScreenAcrossDisplays(napi_env env,napi_callback_info info)1188 napi_value JsWindow::IsMainWindowFullScreenAcrossDisplays(napi_env env, napi_callback_info info)
1189 {
1190     TLOGD(WmsLogTag::WMS_ATTRIBUTE, "[NAPI]");
1191     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1192     return (me != nullptr) ? me->OnIsMainWindowFullScreenAcrossDisplays(env, info) : nullptr;
1193 }
1194 
SetSystemAvoidAreaEnabled(napi_env env,napi_callback_info info)1195 napi_value JsWindow::SetSystemAvoidAreaEnabled(napi_env env, napi_callback_info info)
1196 {
1197     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
1198     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1199     return (me != nullptr) ? me->OnSetSystemAvoidAreaEnabled(env, info) : nullptr;
1200 }
1201 
IsSystemAvoidAreaEnabled(napi_env env,napi_callback_info info)1202 napi_value JsWindow::IsSystemAvoidAreaEnabled(napi_env env, napi_callback_info info)
1203 {
1204     TLOGD(WmsLogTag::WMS_IMMS, "[NAPI]");
1205     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1206     return (me != nullptr) ? me->OnIsSystemAvoidAreaEnabled(env, info) : nullptr;
1207 }
1208 
SetExclusivelyHighlighted(napi_env env,napi_callback_info info)1209 napi_value JsWindow::SetExclusivelyHighlighted(napi_env env, napi_callback_info info)
1210 {
1211     TLOGD(WmsLogTag::WMS_FOCUS, "[NAPI]");
1212     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1213     return (me != nullptr) ? me->OnSetExclusivelyHighlighted(env, info) : nullptr;
1214 }
1215 
IsWindowHighlighted(napi_env env,napi_callback_info info)1216 napi_value JsWindow::IsWindowHighlighted(napi_env env, napi_callback_info info)
1217 {
1218     TLOGD(WmsLogTag::WMS_FOCUS, "[NAPI]");
1219     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1220     return (me != nullptr) ? me->OnIsWindowHighlighted(env, info) : nullptr;
1221 }
1222 
SetDragKeyFramePolicy(napi_env env,napi_callback_info info)1223 napi_value JsWindow::SetDragKeyFramePolicy(napi_env env, napi_callback_info info)
1224 {
1225     TLOGD(WmsLogTag::WMS_LAYOUT_PC, "[NAPI]");
1226     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1227     return (me != nullptr) ? me->OnSetDragKeyFramePolicy(env, info) : nullptr;
1228 }
1229 
SetRelativePositionToParentWindowEnabled(napi_env env,napi_callback_info info)1230 napi_value JsWindow::SetRelativePositionToParentWindowEnabled(napi_env env, napi_callback_info info)
1231 {
1232     TLOGD(WmsLogTag::WMS_SUB, "[NAPI]");
1233     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1234     return (me != nullptr) ? me->OnSetRelativePositionToParentWindowEnabled(env, info) : nullptr;
1235 }
1236 
SetFollowParentWindowLayoutEnabled(napi_env env,napi_callback_info info)1237 napi_value JsWindow::SetFollowParentWindowLayoutEnabled(napi_env env, napi_callback_info info)
1238 {
1239     TLOGD(WmsLogTag::WMS_SUB, "[NAPI]");
1240     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1241     return (me != nullptr) ? me->OnSetFollowParentWindowLayoutEnabled(env, info) : nullptr;
1242 }
1243 
SetWindowShadowEnabled(napi_env env,napi_callback_info info)1244 napi_value JsWindow::SetWindowShadowEnabled(napi_env env, napi_callback_info info)
1245 {
1246     TLOGD(WmsLogTag::WMS_ATTRIBUTE, "[NAPI]");
1247     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
1248     return (me != nullptr) ? me->OnSetWindowShadowEnabled(env, info) : nullptr;
1249 }
1250 
UpdateStatusBarProperty(const sptr<Window> & window,const uint32_t contentColor)1251 WMError UpdateStatusBarProperty(const sptr<Window>& window, const uint32_t contentColor)
1252 {
1253     if (window == nullptr) {
1254         TLOGNE(WmsLogTag::WMS_IMMS, "window is nullptr");
1255         return WMError::WM_ERROR_INVALID_WINDOW;
1256     }
1257     auto property = window->GetSystemBarPropertyByType(WindowType::WINDOW_TYPE_STATUS_BAR);
1258     property.contentColor_ = contentColor;
1259     property.settingFlag_ = static_cast<SystemBarSettingFlag>(static_cast<uint32_t>(property.settingFlag_) |
1260         static_cast<uint32_t>(SystemBarSettingFlag::COLOR_SETTING));
1261     return window->SetSystemBarProperty(WindowType::WINDOW_TYPE_STATUS_BAR, property);
1262 }
1263 
NapiGetUndefined(napi_env env)1264 napi_value NapiGetUndefined(napi_env env)
1265 {
1266     napi_value result = nullptr;
1267     napi_get_undefined(env, &result);
1268     return result;
1269 }
1270 
NapiThrowError(napi_env env,WmErrorCode errCode)1271 napi_value NapiThrowError(napi_env env, WmErrorCode errCode)
1272 {
1273     napi_throw(env, JsErrUtils::CreateJsError(env, errCode));
1274     return NapiGetUndefined(env);
1275 }
1276 
NapiThrowError(napi_env env,WmErrorCode errCode,const std::string & msg)1277 napi_value NapiThrowError(napi_env env, WmErrorCode errCode, const std::string& msg)
1278 {
1279     napi_throw(env, JsErrUtils::CreateJsError(env, errCode, msg));
1280     return NapiGetUndefined(env);
1281 }
1282 
GetType(napi_env env,napi_value value)1283 napi_valuetype GetType(napi_env env, napi_value value)
1284 {
1285     napi_valuetype res = napi_undefined;
1286     napi_typeof(env, value, &res);
1287     return res;
1288 }
1289 
OnShow(napi_env env,napi_callback_info info)1290 napi_value JsWindow::OnShow(napi_env env, napi_callback_info info)
1291 {
1292     WMError errCode = WMError::WM_OK;
1293     size_t argc = 4;
1294     napi_value argv[4] = {nullptr};
1295     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1296     if (argc > 1) {
1297         TLOGE(WmsLogTag::WMS_LIFE, "Argc is invalid: %{public}zu", argc);
1298         errCode = WMError::WM_ERROR_INVALID_PARAM;
1299     }
1300     wptr<Window> weakToken(windowToken_);
1301     napi_value result = nullptr;
1302     napi_value lastParam = (argc == 0) ? nullptr : (GetType(env, argv[0]) == napi_function ? argv[0] : nullptr);
1303     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1304     auto asyncTask = [weakToken, errCode, env, task = napiAsyncTask] {
1305         auto weakWindow = weakToken.promote();
1306         if (weakWindow == nullptr) {
1307             TLOGNE(WmsLogTag::WMS_LIFE, "window is nullptr");
1308             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
1309             return;
1310         }
1311         if (errCode != WMError::WM_OK) {
1312             task->Reject(env, JsErrUtils::CreateJsError(env, errCode));
1313             TLOGNE(WmsLogTag::WMS_LIFE, "window is nullptr or get invalid param");
1314             return;
1315         }
1316         if (WindowHelper::IsMainWindowAndNotShown(weakWindow->GetType(), weakWindow->GetWindowState())) {
1317             TLOGNW(WmsLogTag::WMS_LIFE,
1318                 "window Type %{public}u and window state %{public}u is not supported, [%{public}u, %{public}s]",
1319                 static_cast<uint32_t>(weakWindow->GetType()), static_cast<uint32_t>(weakWindow->GetWindowState()),
1320                 weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str());
1321             task->Resolve(env, NapiGetUndefined(env));
1322             return;
1323         }
1324         WMError ret = weakWindow->Show(0, false, true);
1325         if (ret == WMError::WM_OK) {
1326             task->Resolve(env, NapiGetUndefined(env));
1327         } else {
1328             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window show failed"));
1329         }
1330         TLOGNI(WmsLogTag::WMS_LIFE, "Window [%{public}u] show end, ret=%{public}d", weakWindow->GetWindowId(), ret);
1331     };
1332     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnShow") != napi_status::napi_ok) {
1333         TLOGE(WmsLogTag::WMS_LIFE, "napi send event failed, window state is abnormal");
1334     }
1335     return result;
1336 }
1337 
OnShowWindow(napi_env env,napi_callback_info info)1338 napi_value JsWindow::OnShowWindow(napi_env env, napi_callback_info info)
1339 {
1340     wptr<Window> weakToken(windowToken_);
1341     napi_value result = nullptr;
1342     size_t argc = 4;
1343     napi_value argv[4] = {nullptr};
1344     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1345     napi_value lastParam = (argc == 0) ? nullptr :
1346         ((argv[0] != nullptr && GetType(env, argv[0]) == napi_function) ? argv[0] : nullptr);
1347     napi_value showWindowOptions = (argc == 0) ? nullptr :
1348         ((argv[0] != nullptr && GetType(env, argv[0]) == napi_object) ? argv[0] : nullptr);
1349     bool focusOnShow = true;
1350     bool isShowWithOptions = false;
1351     if (showWindowOptions != nullptr) {
1352         isShowWithOptions = true;
1353         WmErrorCode parseRet = ParseShowWindowOptions(env, showWindowOptions, focusOnShow);
1354         if (parseRet != WmErrorCode::WM_OK) {
1355             return NapiThrowError(env, parseRet);
1356         }
1357     }
1358     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1359     auto asyncTask = [weakToken, env, task = napiAsyncTask, focusOnShow, isShowWithOptions] {
1360         auto weakWindow = weakToken.promote();
1361         if (weakWindow == nullptr) {
1362             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
1363             TLOGNE(WmsLogTag::WMS_LIFE, "window is nullptr or get invalid param");
1364             return;
1365         }
1366         if (WindowHelper::IsMainWindowAndNotShown(weakWindow->GetType(), weakWindow->GetWindowState())) {
1367             TLOGNW(WmsLogTag::WMS_LIFE,
1368                 "window Type %{public}u and window state %{public}u is not supported, [%{public}u, %{public}s]",
1369                 static_cast<uint32_t>(weakWindow->GetType()), static_cast<uint32_t>(weakWindow->GetWindowState()),
1370                 weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str());
1371             task->Resolve(env, NapiGetUndefined(env));
1372             return;
1373         }
1374         if (focusOnShow == false &&
1375             (WindowHelper::IsModalSubWindow(weakWindow->GetType(), weakWindow->GetWindowFlags()) ||
1376              WindowHelper::IsDialogWindow(weakWindow->GetType()))) {
1377             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_CALLING));
1378             TLOGNE(WmsLogTag::WMS_FOCUS, "only normal sub window supports setting focusOnShow");
1379             return;
1380         }
1381         weakWindow->SetShowWithOptions(isShowWithOptions);
1382         WMError ret = weakWindow->Show(0, false, focusOnShow, true);
1383         TLOGNI(WmsLogTag::WMS_LIFE, "Window [%{public}u, %{public}s] show with ret=%{public}d",
1384             weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), ret);
1385         if (ret == WMError::WM_OK) {
1386             task->Resolve(env, NapiGetUndefined(env));
1387         } else {
1388             task->Reject(env, JsErrUtils::CreateJsError(env, WM_JS_TO_ERROR_CODE_MAP.at(ret),
1389                 "Window show failed"));
1390         }
1391         TLOGNI(WmsLogTag::WMS_LIFE, "Window [%{public}u, %{public}s] show end, ret=%{public}d",
1392             weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), ret);
1393     };
1394     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnShowWindow") != napi_status::napi_ok) {
1395         TLOGE(WmsLogTag::WMS_LIFE, "napi send event failed, window state is abnormal");
1396     }
1397     return result;
1398 }
1399 
OnShowWithAnimation(napi_env env,napi_callback_info info)1400 napi_value JsWindow::OnShowWithAnimation(napi_env env, napi_callback_info info)
1401 {
1402     WmErrorCode errCode = Permission::IsSystemCallingOrStartByHdcd(true) ?
1403         WmErrorCode::WM_OK : WmErrorCode::WM_ERROR_NOT_SYSTEM_APP;
1404     if (errCode == WmErrorCode::WM_OK) {
1405         if (windowToken_ == nullptr) {
1406             errCode = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
1407         } else {
1408             auto winType = windowToken_->GetType();
1409             if (!WindowHelper::IsSystemWindow(winType)) {
1410                 TLOGE(WmsLogTag::WMS_LIFE,
1411                     "Window Type %{public}u is not supported", static_cast<uint32_t>(winType));
1412                 errCode = WmErrorCode::WM_ERROR_INVALID_CALLING;
1413             }
1414         }
1415     }
1416     wptr<Window> weakToken(windowToken_);
1417     const char* const where = __func__;
1418     napi_value result = nullptr;
1419     size_t argc = 4;
1420     napi_value argv[4] = {nullptr};
1421     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1422     napi_value lastParam = (argc == 0) ? nullptr :
1423         ((argv[0] != nullptr && GetType(env, argv[0]) == napi_function) ? argv[0] : nullptr);
1424     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1425     auto asyncTask = [weakToken, errCode, where, env, task = napiAsyncTask] {
1426         if (errCode != WmErrorCode::WM_OK) {
1427             task->Reject(env, JsErrUtils::CreateJsError(env, errCode));
1428             return;
1429         }
1430         auto weakWindow = weakToken.promote();
1431         if (weakWindow == nullptr) {
1432             TLOGNE(WmsLogTag::WMS_LIFE, "window is nullptr");
1433             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
1434             return;
1435         }
1436         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(weakWindow->Show(0, true, true));
1437         if (ret == WmErrorCode::WM_OK) {
1438             task->Resolve(env, NapiGetUndefined(env));
1439         } else {
1440             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window show failed"));
1441         }
1442         TLOGNI(WmsLogTag::WMS_LIFE, "%{public}s Window [%{public}u, %{public}s] end, ret=%{public}d",
1443             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), ret);
1444     };
1445     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnShowWithAnimation") != napi_status::napi_ok) {
1446         TLOGE(WmsLogTag::WMS_LIFE, "napi send event failed, window state is abnormal");
1447     }
1448     return result;
1449 }
1450 
OnDestroy(napi_env env,napi_callback_info info)1451 napi_value JsWindow::OnDestroy(napi_env env, napi_callback_info info)
1452 {
1453     WMError errCode = WMError::WM_OK;
1454     size_t argc = 4;
1455     napi_value argv[4] = {nullptr};
1456     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1457     if (argc > 1) {
1458         TLOGE(WmsLogTag::WMS_LIFE, "Argc is invalid: %{public}zu", argc);
1459         errCode = WMError::WM_ERROR_INVALID_PARAM;
1460     }
1461     wptr<Window> weakToken(windowToken_);
1462     const char* const where = __func__;
1463     napi_value lastParam = (argc == 0) ? nullptr : (GetType(env, argv[0]) == napi_function ? argv[0] : nullptr);
1464     napi_value result = nullptr;
1465     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1466     auto asyncTask = [this, weakToken, errCode, where, env, task = napiAsyncTask] {
1467         auto weakWindow = weakToken.promote();
1468         if (weakWindow == nullptr) {
1469             TLOGNE(WmsLogTag::WMS_LIFE, "window is nullptr");
1470             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
1471             return;
1472         }
1473         if (errCode != WMError::WM_OK) {
1474             task->Reject(env, JsErrUtils::CreateJsError(env, errCode));
1475             TLOGNE(WmsLogTag::WMS_LIFE, "window is nullptr or get invalid param");
1476             return;
1477         }
1478         if (WindowHelper::IsMainWindow(weakWindow->GetType())) {
1479             TLOGNW(WmsLogTag::WMS_LIFE, "window Type %{public}u is not supported, [%{public}u, %{public}s]",
1480                 static_cast<uint32_t>(weakWindow->GetType()),
1481                 weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str());
1482             task->Resolve(env, NapiGetUndefined(env));
1483             return;
1484         }
1485         WMError ret = weakWindow->Destroy();
1486         TLOGNI(WmsLogTag::WMS_LIFE, "%{public}s Window [%{public}u, %{public}s] end, ret=%{public}d",
1487             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), ret);
1488         if (ret != WMError::WM_OK) {
1489             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window destroy failed"));
1490             return;
1491         }
1492         windowToken_ = nullptr; // ensure window dtor when finalizer invalid
1493         task->Resolve(env, NapiGetUndefined(env));
1494     };
1495     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnDestroy") != napi_status::napi_ok) {
1496         TLOGE(WmsLogTag::WMS_LIFE, "napi send event failed, window state is abnormal");
1497     }
1498     return result;
1499 }
1500 
OnDestroyWindow(napi_env env,napi_callback_info info)1501 napi_value JsWindow::OnDestroyWindow(napi_env env, napi_callback_info info)
1502 {
1503     wptr<Window> weakToken(windowToken_);
1504     const char* const where = __func__;
1505     size_t argc = 4;
1506     napi_value argv[4] = {nullptr};
1507     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1508     napi_value lastParam = (argc == 0) ? nullptr :
1509         ((argv[0] != nullptr && GetType(env, argv[0]) == napi_function) ? argv[0] : nullptr);
1510     napi_value result = nullptr;
1511     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1512     auto asyncTask = [this, weakToken, where, env, task = napiAsyncTask] {
1513         auto weakWindow = weakToken.promote();
1514         if (weakWindow == nullptr) {
1515             TLOGNE(WmsLogTag::WMS_LIFE, "window is nullptr or get invalid param");
1516             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
1517             return;
1518         }
1519         if (WindowHelper::IsMainWindow(weakWindow->GetType())) {
1520             TLOGNW(WmsLogTag::WMS_LIFE, "window Type %{public}u is not supported, [%{public}u, %{public}s]",
1521                 static_cast<uint32_t>(weakWindow->GetType()),
1522                 weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str());
1523             task->Resolve(env, NapiGetUndefined(env));
1524             return;
1525         }
1526         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(weakWindow->Destroy());
1527         TLOGNI(WmsLogTag::WMS_LIFE, "%{public}s end, window [%{public}u, %{public}s] ret=%{public}d",
1528             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), ret);
1529         if (ret != WmErrorCode::WM_OK) {
1530             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window destroy failed"));
1531             return;
1532         }
1533         windowToken_ = nullptr; // ensure window dtor when finalizer invalid
1534         task->Resolve(env, NapiGetUndefined(env));
1535     };
1536     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnDestroyWindow") != napi_status::napi_ok) {
1537         TLOGE(WmsLogTag::WMS_LIFE, "napi send event failed, window state is abnormal");
1538     }
1539     return result;
1540 }
1541 
OnHide(napi_env env,napi_callback_info info)1542 napi_value JsWindow::OnHide(napi_env env, napi_callback_info info)
1543 {
1544     WmErrorCode errCode = Permission::IsSystemCallingOrStartByHdcd(true) ?
1545         WmErrorCode::WM_OK : WmErrorCode::WM_ERROR_NOT_SYSTEM_APP;
1546     return HideWindowFunction(env, info, errCode);
1547 }
1548 
HideWindowFunction(napi_env env,napi_callback_info info,WmErrorCode errCode)1549 napi_value JsWindow::HideWindowFunction(napi_env env, napi_callback_info info, WmErrorCode errCode)
1550 {
1551     wptr<Window> weakToken(windowToken_);
1552     const char* const where = __func__;
1553     size_t argc = 4;
1554     napi_value argv[4] = {nullptr};
1555     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1556     napi_value lastParam = (argc == 0) ? nullptr :
1557         (argv[0] != nullptr && GetType(env, argv[0]) == napi_function ? argv[0] : nullptr);
1558     napi_value result = nullptr;
1559     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1560     auto asyncTask = [weakToken, errCode, where, env, task = napiAsyncTask] {
1561         if (errCode != WmErrorCode::WM_OK) {
1562             task->Reject(env, JsErrUtils::CreateJsError(env, errCode));
1563             return;
1564         }
1565         auto weakWindow = weakToken.promote();
1566         if (weakWindow == nullptr) {
1567             TLOGNE(WmsLogTag::WMS_LIFE, "window is nullptr or get invalid param");
1568             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
1569             return;
1570         }
1571         if (WindowHelper::IsMainWindow(weakWindow->GetType())) {
1572             TLOGNW(WmsLogTag::WMS_LIFE, "window Type %{public}u is not supported, [%{public}u, %{public}s]",
1573                 static_cast<uint32_t>(weakWindow->GetType()),
1574                 weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str());
1575             task->Resolve(env, NapiGetUndefined(env));
1576             return;
1577         }
1578         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(weakWindow->Hide(0, false, false, true));
1579         if (ret == WmErrorCode::WM_OK) {
1580             task->Resolve(env, NapiGetUndefined(env));
1581         } else {
1582             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window hide failed"));
1583         }
1584         TLOGNI(WmsLogTag::WMS_LIFE, "%{public}s end, window [%{public}u] ret=%{public}d", where,
1585             weakWindow->GetWindowId(), ret);
1586     };
1587     if (napi_send_event(env, asyncTask, napi_eprio_high, "HideWindowFunction") != napi_status::napi_ok) {
1588         TLOGE(WmsLogTag::WMS_LIFE, "napi send event failed, window state is abnormal");
1589     }
1590     return result;
1591 }
1592 
OnHideWithAnimation(napi_env env,napi_callback_info info)1593 napi_value JsWindow::OnHideWithAnimation(napi_env env, napi_callback_info info)
1594 {
1595     WmErrorCode errCode = Permission::IsSystemCallingOrStartByHdcd(true) ?
1596         WmErrorCode::WM_OK : WmErrorCode::WM_ERROR_NOT_SYSTEM_APP;
1597     if (errCode == WmErrorCode::WM_OK) {
1598         if (windowToken_) {
1599             auto winType = windowToken_->GetType();
1600             if (!WindowHelper::IsSystemWindow(winType)) {
1601                 TLOGE(WmsLogTag::WMS_LIFE,
1602                     "window Type %{public}u is not supported", static_cast<uint32_t>(winType));
1603                 errCode = WmErrorCode::WM_ERROR_INVALID_CALLING;
1604             }
1605         } else {
1606             errCode = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
1607         }
1608     }
1609     wptr<Window> weakToken(windowToken_);
1610     const char* const where = __func__;
1611     size_t argc = 4;
1612     napi_value argv[4] = {nullptr};
1613     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1614     napi_value lastParam = (argc == 0) ? nullptr :
1615         ((argv[0] != nullptr && GetType(env, argv[0]) == napi_function) ? argv[0] : nullptr);
1616     napi_value result = nullptr;
1617     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1618     auto asyncTask = [weakToken, errCode, where, env, task = napiAsyncTask] {
1619         if (errCode != WmErrorCode::WM_OK) {
1620             task->Reject(env, JsErrUtils::CreateJsError(env, errCode));
1621             return;
1622         }
1623         auto weakWindow = weakToken.promote();
1624         if (weakWindow == nullptr) {
1625             TLOGNE(WmsLogTag::WMS_LIFE, "window is nullptr");
1626             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
1627             return;
1628         }
1629         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(weakWindow->Hide(0, true, false));
1630         if (ret == WmErrorCode::WM_OK) {
1631             task->Resolve(env, NapiGetUndefined(env));
1632         } else {
1633             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window show failed"));
1634         }
1635         TLOGNI(WmsLogTag::WMS_LIFE, "%{public}s end, window [%{public}u, %{public}s] ret=%{public}d",
1636             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), ret);
1637     };
1638     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnHideWithAnimation") != napi_status::napi_ok) {
1639         TLOGE(WmsLogTag::WMS_LIFE, "napi send event failed, window state is abnormal");
1640     }
1641     return result;
1642 }
1643 
OnRecover(napi_env env,napi_callback_info info)1644 napi_value JsWindow::OnRecover(napi_env env, napi_callback_info info)
1645 {
1646     size_t argc = FOUR_PARAMS_SIZE;
1647     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
1648     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1649     napi_value lastParam = (argc == 0) ? nullptr :
1650         (GetType(env, argv[INDEX_ZERO]) == napi_function ? argv[INDEX_ZERO] : nullptr);
1651     napi_value result = nullptr;
1652     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1653     const char* const where = __func__;
1654     auto asyncTask = [windowToken = wptr<Window>(windowToken_), env, task = napiAsyncTask, where] {
1655         auto window = windowToken.promote();
1656         if (window == nullptr) {
1657             TLOGNE(WmsLogTag::WMS_LAYOUT_PC, "%{public}s window is nullptr", where);
1658             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
1659             return;
1660         }
1661         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->Recover(1));
1662         if (ret == WmErrorCode::WM_OK) {
1663             task->Resolve(env, NapiGetUndefined(env));
1664         } else {
1665             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window recover failed"));
1666         }
1667         TLOGNI(WmsLogTag::WMS_LAYOUT_PC, "%{public}s end, window [%{public}u] ret=%{public}d",
1668             where, window->GetWindowId(), ret);
1669     };
1670     if (napi_send_event(env, asyncTask, napi_eprio_immediate, "OnRecover") != napi_status::napi_ok) {
1671         napiAsyncTask->Reject(env, CreateJsError(env,
1672             static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
1673     }
1674     return result;
1675 }
1676 
OnRestore(napi_env env,napi_callback_info info)1677 napi_value JsWindow::OnRestore(napi_env env, napi_callback_info info)
1678 {
1679     size_t argc = FOUR_PARAMS_SIZE;
1680     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
1681     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1682     napi_value lastParam = (argc == 0) ? nullptr :
1683         (GetType(env, argv[INDEX_ZERO]) == napi_function ? argv[INDEX_ZERO] : nullptr);
1684     napi_value result = nullptr;
1685     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1686     const char* const where = __func__;
1687     auto asyncTask = [windowToken = wptr<Window>(windowToken_), env, task = napiAsyncTask, where] {
1688         auto window = windowToken.promote();
1689         if (window == nullptr) {
1690             TLOGNE(WmsLogTag::WMS_LAYOUT_PC, "%{public}s window is nullptr", where);
1691             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
1692             return;
1693         }
1694         if (!WindowHelper::IsMainWindow(window->GetType())) {
1695             TLOGNE(WmsLogTag::WMS_LAYOUT_PC, "%{public}s Restore fail, not main window", where);
1696             task->Reject(env,
1697                 JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_CALLING));
1698             return;
1699         }
1700         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->Restore());
1701         if (ret == WmErrorCode::WM_OK) {
1702             task->Resolve(env, NapiGetUndefined(env));
1703         } else {
1704             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window restore failed"));
1705         }
1706     };
1707     if (napi_send_event(env, asyncTask, napi_eprio_immediate, "OnRestore") != napi_status::napi_ok) {
1708         napiAsyncTask->Reject(env, CreateJsError(env,
1709             static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
1710     }
1711     return result;
1712 }
1713 
1714 /** @note @window.layout */
OnMoveTo(napi_env env,napi_callback_info info)1715 napi_value JsWindow::OnMoveTo(napi_env env, napi_callback_info info)
1716 {
1717     WMError errCode = WMError::WM_OK;
1718     size_t argc = 4;
1719     napi_value argv[4] = {nullptr};
1720     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1721     if (argc < 2 || argc > 3) { // 2:minimum param num, 3: maximum param num
1722         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
1723         errCode = WMError::WM_ERROR_INVALID_PARAM;
1724     }
1725     int32_t x = 0;
1726     if (errCode == WMError::WM_OK && !ConvertFromJsValue(env, argv[0], x)) {
1727         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to x");
1728         errCode = WMError::WM_ERROR_INVALID_PARAM;
1729     }
1730 
1731     int32_t y = 0;
1732     if (errCode == WMError::WM_OK && !ConvertFromJsValue(env, argv[1], y)) {
1733         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to y");
1734         errCode = WMError::WM_ERROR_INVALID_PARAM;
1735     }
1736     // 2: params num; 2: index of callback
1737     napi_value lastParam = (argc <= 2) ? nullptr : (GetType(env, argv[2]) == napi_function ? argv[2] : nullptr);
1738     napi_value result = nullptr;
1739     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1740     auto asyncTask = [windowToken = wptr<Window>(windowToken_), errCode, x, y,
1741                       env, task = napiAsyncTask, where = __func__] {
1742         if (errCode != WMError::WM_OK) {
1743             task->Reject(env, JsErrUtils::CreateJsError(env, errCode));
1744             TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s: invalid param", where);
1745             return;
1746         }
1747         auto window = windowToken.promote();
1748         if (window == nullptr) {
1749             TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s: window is nullptr", where);
1750             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
1751             return;
1752         }
1753         WMError ret = window->MoveTo(x, y);
1754         if (ret == WMError::WM_OK) {
1755             task->Resolve(env, NapiGetUndefined(env));
1756         } else {
1757             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window move failed"));
1758         }
1759         TLOGND(WmsLogTag::WMS_LAYOUT, "%{public}s: end, window [%{public}u, %{public}s] ret=%{public}d",
1760                where, window->GetWindowId(), window->GetWindowName().c_str(), ret);
1761     };
1762     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnMoveTo") != napi_status::napi_ok) {
1763         napiAsyncTask->Reject(env,
1764             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
1765     }
1766     return result;
1767 }
1768 
1769 /** @note @window.layout */
OnMoveWindowTo(napi_env env,napi_callback_info info)1770 napi_value JsWindow::OnMoveWindowTo(napi_env env, napi_callback_info info)
1771 {
1772     WmErrorCode errCode = WmErrorCode::WM_OK;
1773     size_t argc = 4;
1774     napi_value argv[4] = {nullptr};
1775     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1776     if (argc < 2) { // 2:minimum param num
1777         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
1778         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
1779     }
1780     int32_t x = 0;
1781     if (errCode == WmErrorCode::WM_OK && !ConvertFromJsValue(env, argv[0], x)) {
1782         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to x");
1783         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
1784     }
1785     int32_t y = 0;
1786     if (errCode == WmErrorCode::WM_OK && !ConvertFromJsValue(env, argv[1], y)) {
1787         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to y");
1788         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
1789     }
1790     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
1791         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1792     }
1793     // 2: params num; 2: index of callback
1794     napi_value lastParam = (argc <= 2) ? nullptr :
1795         ((argv[2] != nullptr && GetType(env, argv[2]) == napi_function) ? argv[2] : nullptr);
1796     napi_value result = nullptr;
1797     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1798     auto asyncTask = [windowToken = wptr<Window>(windowToken_), x, y,
1799                       env, task = napiAsyncTask, where = __func__] {
1800         auto window = windowToken.promote();
1801         if (window == nullptr) {
1802             TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s: window is nullptr", where);
1803             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
1804             return;
1805         }
1806         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->MoveTo(x, y));
1807         if (ret == WmErrorCode::WM_OK) {
1808             task->Resolve(env, NapiGetUndefined(env));
1809         } else {
1810             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window move failed"));
1811         }
1812         TLOGND(WmsLogTag::WMS_LAYOUT, "%{public}s: window [%{public}u, %{public}s] ret=%{public}d",
1813                where, window->GetWindowId(), window->GetWindowName().c_str(), ret);
1814     };
1815     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnMoveWindowTo") != napi_status::napi_ok) {
1816         napiAsyncTask->Reject(env,
1817             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
1818     }
1819     return result;
1820 }
1821 
SetMoveWindowToAsyncTask(NapiAsyncTask::ExecuteCallback & execute,NapiAsyncTask::CompleteCallback & complete,const wptr<Window> & weakToken,int32_t x,int32_t y,MoveConfiguration moveConfiguration)1822 static void SetMoveWindowToAsyncTask(NapiAsyncTask::ExecuteCallback& execute, NapiAsyncTask::CompleteCallback& complete,
1823     const wptr<Window>& weakToken, int32_t x, int32_t y, MoveConfiguration moveConfiguration)
1824 {
1825     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
1826     const char* const where = __func__;
1827     execute = [weakToken, errCodePtr, x, y, moveConfiguration, where] {
1828         if (errCodePtr == nullptr) {
1829             return;
1830         }
1831         if (*errCodePtr != WmErrorCode::WM_OK) {
1832             return;
1833         }
1834         auto weakWindow = weakToken.promote();
1835         if (weakWindow == nullptr) {
1836             TLOGE(WmsLogTag::WMS_LAYOUT, "window is nullptr");
1837             *errCodePtr = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
1838             return;
1839         }
1840         *errCodePtr = WM_JS_TO_ERROR_CODE_MAP.at(weakWindow->MoveToAsync(x, y, moveConfiguration));
1841         TLOGND(WmsLogTag::WMS_LAYOUT, "%{public}s end, window [%{public}u, %{public}s] err=%{public}d",
1842             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), *errCodePtr);
1843     };
1844     complete = [weakToken, errCodePtr](napi_env env, NapiAsyncTask& task, int32_t status) {
1845         if (errCodePtr == nullptr) {
1846             task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
1847             return;
1848         }
1849         if (*errCodePtr == WmErrorCode::WM_OK) {
1850             task.Resolve(env, NapiGetUndefined(env));
1851         } else {
1852             task.Reject(env, JsErrUtils::CreateJsError(env, *errCodePtr, "JsWindow::OnMoveWindowToAsync failed"));
1853         }
1854     };
1855 }
1856 
1857 /** @note @window.layout */
OnMoveWindowToAsync(napi_env env,napi_callback_info info)1858 napi_value JsWindow::OnMoveWindowToAsync(napi_env env, napi_callback_info info)
1859 {
1860     size_t argc = FOUR_PARAMS_SIZE;
1861     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
1862     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1863     if (argc < 2) { // 2: minimum param num
1864         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
1865         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1866     }
1867     int32_t x = 0;
1868     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], x)) {
1869         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to x");
1870         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1871     }
1872     int32_t y = 0;
1873     if (!ConvertFromJsValue(env, argv[INDEX_ONE], y)) {
1874         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to y");
1875         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1876     }
1877     MoveConfiguration moveConfiguration;
1878     size_t lastParamIndex = INDEX_TWO;
1879     if (argc > 2 && argv[INDEX_TWO] != nullptr && GetType(env, argv[INDEX_TWO]) == napi_object) { // 2: x/y params num
1880         lastParamIndex = INDEX_THREE; // MoveConfiguration is optional param
1881         if (!GetMoveConfigurationFromJsValue(env, argv[INDEX_TWO], moveConfiguration)) {
1882             TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to moveConfiguration");
1883             return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1884         }
1885     }
1886     NapiAsyncTask::ExecuteCallback execute;
1887     NapiAsyncTask::CompleteCallback complete;
1888     SetMoveWindowToAsyncTask(execute, complete, wptr<Window>(windowToken_), x, y, moveConfiguration);
1889 
1890     napi_value lastParam = (argc <= lastParamIndex) ? nullptr :
1891         ((argv[lastParamIndex] != nullptr && GetType(env, argv[lastParamIndex]) == napi_function) ?
1892          argv[lastParamIndex] : nullptr);
1893     napi_value result = nullptr;
1894     NapiAsyncTask::Schedule("JsWindow::OnMoveWindowToAsync",
1895         env, CreateAsyncTaskWithLastParam(env, lastParam, std::move(execute), std::move(complete), &result));
1896     return result;
1897 }
1898 
SetMoveWindowToGlobalAsyncTask(NapiAsyncTask::ExecuteCallback & execute,NapiAsyncTask::CompleteCallback & complete,const wptr<Window> & weakToken,int32_t x,int32_t y,MoveConfiguration moveConfiguration)1899 static void SetMoveWindowToGlobalAsyncTask(NapiAsyncTask::ExecuteCallback& execute,
1900     NapiAsyncTask::CompleteCallback& complete, const wptr<Window>& weakToken,
1901     int32_t x, int32_t y, MoveConfiguration moveConfiguration)
1902 {
1903     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
1904     const char* const where = __func__;
1905     execute = [weakToken, errCodePtr, x, y, moveConfiguration, where] {
1906         if (errCodePtr == nullptr) {
1907             return;
1908         }
1909         if (*errCodePtr != WmErrorCode::WM_OK) {
1910             return;
1911         }
1912         auto window = weakToken.promote();
1913         if (window == nullptr) {
1914             TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s window is nullptr", where);
1915             *errCodePtr = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
1916             return;
1917         }
1918         *errCodePtr = WM_JS_TO_ERROR_CODE_MAP.at(window->MoveWindowToGlobal(x, y, moveConfiguration));
1919         TLOGND(WmsLogTag::WMS_LAYOUT, "%{public}s end, window [%{public}u, %{public}s] err=%{public}d",
1920             where, window->GetWindowId(), window->GetWindowName().c_str(), *errCodePtr);
1921     };
1922     complete = [weakToken, errCodePtr](napi_env env, NapiAsyncTask& task, int32_t status) {
1923         if (errCodePtr == nullptr) {
1924             task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
1925             return;
1926         }
1927         if (*errCodePtr == WmErrorCode::WM_OK) {
1928             task.Resolve(env, NapiGetUndefined(env));
1929         } else {
1930             task.Reject(env, JsErrUtils::CreateJsError(
1931                 env, *errCodePtr, "JsWindow::OnMoveWindowToGlobal failed"));
1932         }
1933     };
1934 }
1935 
1936 /** @note @window.layout */
OnMoveWindowToGlobal(napi_env env,napi_callback_info info)1937 napi_value JsWindow::OnMoveWindowToGlobal(napi_env env, napi_callback_info info)
1938 {
1939     size_t argc = FOUR_PARAMS_SIZE;
1940     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
1941     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1942     if (argc < 2) { // 2:minimum param num
1943         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
1944         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1945     }
1946     int32_t x = 0;
1947     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], x)) {
1948         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to x");
1949         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1950     }
1951     int32_t y = 0;
1952     if (!ConvertFromJsValue(env, argv[INDEX_ONE], y)) {
1953         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to y");
1954         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1955     }
1956     MoveConfiguration moveConfiguration;
1957     size_t lastParamIndex = INDEX_TWO;
1958     if (argc > TWO_PARAMS_SIZE && argv[INDEX_TWO] != nullptr && GetType(env, argv[INDEX_TWO]) == napi_object) {
1959         lastParamIndex = INDEX_THREE; // MoveConfiguration is optional param
1960         if (!GetMoveConfigurationFromJsValue(env, argv[INDEX_TWO], moveConfiguration)) {
1961             TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to moveConfiguration and rectAnimationConfig");
1962             return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1963         }
1964     }
1965     NapiAsyncTask::ExecuteCallback execute;
1966     NapiAsyncTask::CompleteCallback complete;
1967     SetMoveWindowToGlobalAsyncTask(execute, complete, wptr<Window>(windowToken_), x, y, moveConfiguration);
1968 
1969     napi_value lastParam = (argc <= lastParamIndex) ? nullptr :
1970         ((argv[lastParamIndex] != nullptr && GetType(env, argv[lastParamIndex]) == napi_function) ?
1971          argv[lastParamIndex] : nullptr);
1972     napi_value result = nullptr;
1973     NapiAsyncTask::Schedule("JsWindow::OnMoveWindowToGlobal",
1974         env, CreateAsyncTaskWithLastParam(env, lastParam, std::move(execute), std::move(complete), &result));
1975     return result;
1976 }
1977 
1978 /** @note @window.layout */
OnMoveWindowToGlobalDisplay(napi_env env,napi_callback_info info)1979 napi_value JsWindow::OnMoveWindowToGlobalDisplay(napi_env env, napi_callback_info info)
1980 {
1981     size_t argc = TWO_PARAMS_SIZE;
1982     napi_value argv[TWO_PARAMS_SIZE] = { nullptr };
1983     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1984     if (argc != TWO_PARAMS_SIZE) {
1985         TLOGE(WmsLogTag::WMS_LAYOUT, "Invalid argc: %{public}zu", argc);
1986         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1987     }
1988 
1989     int32_t x = 0;
1990     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], x)) {
1991         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to x");
1992         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1993     }
1994     int32_t y = 0;
1995     if (!ConvertFromJsValue(env, argv[INDEX_ONE], y)) {
1996         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to y");
1997         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1998     }
1999 
2000     napi_value result = nullptr;
2001     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
2002     auto asyncTask = [windowToken = wptr<Window>(windowToken_), x, y, env, napiAsyncTask, where = __func__] {
2003         auto window = windowToken.promote();
2004         if (!window) {
2005             TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s: window is nullptr", where);
2006             napiAsyncTask->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
2007             return;
2008         }
2009         auto moveResult = window->MoveWindowToGlobalDisplay(x, y);
2010         auto it = WM_JS_TO_ERROR_CODE_MAP.find(moveResult);
2011         WmErrorCode ret = (it != WM_JS_TO_ERROR_CODE_MAP.end()) ? it->second : WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
2012         if (ret == WmErrorCode::WM_OK) {
2013             napiAsyncTask->Resolve(env, NapiGetUndefined(env));
2014         } else {
2015             napiAsyncTask->Reject(env, JsErrUtils::CreateJsError(env, ret, "Failed to move window"));
2016         }
2017         TLOGNI(WmsLogTag::WMS_LAYOUT,
2018             "%{public}s: window: [%{public}u, %{public}s], x: %{public}d, y: %{public}d, ret: %{public}d",
2019             where, window->GetWindowId(), window->GetWindowName().c_str(), x, y, static_cast<int32_t>(ret));
2020     };
2021     if (napi_status::napi_ok != napi_send_event(env, asyncTask, napi_eprio_high)) {
2022         napiAsyncTask->Reject(env,
2023             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "Failed to send event"));
2024     }
2025     return result;
2026 }
2027 
2028 /** @note @window.layout */
OnGetGlobalScaledRect(napi_env env,napi_callback_info info)2029 napi_value JsWindow::OnGetGlobalScaledRect(napi_env env, napi_callback_info info)
2030 {
2031     if (windowToken_ == nullptr) {
2032         TLOGE(WmsLogTag::WMS_LAYOUT, "window is nullptr");
2033         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
2034     }
2035     Rect globalScaledRect;
2036     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->GetGlobalScaledRect(globalScaledRect));
2037     if (ret != WmErrorCode::WM_OK) {
2038         return NapiThrowError(env, ret);
2039     }
2040     TLOGI(WmsLogTag::WMS_LAYOUT, "Window [%{public}u, %{public}s] end",
2041         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str());
2042     napi_value globalScaledRectObj = GetRectAndConvertToJsValue(env, globalScaledRect);
2043     if (globalScaledRectObj == nullptr) {
2044         TLOGE(WmsLogTag::WMS_LAYOUT, "globalScaledRectObj is nullptr");
2045         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
2046     }
2047     return globalScaledRectObj;
2048 }
2049 
2050 /** @note @window.layout */
OnResize(napi_env env,napi_callback_info info)2051 napi_value JsWindow::OnResize(napi_env env, napi_callback_info info)
2052 {
2053     WMError errCode = WMError::WM_OK;
2054     size_t argc = 4;
2055     napi_value argv[4] = {nullptr};
2056     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2057     if (argc < 2 || argc > 3) { // 2: minimum param num, 3: maximum param num
2058         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
2059         errCode = WMError::WM_ERROR_INVALID_PARAM;
2060     }
2061     int32_t width = 0;
2062     if (errCode == WMError::WM_OK && !ConvertFromJsValue(env, argv[0], width)) {
2063         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to width");
2064         errCode = WMError::WM_ERROR_INVALID_PARAM;
2065     }
2066     int32_t height = 0;
2067     if (errCode == WMError::WM_OK && !ConvertFromJsValue(env, argv[1], height)) {
2068         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to height");
2069         errCode = WMError::WM_ERROR_INVALID_PARAM;
2070     }
2071     if (width <= 0 || height <= 0) {
2072         TLOGE(WmsLogTag::WMS_LAYOUT, "width or height should greater than 0!");
2073         errCode = WMError::WM_ERROR_INVALID_PARAM;
2074     }
2075     // 2: params num; 2: index of callback
2076     napi_value lastParam = (argc <= 2) ? nullptr : (GetType(env, argv[2]) == napi_function ? argv[2] : nullptr);
2077     napi_value result = nullptr;
2078     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
2079     auto asyncTask = [windowToken = wptr<Window>(windowToken_), errCode, width, height,
2080                       env, task = napiAsyncTask, where = __func__] {
2081         if (errCode != WMError::WM_OK) {
2082             task->Reject(env, JsErrUtils::CreateJsError(env, errCode));
2083             TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s: invalid param", where);
2084             return;
2085         }
2086         auto window = windowToken.promote();
2087         if (window == nullptr) {
2088             TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s: window is nullptr", where);
2089             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
2090             return;
2091         }
2092         WMError ret = window->Resize(static_cast<uint32_t>(width), static_cast<uint32_t>(height));
2093         if (ret == WMError::WM_OK) {
2094             task->Resolve(env, NapiGetUndefined(env));
2095         } else {
2096             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window resize failed"));
2097         }
2098         TLOGND(WmsLogTag::WMS_LAYOUT, "%{public}s: end, window [%{public}u, %{public}s] ret=%{public}d",
2099                where, window->GetWindowId(), window->GetWindowName().c_str(), ret);
2100     };
2101     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnResize") != napi_status::napi_ok) {
2102         napiAsyncTask->Reject(env,
2103             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
2104     }
2105     return result;
2106 }
2107 
2108 /** @note @window.layout */
OnResizeWindow(napi_env env,napi_callback_info info)2109 napi_value JsWindow::OnResizeWindow(napi_env env, napi_callback_info info)
2110 {
2111     WmErrorCode errCode = WmErrorCode::WM_OK;
2112     size_t argc = 4;
2113     napi_value argv[4] = {nullptr};
2114     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2115     if (argc < 2) { // 2: minimum param num
2116         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
2117         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
2118     }
2119     int32_t width = 0;
2120     if (errCode == WmErrorCode::WM_OK && !ConvertFromJsValue(env, argv[0], width)) {
2121         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to width");
2122         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
2123     }
2124     int32_t height = 0;
2125     if (errCode == WmErrorCode::WM_OK && !ConvertFromJsValue(env, argv[1], height)) {
2126         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to height");
2127         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
2128     }
2129     if (width <= 0 || height <= 0) {
2130         TLOGE(WmsLogTag::WMS_LAYOUT, "width or height should greater than 0!");
2131         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
2132     }
2133     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
2134         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2135     }
2136     // 2: params num; 2: index of callback
2137     napi_value lastParam = (argc <= 2) ? nullptr :
2138         ((argv[2] != nullptr && GetType(env, argv[2]) == napi_function) ? argv[2] : nullptr);
2139     napi_value result = nullptr;
2140     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
2141     auto asyncTask = [windowToken = wptr<Window>(windowToken_), width, height,
2142                       env, task = napiAsyncTask, where = __func__] {
2143         auto window = windowToken.promote();
2144         if (window == nullptr) {
2145             TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s: window is nullptr", where);
2146             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
2147             return;
2148         }
2149         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(
2150             window->Resize(static_cast<uint32_t>(width), static_cast<uint32_t>(height)));
2151         if (ret == WmErrorCode::WM_OK) {
2152             task->Resolve(env, NapiGetUndefined(env));
2153         } else {
2154             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window resize failed"));
2155         }
2156         TLOGND(WmsLogTag::WMS_LAYOUT, "%{public}s: window [%{public}u, %{public}s] ret=%{public}d",
2157                where, window->GetWindowId(), window->GetWindowName().c_str(), ret);
2158     };
2159     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnResizeWindow") != napi_status::napi_ok) {
2160         napiAsyncTask->Reject(env,
2161             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
2162     }
2163     return result;
2164 }
2165 
SetResizeWindowAsyncTask(NapiAsyncTask::ExecuteCallback & execute,NapiAsyncTask::CompleteCallback & complete,wptr<Window> weakToken,int32_t width,int32_t height)2166 static void SetResizeWindowAsyncTask(NapiAsyncTask::ExecuteCallback& execute, NapiAsyncTask::CompleteCallback& complete,
2167     wptr<Window> weakToken, int32_t width, int32_t height)
2168 {
2169     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
2170     const char* const where = __func__;
2171     execute = [weakToken, errCodePtr, width, height, where] {
2172         if (errCodePtr == nullptr) {
2173             return;
2174         }
2175         if (*errCodePtr != WmErrorCode::WM_OK) {
2176             return;
2177         }
2178         auto weakWindow = weakToken.promote();
2179         if (weakWindow == nullptr) {
2180             TLOGE(WmsLogTag::WMS_LAYOUT, "window is nullptr");
2181             *errCodePtr = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
2182             return;
2183         }
2184         *errCodePtr = WM_JS_TO_ERROR_CODE_MAP.at(
2185             weakWindow->ResizeAsync(static_cast<uint32_t>(width), static_cast<uint32_t>(height)));
2186         TLOGND(WmsLogTag::WMS_LAYOUT, "%{public}s end, window [%{public}u, %{public}s] err=%{public}d",
2187             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), *errCodePtr);
2188     };
2189     complete = [weakToken, errCodePtr](napi_env env, NapiAsyncTask& task, int32_t status) {
2190         if (errCodePtr == nullptr) {
2191             task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
2192             return;
2193         }
2194         if (*errCodePtr == WmErrorCode::WM_OK) {
2195             task.Resolve(env, NapiGetUndefined(env));
2196         } else {
2197             task.Reject(env, JsErrUtils::CreateJsError(env, *errCodePtr, "JsWindow::OnResizeWindowAsync failed"));
2198         }
2199     };
2200 }
2201 
2202 /** @note @window.layout */
OnResizeWindowAsync(napi_env env,napi_callback_info info)2203 napi_value JsWindow::OnResizeWindowAsync(napi_env env, napi_callback_info info)
2204 {
2205     WmErrorCode errCode = WmErrorCode::WM_OK;
2206     size_t argc = 4; // 4: number of arg
2207     napi_value argv[4] = {nullptr};
2208     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2209     if (argc < 2) { // 2: minimum param num
2210         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
2211         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
2212     }
2213     int32_t width = 0;
2214     if (errCode == WmErrorCode::WM_OK && !ConvertFromJsValue(env, argv[0], width)) {
2215         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to width");
2216         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
2217     }
2218     int32_t height = 0;
2219     if (errCode == WmErrorCode::WM_OK && !ConvertFromJsValue(env, argv[1], height)) {
2220         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to height");
2221         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
2222     }
2223     if (width <= 0 || height <= 0) {
2224         TLOGE(WmsLogTag::WMS_LAYOUT, "width or height should greater than 0!");
2225         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
2226     }
2227     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
2228         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2229     }
2230 
2231     wptr<Window> weakToken(windowToken_);
2232     NapiAsyncTask::ExecuteCallback execute;
2233     NapiAsyncTask::CompleteCallback complete;
2234     SetResizeWindowAsyncTask(execute, complete, weakToken, width, height);
2235 
2236     // 2: params num; 2: index of callback
2237     napi_value lastParam = (argc <= 2) ? nullptr :
2238         ((argv[2] != nullptr && GetType(env, argv[2]) == napi_function) ? argv[2] : nullptr);
2239     napi_value result = nullptr;
2240     NapiAsyncTask::Schedule("JsWindow::OnResizeWindowAsync",
2241         env, CreateAsyncTaskWithLastParam(env, lastParam, std::move(execute), std::move(complete), &result));
2242     return result;
2243 }
2244 
SetResizeWindowWithAnimationAsyncTask(NapiAsyncTask::ExecuteCallback & execute,NapiAsyncTask::CompleteCallback & complete,const wptr<Window> & weakToken,const Rect & rect,const RectAnimationConfig & rectAnimationConfig)2245 static void SetResizeWindowWithAnimationAsyncTask(NapiAsyncTask::ExecuteCallback& execute,
2246     NapiAsyncTask::CompleteCallback& complete, const wptr<Window>& weakToken, const Rect& rect,
2247     const RectAnimationConfig& rectAnimationConfig)
2248 {
2249     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
2250     const char* const where = __func__;
2251     execute = [weakToken, errCodePtr, rect, rectAnimationConfig, where] {
2252         if (errCodePtr == nullptr) {
2253             return;
2254         }
2255         auto window = weakToken.promote();
2256         if (window == nullptr) {
2257             TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s window is nullptr", where);
2258             *errCodePtr = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
2259             return;
2260         }
2261         *errCodePtr = WM_JS_TO_ERROR_CODE_MAP.at(window->ResizeAsync(rect.width_, rect.height_, rectAnimationConfig));
2262         TLOGND(WmsLogTag::WMS_LAYOUT, "%{public}s end, window [%{public}u, %{public}s] err=%{public}d",
2263             where, window->GetWindowId(), window->GetWindowName().c_str(), *errCodePtr);
2264     };
2265     complete = [errCodePtr, where](napi_env env, NapiAsyncTask& task, int32_t status) {
2266         if (errCodePtr == nullptr) {
2267             task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
2268             return;
2269         }
2270         if (*errCodePtr == WmErrorCode::WM_OK) {
2271             TLOGNI(WmsLogTag::WMS_LAYOUT, "%{public}s window resize success", where);
2272             task.Resolve(env, NapiGetUndefined(env));
2273         } else {
2274             task.Reject(env, JsErrUtils::CreateJsError(env, *errCodePtr,
2275                 "JsWindow::OnResizeWindowWithAnimation failed"));
2276         }
2277     };
2278 }
2279 
2280 /** @note @window.layout */
OnResizeWindowWithAnimation(napi_env env,napi_callback_info info)2281 napi_value JsWindow::OnResizeWindowWithAnimation(napi_env env, napi_callback_info info)
2282 {
2283     size_t argc = FOUR_PARAMS_SIZE;
2284     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
2285     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2286     if (argc < THREE_PARAMS_SIZE) {
2287         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
2288         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2289     }
2290     int32_t width = 0;
2291     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], width)) {
2292         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to width");
2293         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2294     }
2295     int32_t height = 0;
2296     if (!ConvertFromJsValue(env, argv[INDEX_ONE], height)) {
2297         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to height");
2298         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2299     }
2300     if (width <= 0 || height <= 0) {
2301         TLOGE(WmsLogTag::WMS_LAYOUT, "width or height should greater than 0!");
2302         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2303     }
2304 
2305     RectAnimationConfig rectAnimationConfig;
2306     if (argv[INDEX_TWO] == nullptr || !ParseRectAnimationConfig(env, argv[INDEX_TWO], rectAnimationConfig)) {
2307         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert object to rectAnimationConfig");
2308         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2309     }
2310 
2311     NapiAsyncTask::ExecuteCallback execute;
2312     NapiAsyncTask::CompleteCallback complete;
2313     Rect rect = { 0, 0, width, height };
2314     SetResizeWindowWithAnimationAsyncTask(execute, complete, wptr<Window>(windowToken_), rect,
2315         rectAnimationConfig);
2316     napi_value lastParam = (argc <= THREE_PARAMS_SIZE) ? nullptr :
2317         ((argv[INDEX_THREE] != nullptr && GetType(env, argv[INDEX_THREE]) == napi_function) ?
2318          argv[INDEX_THREE] : nullptr);
2319     napi_value result = nullptr;
2320     NapiAsyncTask::Schedule("JsWindow::OnResizeWindowWithAnimation",
2321         env, CreateAsyncTaskWithLastParam(env, lastParam, std::move(execute), std::move(complete), &result));
2322     return result;
2323 }
2324 
2325 /** @note @window.layout */
2326 template <typename PositionTransformFunc>
HandlePositionTransform(napi_env env,napi_callback_info info,PositionTransformFunc transformFunc,const char * caller)2327 napi_value JsWindow::HandlePositionTransform(
2328     napi_env env, napi_callback_info info, PositionTransformFunc transformFunc, const char* caller)
2329 {
2330     size_t argc = TWO_PARAMS_SIZE;
2331     napi_value argv[TWO_PARAMS_SIZE] = { nullptr };
2332     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2333     if (argc != TWO_PARAMS_SIZE) {
2334         TLOGE(WmsLogTag::WMS_LAYOUT, "%{public}s: Invalid argc: %{public}zu", caller, argc);
2335         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2336     }
2337 
2338     int32_t x = 0;
2339     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], x)) {
2340         TLOGE(WmsLogTag::WMS_LAYOUT, "%{public}s: Failed to convert parameter to x", caller);
2341         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2342     }
2343     int32_t y = 0;
2344     if (!ConvertFromJsValue(env, argv[INDEX_ONE], y)) {
2345         TLOGE(WmsLogTag::WMS_LAYOUT, "%{public}s: Failed to convert parameter to y", caller);
2346         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2347     }
2348 
2349     if (!windowToken_) {
2350         TLOGE(WmsLogTag::WMS_LAYOUT, "%{public}s: window is nullptr", caller);
2351         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
2352     }
2353 
2354     Position inPosition { x, y };
2355     Position outPosition;
2356     auto transformRet = transformFunc(windowToken_, inPosition, outPosition);
2357     auto it = WM_JS_TO_ERROR_CODE_MAP.find(transformRet);
2358     WmErrorCode errCode = (it != WM_JS_TO_ERROR_CODE_MAP.end()) ? it->second : WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
2359     if (errCode != WmErrorCode::WM_OK) {
2360         return NapiThrowError(env, errCode);
2361     }
2362     TLOGI(WmsLogTag::WMS_LAYOUT, "%{public}s: windowId: %{public}u, inPosition: %{public}s, outPosition: %{public}s",
2363         caller, windowToken_->GetWindowId(), inPosition.ToString().c_str(), outPosition.ToString().c_str());
2364 
2365     auto jsOutPosition = BuildJsPosition(env, outPosition);
2366     if (!jsOutPosition) {
2367         TLOGE(WmsLogTag::WMS_LAYOUT, "%{public}s: Failed to build JS position object", caller);
2368         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
2369     }
2370     return jsOutPosition;
2371 }
2372 
2373 /** @note @window.layout */
OnClientToGlobalDisplay(napi_env env,napi_callback_info info)2374 napi_value JsWindow::OnClientToGlobalDisplay(napi_env env, napi_callback_info info)
2375 {
2376     return HandlePositionTransform(
2377         env, info,
2378         [](const sptr<Window>& window, const Position& inPosition, Position& outPosition) {
2379             return window->ClientToGlobalDisplay(inPosition, outPosition);
2380         },
2381         __func__);
2382 }
2383 
2384 /** @note @window.layout */
OnGlobalDisplayToClient(napi_env env,napi_callback_info info)2385 napi_value JsWindow::OnGlobalDisplayToClient(napi_env env, napi_callback_info info)
2386 {
2387     return HandlePositionTransform(
2388         env, info,
2389         [](const sptr<Window>& window, const Position& inPosition, Position& outPosition) {
2390             return window->GlobalDisplayToClient(inPosition, outPosition);
2391         },
2392         __func__);
2393 }
2394 
OnSetWindowType(napi_env env,napi_callback_info info)2395 napi_value JsWindow::OnSetWindowType(napi_env env, napi_callback_info info)
2396 {
2397     WMError errCode = WMError::WM_OK;
2398     size_t argc = 4;
2399     napi_value argv[4] = {nullptr};
2400     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2401     if (argc < 1 || argc > 2) { // 2 is max num of argc
2402         WLOGFE("Argc is invalid: %{public}zu", argc);
2403         errCode = WMError::WM_ERROR_INVALID_PARAM;
2404     }
2405     WindowType winType = WindowType::SYSTEM_WINDOW_BASE;
2406     uint32_t resultValue = 0;
2407     if (errCode == WMError::WM_OK && !ConvertFromJsValue(env, argv[0], resultValue)) {
2408         WLOGFE("Failed to convert parameter to windowType");
2409         errCode = WMError::WM_ERROR_INVALID_PARAM;
2410     }
2411     if (resultValue >= static_cast<uint32_t>(WindowType::SYSTEM_WINDOW_BASE) &&
2412         resultValue <= static_cast<uint32_t>(WindowType::SYSTEM_WINDOW_END)) {
2413         winType = static_cast<WindowType>(resultValue); // adapt to the old version
2414     } else if (JS_TO_NATIVE_WINDOW_TYPE_MAP.count(static_cast<ApiWindowType>(resultValue)) != 0) {
2415         winType = JS_TO_NATIVE_WINDOW_TYPE_MAP.at(static_cast<ApiWindowType>(resultValue));
2416     } else {
2417         WLOGFE("Do not support this type: %{public}u", resultValue);
2418         errCode = WMError::WM_ERROR_INVALID_PARAM;
2419     }
2420 
2421     wptr<Window> weakToken(windowToken_);
2422     const char* const where = __func__;
2423     NapiAsyncTask::CompleteCallback complete =
2424         [weakToken, winType, errCode, where](napi_env env, NapiAsyncTask& task, int32_t status) {
2425             auto weakWindow = weakToken.promote();
2426             if (weakWindow == nullptr) {
2427                 WLOGFE("window is nullptr");
2428                 task.Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
2429                 return;
2430             }
2431             if (errCode != WMError::WM_OK) {
2432                 task.Reject(env, JsErrUtils::CreateJsError(env, errCode));
2433                 WLOGFE("get invalid param");
2434                 return;
2435             }
2436             WMError ret = weakWindow->SetWindowType(winType);
2437             if (ret == WMError::WM_OK) {
2438                 task.Resolve(env, NapiGetUndefined(env));
2439             } else {
2440                 task.Reject(env, JsErrUtils::CreateJsError(env, ret, "Window set type failed"));
2441             }
2442             WLOGI("%{public}s end, window [%{public}u, %{public}s] ret=%{public}d",
2443                 where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), ret);
2444         };
2445     napi_value lastParam = (argc <= 1) ? nullptr :
2446         (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
2447     napi_value result = nullptr;
2448     NapiAsyncTask::Schedule("JsWindow::OnSetWindowType",
2449         env, CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result));
2450     return result;
2451 }
2452 
2453 /** @note @window.layout */
OnSetWindowMode(napi_env env,napi_callback_info info)2454 napi_value JsWindow::OnSetWindowMode(napi_env env, napi_callback_info info)
2455 {
2456     if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
2457         TLOGE(WmsLogTag::WMS_LAYOUT, "permission denied!");
2458         return NapiThrowError(env, WmErrorCode::WM_ERROR_NOT_SYSTEM_APP);
2459     }
2460     WmErrorCode errCode = WmErrorCode::WM_OK;
2461     size_t argc = 4;
2462     napi_value argv[4] = {nullptr};
2463     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2464     if (argc < 1) {
2465         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
2466     }
2467     WindowMode winMode = WindowMode::WINDOW_MODE_FULLSCREEN;
2468     if (errCode == WmErrorCode::WM_OK) {
2469         napi_value nativeMode = argv[0];
2470         if (nativeMode == nullptr) {
2471             errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
2472         } else {
2473             uint32_t resultValue = 0;
2474             napi_get_value_uint32(env, nativeMode, &resultValue);
2475             if (resultValue >= static_cast<uint32_t>(WindowMode::WINDOW_MODE_SPLIT_PRIMARY)) {
2476                 winMode = static_cast<WindowMode>(resultValue);
2477             } else if (resultValue >= static_cast<uint32_t>(ApiWindowMode::UNDEFINED) &&
2478                 resultValue <= static_cast<uint32_t>(ApiWindowMode::MODE_END)) {
2479                 winMode = JS_TO_NATIVE_WINDOW_MODE_MAP.at(
2480                     static_cast<ApiWindowMode>(resultValue));
2481             } else {
2482                 errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
2483             }
2484         }
2485     }
2486     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
2487         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2488     }
2489     napi_value lastParam = (argc == 1) ? nullptr :
2490         ((argv[1] != nullptr && GetType(env, argv[1]) == napi_function) ? argv[1] : nullptr);
2491     napi_value result = nullptr;
2492     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
2493     auto asyncTask = [windowToken = wptr<Window>(windowToken_), winMode,
2494                       env, task = napiAsyncTask, where = __func__] {
2495         auto window = windowToken.promote();
2496         if (window == nullptr) {
2497             TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s: window is nullptr", where);
2498             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
2499             return;
2500         }
2501         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->SetWindowMode(winMode));
2502         if (ret == WmErrorCode::WM_OK) {
2503             task->Resolve(env, NapiGetUndefined(env));
2504         } else {
2505             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window set mode failed"));
2506         }
2507         TLOGNI(WmsLogTag::WMS_LAYOUT, "%{public}s: end, window [%{public}u, %{public}s] ret=%{public}d",
2508                where, window->GetWindowId(), window->GetWindowName().c_str(), ret);
2509     };
2510     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetWindowMode") != napi_status::napi_ok) {
2511         napiAsyncTask->Reject(env,
2512             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
2513     }
2514     return result;
2515 }
2516 
OnGetProperties(napi_env env,napi_callback_info info)2517 napi_value JsWindow::OnGetProperties(napi_env env, napi_callback_info info)
2518 {
2519     WMError errCode = WMError::WM_OK;
2520     size_t argc = 4;
2521     napi_value argv[4] = {nullptr};
2522     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2523     if (argc > 1) {
2524         WLOGFE("Argc is invalid: %{public}zu", argc);
2525         errCode = WMError::WM_ERROR_INVALID_PARAM;
2526     }
2527     napi_value lastParam = (argc == 0) ? nullptr : (GetType(env, argv[0]) == napi_function ? argv[0] : nullptr);
2528     napi_value result = nullptr;
2529     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
2530     auto asyncTask = [weakToken = wptr<Window>(windowToken_), errCode, env, task = napiAsyncTask] {
2531         auto window = weakToken.promote();
2532         if (window == nullptr) {
2533             WLOGFE("window is nullptr");
2534             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
2535             return;
2536         }
2537         if (errCode != WMError::WM_OK) {
2538             task->Reject(env, JsErrUtils::CreateJsError(env, errCode));
2539             WLOGFE("window is nullptr or get invalid param");
2540             return;
2541         }
2542         WindowPropertyInfo windowPropertyInfo;
2543         WMError ret = window->GetWindowPropertyInfo(windowPropertyInfo);
2544         if (ret != WMError::WM_OK) {
2545             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
2546             return;
2547         }
2548         auto objValue = CreateJsWindowPropertiesObject(env, windowPropertyInfo);
2549         if (objValue != nullptr) {
2550             task->Resolve(env, objValue);
2551         } else {
2552             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR,
2553                 "Window get properties failed"));
2554         }
2555         WLOGFD("Window [%{public}u, %{public}s] get properties end",
2556             window->GetWindowId(), window->GetWindowName().c_str());
2557     };
2558     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnGetProperties") != napi_status::napi_ok) {
2559         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
2560         napiAsyncTask->Reject(env,
2561             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
2562     }
2563     return result;
2564 }
2565 
OnGetWindowPropertiesSync(napi_env env,napi_callback_info info)2566 napi_value JsWindow::OnGetWindowPropertiesSync(napi_env env, napi_callback_info info)
2567 {
2568     if (windowToken_ == nullptr) {
2569         WLOGFW("window is nullptr or get invalid param");
2570         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
2571     }
2572     WindowPropertyInfo windowPropertyInfo;
2573     WMError ret = windowToken_->GetWindowPropertyInfo(windowPropertyInfo);
2574     if (ret != WMError::WM_OK) {
2575         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "get window properties failed");
2576         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
2577     }
2578     auto objValue = CreateJsWindowPropertiesObject(env, windowPropertyInfo);
2579     TLOGNI(WmsLogTag::WMS_ATTRIBUTE, "Get Prop, wid: %{public}u", windowToken_->GetWindowId());
2580     if (objValue != nullptr) {
2581         return objValue;
2582     } else {
2583         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
2584     }
2585 }
2586 
NapiIsCallable(napi_env env,napi_value value)2587 bool NapiIsCallable(napi_env env, napi_value value)
2588 {
2589     bool result = false;
2590     napi_is_callable(env, value, &result);
2591     return result;
2592 }
2593 
OnRegisterWindowCallback(napi_env env,napi_callback_info info)2594 napi_value JsWindow::OnRegisterWindowCallback(napi_env env, napi_callback_info info)
2595 {
2596     if (windowToken_ == nullptr) {
2597         WLOGFE("Window is nullptr");
2598         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
2599     }
2600     sptr<Window> windowToken = windowToken_;
2601     constexpr size_t argcMin = 2;
2602     constexpr size_t argcMax = 3;
2603     size_t argc = 4;
2604     napi_value argv[4] = {nullptr};
2605     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2606     if (argc < argcMin || argc > argcMax) {
2607         WLOGFE("Argc is invalid: %{public}zu", argc);
2608         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2609     }
2610     std::string cbType;
2611     if (!ConvertFromJsValue(env, argv[0], cbType)) {
2612         WLOGFE("Failed to convert parameter to callbackType");
2613         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2614     }
2615     size_t cbIndex = argc - 1;
2616     napi_value callback = argv[cbIndex];
2617     if (!NapiIsCallable(env, callback)) {
2618         WLOGI("Callback(info->argv[%{public}zu]) is not callable", cbIndex);
2619         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2620     }
2621 
2622     napi_value parameter = nullptr;
2623     if (argc > argcMin) {
2624         parameter = argv[cbIndex - 1];
2625     }
2626 
2627     WmErrorCode ret = registerManager_->RegisterListener(windowToken, cbType, CaseType::CASE_WINDOW,
2628         env, callback, parameter);
2629     if (ret != WmErrorCode::WM_OK) {
2630         return NapiThrowError(env, ret);
2631     }
2632     TLOGI(WmsLogTag::DEFAULT, "Id=%{public}u, type=%{public}s", windowToken->GetWindowId(), cbType.c_str());
2633     // if comptible mode app adpt to immersive, avoid area change will be called when regist
2634     if (cbType == AVOID_AREA_CHANGE_CB && windowToken->IsAdaptToCompatibleImmersive()) {
2635         TLOGI(WmsLogTag::WMS_COMPAT, "notify avoid area change for compatible mode app when regist callback");
2636         windowToken->HookCompatibleModeAvoidAreaNotify();
2637     }
2638     return NapiGetUndefined(env);
2639 }
2640 
OnUnregisterWindowCallback(napi_env env,napi_callback_info info)2641 napi_value JsWindow::OnUnregisterWindowCallback(napi_env env, napi_callback_info info)
2642 {
2643     if (windowToken_ == nullptr) {
2644         WLOGFE("Window is nullptr");
2645         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
2646     }
2647     size_t argc = 4;
2648     napi_value argv[4] = {nullptr};
2649     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2650     if (argc < 1) { // 2: maximum params nums
2651         WLOGFE("Argc is invalid: %{public}zu", argc);
2652         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2653     }
2654     std::string cbType;
2655     if (!ConvertFromJsValue(env, argv[0], cbType)) {
2656         WLOGFE("Failed to convert parameter to callbackType");
2657         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2658     }
2659 
2660     napi_value value = nullptr;
2661     WmErrorCode ret = WmErrorCode::WM_OK;
2662     if (argc == 1) {
2663         ret = registerManager_->UnregisterListener(windowToken_, cbType, CaseType::CASE_WINDOW, env, value);
2664     } else {
2665         value = argv[1];
2666         if (value == nullptr || !NapiIsCallable(env, value)) {
2667             ret = registerManager_->UnregisterListener(windowToken_, cbType, CaseType::CASE_WINDOW, env, nullptr);
2668         } else {
2669             ret = registerManager_->UnregisterListener(windowToken_, cbType, CaseType::CASE_WINDOW, env, value);
2670         }
2671     }
2672 
2673     if (ret != WmErrorCode::WM_OK) {
2674         return NapiThrowError(env, ret);
2675     }
2676     WLOGFI("Unregister end, window [%{public}u, %{public}s], type=%{public}s",
2677         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), cbType.c_str());
2678     return NapiGetUndefined(env);
2679 }
2680 
GetBindDialogToken(napi_env env,napi_value argv0)2681 static sptr<IRemoteObject> GetBindDialogToken(napi_env env, napi_value argv0)
2682 {
2683     sptr<IRemoteObject> token = NAPI_ohos_rpc_getNativeRemoteObject(env, argv0);
2684     if (token != nullptr) {
2685         return token;
2686     }
2687     std::shared_ptr<AbilityRuntime::RequestInfo> requestInfo =
2688         AbilityRuntime::RequestInfo::UnwrapRequestInfo(env, argv0);
2689     return (requestInfo != nullptr) ? requestInfo->GetToken() : nullptr;
2690 }
2691 
OnBindDialogTarget(napi_env env,napi_callback_info info)2692 napi_value JsWindow::OnBindDialogTarget(napi_env env, napi_callback_info info)
2693 {
2694     if (windowToken_ == nullptr) {
2695         TLOGE(WmsLogTag::WMS_DIALOG, "window is nullptr!");
2696         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
2697     }
2698     if (!Permission::IsSystemCalling()) {
2699         TLOGE(WmsLogTag::WMS_DIALOG, "permission denied, require system application!");
2700         return NapiThrowError(env, WmErrorCode::WM_ERROR_NOT_SYSTEM_APP);
2701     }
2702 
2703     size_t argc = 4;
2704     napi_value argv[4] = {nullptr};
2705     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2706 
2707     if (argc < 2) { // at least 2 params
2708         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2709     }
2710     sptr<IRemoteObject> token = GetBindDialogToken(env, argv[0]);
2711     if (token == nullptr) {
2712         TLOGE(WmsLogTag::WMS_DIALOG, "token is null!");
2713         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2714     }
2715     napi_value value = argv[1];
2716     if (value == nullptr || !NapiIsCallable(env, value)) {
2717         registerManager_->RegisterListener(windowToken_,
2718             "dialogDeathRecipient", CaseType::CASE_WINDOW, env, nullptr);
2719     } else {
2720         registerManager_->RegisterListener(windowToken_, "dialogDeathRecipient", CaseType::CASE_WINDOW, env, value);
2721     }
2722 
2723     napi_value result = nullptr;
2724     const int lastParamIdx = 2;
2725     napi_value lastParam = (argc == lastParamIdx) ? nullptr :
2726         (GetType(env, argv[lastParamIdx]) == napi_function ? argv[lastParamIdx] : nullptr);
2727     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
2728     wptr<Window> weakToken(windowToken_);
2729     auto asyncTask = [weakToken, env, task = napiAsyncTask, token]() {
2730         auto weakWindow = weakToken.promote();
2731         if (weakWindow == nullptr) {
2732             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
2733             return;
2734         }
2735         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(weakWindow->BindDialogTarget(token));
2736         if (ret == WmErrorCode::WM_OK) {
2737             task->Resolve(env, NapiGetUndefined(env));
2738         } else {
2739             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Bind Dialog Target failed"));
2740         }
2741 
2742         TLOGI(WmsLogTag::WMS_SYSTEM, "BindDialogTarget end, window [%{public}u, %{public}s]",
2743             weakToken->GetWindowId(), weakToken->GetWindowName().c_str());
2744     };
2745     if (napi_send_event(env, asyncTask, napi_eprio_immediate, "OnBindDialogTarget") != napi_status::napi_ok) {
2746         napiAsyncTask->Reject(env, CreateJsError(env,
2747             static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
2748     }
2749     return result;
2750 }
2751 
OnSetDialogBackGestureEnabled(napi_env env,napi_callback_info info)2752 napi_value JsWindow::OnSetDialogBackGestureEnabled(napi_env env, napi_callback_info info)
2753 {
2754     size_t argc = 4;
2755     napi_value argv[4] = {nullptr};
2756     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2757     if (argc < 1) { // at least 1 params
2758         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2759     }
2760 
2761     napi_value nativeVal = argv[0];
2762     if (nativeVal == nullptr) {
2763         TLOGE(WmsLogTag::WMS_DIALOG, "Failed to convert parameter to enable");
2764         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2765     }
2766     bool isEnabled = false;
2767     napi_status retCode = napi_get_value_bool(env, nativeVal, &isEnabled);
2768     if (retCode != napi_ok) {
2769         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2770     }
2771 
2772     wptr<Window> weakToken(windowToken_);
2773     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
2774     NapiAsyncTask::ExecuteCallback execute = [weakToken, isEnabled, errCodePtr] {
2775         if (errCodePtr == nullptr) {
2776             return;
2777         }
2778         auto window = weakToken.promote();
2779         if (window == nullptr) {
2780             *errCodePtr = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
2781             return;
2782         }
2783         *errCodePtr = WM_JS_TO_ERROR_CODE_MAP.at(window->SetDialogBackGestureEnabled(isEnabled));
2784         TLOGI(WmsLogTag::WMS_DIALOG, "Window [%{public}u, %{public}s] set dialog window end",
2785             window->GetWindowId(), window->GetWindowName().c_str());
2786     };
2787     NapiAsyncTask::CompleteCallback complete =
2788         [weakToken, errCodePtr](napi_env env, NapiAsyncTask& task, int32_t status) {
2789             if (errCodePtr == nullptr) {
2790                 task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
2791                 return;
2792             }
2793             if (*errCodePtr == WmErrorCode::WM_OK) {
2794                 task.Resolve(env, NapiGetUndefined(env));
2795             } else {
2796                 task.Reject(env, JsErrUtils::CreateJsError(env, *errCodePtr, "Set dialog window failed"));
2797             }
2798         };
2799     napi_value result = nullptr;
2800     NapiAsyncTask::Schedule("JsWindow::OnSetTopmost",
2801         env, CreateAsyncTaskWithLastParam(env, nullptr, std::move(execute), std::move(complete), &result));
2802     return result;
2803 }
2804 
LoadContentTask(std::shared_ptr<NativeReference> contentStorage,std::string contextUrl,sptr<Window> weakWindow,napi_env env,NapiAsyncTask & task,bool isLoadedByName)2805 static void LoadContentTask(std::shared_ptr<NativeReference> contentStorage, std::string contextUrl,
2806     sptr<Window> weakWindow, napi_env env, NapiAsyncTask& task, bool isLoadedByName)
2807 {
2808     napi_value nativeStorage =  (contentStorage == nullptr) ? nullptr : contentStorage->GetNapiValue();
2809     AppExecFwk::Ability* ability = nullptr;
2810     GetAPI7Ability(env, ability);
2811     WmErrorCode ret;
2812     if (isLoadedByName) {
2813         ret = WM_JS_TO_ERROR_CODE_MAP.at(weakWindow->SetUIContentByName(contextUrl, env, nativeStorage, ability));
2814     } else {
2815         ret = WM_JS_TO_ERROR_CODE_MAP.at(
2816             weakWindow->NapiSetUIContent(contextUrl, env, nativeStorage, BackupAndRestoreType::NONE, nullptr, ability));
2817     }
2818     if (ret == WmErrorCode::WM_OK) {
2819         task.Resolve(env, NapiGetUndefined(env));
2820     } else {
2821         task.Reject(env, JsErrUtils::CreateJsError(env, ret, "Window load content failed"));
2822     }
2823     WLOGFI("end, window [%{public}u, %{public}s] ret=%{public}d",
2824         weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), ret);
2825     return;
2826 }
2827 
LoadContentScheduleOld(napi_env env,napi_callback_info info,bool isLoadedByName)2828 napi_value JsWindow::LoadContentScheduleOld(napi_env env, napi_callback_info info, bool isLoadedByName)
2829 {
2830     WMError errCode = WMError::WM_OK;
2831     size_t argc = 4;
2832     napi_value argv[4] = {nullptr};
2833     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2834     if (argc < 1 || argc > 2) { // 2 maximum param num
2835         TLOGE(WmsLogTag::WMS_LIFE, "Argc is invalid: %{public}zu", argc);
2836         errCode = WMError::WM_ERROR_INVALID_PARAM;
2837     }
2838     std::string contextUrl;
2839     if (errCode == WMError::WM_OK && !ConvertFromJsValue(env, argv[0], contextUrl)) {
2840         TLOGE(WmsLogTag::WMS_LIFE, "Failed to convert parameter to context url");
2841         errCode = WMError::WM_ERROR_INVALID_PARAM;
2842     }
2843     napi_value callBack = nullptr;
2844     if (argc == 2) { // 2 param num
2845         callBack = argv[1];
2846     }
2847     std::shared_ptr<NativeReference> contentStorage = nullptr;
2848     wptr<Window> weakToken(windowToken_);
2849     napi_value result = nullptr;
2850     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, callBack, &result);
2851     auto asyncTask = [weakToken, contentStorage, contextUrl, errCode, isLoadedByName, env, task = napiAsyncTask] {
2852         auto weakWindow = weakToken.promote();
2853         if (weakWindow == nullptr) {
2854             TLOGNE(WmsLogTag::WMS_LIFE, "window is nullptr");
2855             task->Reject(env, JsErrUtils::CreateJsError(env, WM_JS_TO_ERROR_CODE_MAP.at(WMError::WM_ERROR_NULLPTR)));
2856             return;
2857         }
2858         if (errCode != WMError::WM_OK) {
2859             task->Reject(env, JsErrUtils::CreateJsError(env, errCode));
2860             TLOGNE(WmsLogTag::WMS_LIFE, "Window is nullptr or get invalid param");
2861             return;
2862         }
2863         LoadContentTask(contentStorage, contextUrl, weakWindow, env, *task, isLoadedByName);
2864     };
2865     if (napi_send_event(env, asyncTask, napi_eprio_high, "LoadContentScheduleOld") != napi_status::napi_ok) {
2866         TLOGE(WmsLogTag::WMS_LIFE, "napi send event failed, window state is abnormal");
2867     }
2868     return result;
2869 }
2870 
LoadContentScheduleNew(napi_env env,napi_callback_info info,bool isLoadedByName)2871 napi_value JsWindow::LoadContentScheduleNew(napi_env env, napi_callback_info info, bool isLoadedByName)
2872 {
2873     WmErrorCode errCode = WmErrorCode::WM_OK;
2874     size_t argc = 4;
2875     napi_value argv[4] = {nullptr};
2876     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2877     if (argc < 2) { // 2 param num
2878         TLOGE(WmsLogTag::WMS_LIFE, "Argc is invalid: %{public}zu", argc);
2879         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
2880     }
2881     std::string contextUrl;
2882     if (errCode == WmErrorCode::WM_OK && !ConvertFromJsValue(env, argv[0], contextUrl)) {
2883         TLOGE(WmsLogTag::WMS_LIFE, "Failed to convert parameter to context url");
2884         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
2885     }
2886     napi_value storage = nullptr;
2887     napi_value callBack = nullptr;
2888     if (argc == 2) { // 2: num of params
2889         storage = argv[1];
2890     } else if (argc >= 3) { // 3: num of params
2891         storage = argv[1];
2892         callBack = ((argv[2] != nullptr && GetType(env, argv[2]) == napi_function) ? // 2 param num
2893             argv[2] : nullptr); // 2 param num
2894     }
2895     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
2896         TLOGE(WmsLogTag::WMS_LIFE, "Window is nullptr or get invalid param");
2897         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2898     }
2899     std::shared_ptr<NativeReference> contentStorage = nullptr;
2900     if (storage != nullptr) {
2901         napi_ref result = nullptr;
2902         napi_create_reference(env, storage, 1, &result);
2903         contentStorage = std::shared_ptr<NativeReference>(reinterpret_cast<NativeReference*>(result));
2904     }
2905     wptr<Window> weakToken(windowToken_);
2906     napi_value result = nullptr;
2907     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, callBack, &result);
2908     auto asyncTask = [weakToken, contentStorage, contextUrl, isLoadedByName, env, task = napiAsyncTask] {
2909         auto weakWindow = weakToken.promote();
2910         if (weakWindow == nullptr) {
2911             TLOGNE(WmsLogTag::WMS_LIFE, "Window is nullptr or get invalid param");
2912             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
2913             return;
2914         }
2915         LoadContentTask(contentStorage, contextUrl, weakWindow, env, *task, isLoadedByName);
2916     };
2917     if (napi_send_event(env, asyncTask, napi_eprio_high, "LoadContentScheduleNew") != napi_status::napi_ok) {
2918         TLOGE(WmsLogTag::WMS_LIFE, "napi send event failed, window state is abnormal");
2919     }
2920     return result;
2921 }
2922 
OnLoadContent(napi_env env,napi_callback_info info,bool isLoadedByName)2923 napi_value JsWindow::OnLoadContent(napi_env env, napi_callback_info info, bool isLoadedByName)
2924 {
2925     bool oldApi = false;
2926     size_t argc = 4;
2927     napi_value argv[4] = {nullptr};
2928     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2929     if (argc == 1) {
2930         oldApi = true;
2931     } else if (argc == 2) { // 2 param num
2932         napi_value value = argv[1];
2933         if (value== nullptr || GetType(env, value) != napi_function) {
2934             oldApi = false;
2935         } else {
2936             oldApi = true;
2937         }
2938     }
2939     if (oldApi) {
2940         return LoadContentScheduleOld(env, info, isLoadedByName);
2941     } else {
2942         return LoadContentScheduleNew(env, info, isLoadedByName);
2943     }
2944 }
2945 
OnGetUIContext(napi_env env,napi_callback_info info)2946 napi_value JsWindow::OnGetUIContext(napi_env env, napi_callback_info info)
2947 {
2948     size_t argc = 4;
2949     napi_value argv[4] = {nullptr};
2950     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2951     if (argc >= 1) {
2952         WLOGFE("Argc is invalid: %{public}zu, expect zero params", argc);
2953         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2954     }
2955 
2956     if (windowToken_ == nullptr) {
2957         WLOGFE("window is nullptr");
2958         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
2959     }
2960 
2961     auto uicontent = windowToken_->GetUIContent();
2962     if (uicontent == nullptr) {
2963         WLOGFW("uicontent is nullptr");
2964         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
2965     }
2966 
2967     napi_value uiContext = uicontent->GetUINapiContext();
2968     if (uiContext == nullptr) {
2969         WLOGFE("uiContext obtained from jsEngine is nullptr");
2970         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
2971     } else {
2972         return uiContext;
2973     }
2974 }
2975 
OnSetUIContent(napi_env env,napi_callback_info info)2976 napi_value JsWindow::OnSetUIContent(napi_env env, napi_callback_info info)
2977 {
2978     WmErrorCode errCode = WmErrorCode::WM_OK;
2979     size_t argc = 4;
2980     napi_value argv[4] = {nullptr};
2981     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
2982     if (argc < 1) { // 2 maximum param num
2983         TLOGE(WmsLogTag::WMS_LIFE, "Argc is invalid: %{public}zu", argc);
2984         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
2985     }
2986     std::string contextUrl;
2987     if (errCode == WmErrorCode::WM_OK && !ConvertFromJsValue(env, argv[0], contextUrl)) {
2988         TLOGE(WmsLogTag::WMS_LIFE, "Failed to convert parameter to context url");
2989         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
2990     }
2991     napi_value callBack = nullptr;
2992     if (argc >= 2) { // 2 param num
2993         callBack = argv[1];
2994     }
2995     std::shared_ptr<NativeReference> contentStorage = nullptr;
2996     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
2997         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
2998     }
2999 
3000     wptr<Window> weakToken(windowToken_);
3001     napi_value result = nullptr;
3002     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, callBack, &result);
3003     auto asyncTask = [weakToken, contentStorage, contextUrl, env, task = napiAsyncTask] {
3004         auto weakWindow = weakToken.promote();
3005         if (weakWindow == nullptr) {
3006             TLOGNE(WmsLogTag::WMS_LIFE, "Window is nullptr");
3007             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
3008             return;
3009         }
3010         LoadContentTask(contentStorage, contextUrl, weakWindow, env, *task, false);
3011     };
3012     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetUIContent") != napi_status::napi_ok) {
3013         TLOGE(WmsLogTag::WMS_LIFE, "napi send event failed, window state is abnormal");
3014     }
3015     return result;
3016 }
3017 
OnSetFullScreen(napi_env env,napi_callback_info info)3018 napi_value JsWindow::OnSetFullScreen(napi_env env, napi_callback_info info)
3019 {
3020     WMError errCode = WMError::WM_OK;
3021     size_t argc = 4;
3022     napi_value argv[4] = {nullptr};
3023     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3024     if (argc < 1 || argc > 2) { // 2: maximum params num
3025         TLOGE(WmsLogTag::WMS_IMMS, "Argc is invalid %{public}zu", argc);
3026         errCode = WMError::WM_ERROR_INVALID_PARAM;
3027     }
3028     bool isFullScreen = false;
3029     if (errCode == WMError::WM_OK) {
3030         napi_value nativeVal = argv[0];
3031         if (nativeVal == nullptr) {
3032             TLOGE(WmsLogTag::WMS_IMMS, "Failed to convert parameter to isFullScreen");
3033             errCode = WMError::WM_ERROR_INVALID_PARAM;
3034         } else {
3035             CHECK_NAPI_RETCODE(errCode, WMError::WM_ERROR_INVALID_PARAM,
3036                 napi_get_value_bool(env, nativeVal, &isFullScreen));
3037         }
3038     }
3039 
3040     const char* const where = __func__;
3041 
3042     napi_value lastParam = (argc <= 1) ? nullptr : (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
3043     napi_value result = nullptr;
3044     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
3045     auto asyncTask = [weakToken = wptr<Window>(windowToken_), isFullScreen, errCode, where,
3046                       env, task = napiAsyncTask] {
3047         auto weakWindow = weakToken.promote();
3048         if (weakWindow == nullptr) {
3049             TLOGNE(WmsLogTag::WMS_IMMS, "window is nullptr");
3050             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
3051             return;
3052         }
3053         if (errCode != WMError::WM_OK) {
3054             task->Reject(env, JsErrUtils::CreateJsError(env, errCode, "Invalidate params."));
3055             return;
3056         }
3057         WMError ret = weakWindow->SetFullScreen(isFullScreen);
3058         if (ret == WMError::WM_OK) {
3059             task->Resolve(env, NapiGetUndefined(env));
3060         } else {
3061             TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s failed, ret %{public}d", where, ret);
3062             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window SetFullScreen failed."));
3063         }
3064     };
3065     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetFullScreen") != napi_status::napi_ok) {
3066         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
3067         napiAsyncTask->Reject(env,
3068             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
3069     }
3070     return result;
3071 }
3072 
OnSetLayoutFullScreen(napi_env env,napi_callback_info info)3073 napi_value JsWindow::OnSetLayoutFullScreen(napi_env env, napi_callback_info info)
3074 {
3075     WMError errCode = WMError::WM_OK;
3076     size_t argc = 4;
3077     napi_value argv[4] = {nullptr};
3078     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3079     if (argc < 1 || argc > 2) { // 2: maximum params num
3080         TLOGE(WmsLogTag::WMS_IMMS, "Argc is invalid %{public}zu", argc);
3081         errCode = WMError::WM_ERROR_INVALID_PARAM;
3082     }
3083     bool isLayoutFullScreen = false;
3084     if (errCode == WMError::WM_OK) {
3085         napi_value nativeVal = argv[0];
3086         if (nativeVal == nullptr) {
3087             TLOGE(WmsLogTag::WMS_IMMS, "Failed to convert parameter to isLayoutFullScreen");
3088             errCode = WMError::WM_ERROR_INVALID_PARAM;
3089         } else {
3090             CHECK_NAPI_RETCODE(errCode, WMError::WM_ERROR_INVALID_PARAM,
3091                 napi_get_value_bool(env, nativeVal, &isLayoutFullScreen));
3092         }
3093     }
3094     const char* const where = __func__;
3095     napi_value lastParam = (argc <= 1) ? nullptr : (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
3096     napi_value result = nullptr;
3097     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
3098     auto asyncTask = [weakToken = wptr<Window>(windowToken_), isLayoutFullScreen, errCode, where,
3099                       env, task = napiAsyncTask] {
3100         auto weakWindow = weakToken.promote();
3101         if (weakWindow == nullptr) {
3102             TLOGNE(WmsLogTag::WMS_IMMS, "window is nullptr");
3103             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
3104             return;
3105         }
3106         if (errCode != WMError::WM_OK) {
3107             task->Reject(env, JsErrUtils::CreateJsError(env, errCode, "Invalidate params."));
3108             return;
3109         }
3110         WMError ret = weakWindow->SetLayoutFullScreen(isLayoutFullScreen);
3111         if (ret == WMError::WM_OK) {
3112             task->Resolve(env, NapiGetUndefined(env));
3113         } else {
3114             TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s failed, ret %{public}d", where, ret);
3115             task->Reject(env, JsErrUtils::CreateJsError(env,
3116                 ret, "Window OnSetLayoutFullScreen failed."));
3117         }
3118     };
3119     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetLayoutFullScreen") != napi_status::napi_ok) {
3120         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
3121         napiAsyncTask->Reject(env,
3122             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
3123     }
3124     return result;
3125 }
3126 
OnSetTitleAndDockHoverShown(napi_env env,napi_callback_info info)3127 napi_value JsWindow::OnSetTitleAndDockHoverShown(napi_env env, napi_callback_info info)
3128 {
3129     size_t argc = FOUR_PARAMS_SIZE;
3130     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
3131     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3132     if (argc > 2) { // 2: maximum params num
3133         TLOGE(WmsLogTag::WMS_LAYOUT_PC, "Argc is invalid: %{public}zu", argc);
3134         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
3135     }
3136     bool isTitleHoverShown = true;
3137     if (argc > 0 && !ConvertFromJsValue(env, argv[INDEX_ZERO], isTitleHoverShown)) {
3138         TLOGE(WmsLogTag::WMS_LAYOUT_PC, "Failed to convert isTitleHoverShown parameter");
3139     }
3140     bool isDockHoverShown = true;
3141     if (argc > 1 && !ConvertFromJsValue(env, argv[INDEX_ONE], isDockHoverShown)) {
3142         TLOGE(WmsLogTag::WMS_LAYOUT_PC, "Failed to convert isDockHoverShown parameter");
3143     }
3144     napi_value result = nullptr;
3145     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
3146     const char* const where = __func__;
3147     auto asyncTask = [weakToken = wptr<Window>(windowToken_), isTitleHoverShown,
3148         isDockHoverShown, env, task = napiAsyncTask, where] {
3149         auto window = weakToken.promote();
3150         if (window == nullptr) {
3151             TLOGNE(WmsLogTag::WMS_LAYOUT_PC, "%{public}s window is nullptr", where);
3152             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
3153             return;
3154         }
3155         WMError errCode = window->SetTitleAndDockHoverShown(isTitleHoverShown, isDockHoverShown);
3156         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(errCode);
3157         if (ret != WmErrorCode::WM_OK) {
3158             TLOGNE(WmsLogTag::WMS_LAYOUT_PC, "%{public}s set title and dock hover show failed!", where);
3159             task->Reject(env, JsErrUtils::CreateJsError(env, ret,
3160                 "Window OnSetTitleAndDockHoverShown failed."));
3161             return;
3162         }
3163         task->Resolve(env, NapiGetUndefined(env));
3164         TLOGNI(WmsLogTag::WMS_LAYOUT_PC, "%{public}s window [%{public}u, %{public}s] [%{public}d, %{public}d]",
3165             where, window->GetWindowId(), window->GetWindowName().c_str(),
3166             isTitleHoverShown, isDockHoverShown);
3167     };
3168     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetTitleAndDockHoverShown") != napi_status::napi_ok) {
3169         napiAsyncTask->Reject(env, CreateJsError(env,
3170             static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
3171     }
3172     return result;
3173 }
3174 
OnSetWindowLayoutFullScreen(napi_env env,napi_callback_info info)3175 napi_value JsWindow::OnSetWindowLayoutFullScreen(napi_env env, napi_callback_info info)
3176 {
3177     WmErrorCode errCode = WmErrorCode::WM_OK;
3178     size_t argc = 4;
3179     napi_value argv[4] = {nullptr};
3180     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3181     if (argc < 1) { // 1: params num
3182         TLOGE(WmsLogTag::WMS_IMMS, "Argc is invalid %{public}zu", argc);
3183         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
3184     }
3185     bool isLayoutFullScreen = false;
3186     if (errCode == WmErrorCode::WM_OK) {
3187         napi_value nativeVal = argv[0];
3188         if (nativeVal == nullptr) {
3189             TLOGE(WmsLogTag::WMS_IMMS, "Failed to convert parameter to isLayoutFullScreen");
3190             errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
3191         } else {
3192             CHECK_NAPI_RETCODE(errCode, WmErrorCode::WM_ERROR_INVALID_PARAM,
3193                 napi_get_value_bool(env, nativeVal, &isLayoutFullScreen));
3194         }
3195     }
3196     if (errCode != WmErrorCode::WM_OK) {
3197         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
3198     }
3199     const char* const where = __func__;
3200     NapiAsyncTask::CompleteCallback complete =
3201         [weakToken = wptr<Window>(windowToken_), isLayoutFullScreen, where](napi_env env,
3202             NapiAsyncTask& task, int32_t status) {
3203             auto window = weakToken.promote();
3204             if (window == nullptr) {
3205                 TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s window is nullptr", where);
3206                 task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
3207                     "Invalidate params."));
3208                 return;
3209             }
3210             // compatibleMode app adapt to immersive need apply avoidArea method
3211             if (window->IsPcOrPadFreeMultiWindowMode() && !window->IsAdaptToCompatibleImmersive()) {
3212                 TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s device not support", where);
3213                 window->SetIgnoreSafeArea(isLayoutFullScreen);
3214                 task.Resolve(env, NapiGetUndefined(env));
3215                 return;
3216             }
3217             WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->SetLayoutFullScreen(isLayoutFullScreen));
3218             if (ret == WmErrorCode::WM_OK) {
3219                 task.Resolve(env, NapiGetUndefined(env));
3220             } else {
3221                 TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s failed, ret %{public}d", where, ret);
3222                 task.Reject(env, JsErrUtils::CreateJsError(env, ret, "Window OnSetLayoutFullScreen failed."));
3223             }
3224         };
3225 
3226     napi_value lastParam = (argc <= 1) ? nullptr :
3227         ((argv[1] != nullptr && GetType(env, argv[1]) == napi_function) ? argv[1] : nullptr);
3228     napi_value result = nullptr;
3229     auto asyncTask = CreateAsyncTask(env, lastParam, nullptr,
3230         std::make_unique<NapiAsyncTask::CompleteCallback>(std::move(complete)), &result);
3231     NapiAsyncTask::Schedule("JsWindow::OnSetWindowLayoutFullScreen", env, std::move(asyncTask));
3232     return result;
3233 }
3234 
OnSetSystemBarEnable(napi_env env,napi_callback_info info)3235 napi_value JsWindow::OnSetSystemBarEnable(napi_env env, napi_callback_info info)
3236 {
3237     size_t argc = FOUR_PARAMS_SIZE;
3238     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
3239     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3240     napi_value lastParam = nullptr;
3241     if (argc > ARG_COUNT_ZERO && argv[INDEX_ZERO] != nullptr && GetType(env, argv[INDEX_ZERO]) == napi_function) {
3242         lastParam = argv[INDEX_ZERO];
3243     } else if (argc > ARG_COUNT_ONE && argv[INDEX_ONE] != nullptr && GetType(env, argv[INDEX_ONE]) == napi_function) {
3244         lastParam = argv[INDEX_ONE];
3245     }
3246     napi_value result = nullptr;
3247     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
3248     std::unordered_map<WindowType, SystemBarProperty> systemBarProperties;
3249     std::unordered_map<WindowType, SystemBarPropertyFlag> systemBarPropertyFlags;
3250     if (argc > ARG_COUNT_TWO || !GetSystemBarStatus(env, info, systemBarProperties, systemBarPropertyFlags)) {
3251         TLOGE(WmsLogTag::WMS_IMMS, "failed to convert parameter to systemBarProperties");
3252         napiAsyncTask->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_INVALID_PARAM,
3253             "JsWindow::OnSetSystemBarEnable failed"));
3254         return result;
3255     }
3256     auto asyncTask = [weakToken = wptr<Window>(windowToken_), env, task = napiAsyncTask,
3257         systemBarProperties = std::move(systemBarProperties),
3258         systemBarPropertyFlags = std::move(systemBarPropertyFlags)] {
3259         auto window = weakToken.promote();
3260         if (window == nullptr) {
3261             TLOGNE(WmsLogTag::WMS_IMMS, "window is nullptr");
3262             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
3263             return;
3264         }
3265         auto errCode = window->UpdateSystemBarProperties(systemBarProperties, systemBarPropertyFlags);
3266         if (errCode == WMError::WM_OK) {
3267             task->Resolve(env, NapiGetUndefined(env));
3268         } else {
3269             TLOGNE(WmsLogTag::WMS_IMMS, "set system bar enable failed, errcode: %{public}d", errCode);
3270             task->Reject(env, JsErrUtils::CreateJsError(env, errCode, "JsWindow::OnSetSystemBarEnable failed"));
3271         }
3272     };
3273     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetSystemBarEnable") != napi_status::napi_ok) {
3274         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
3275     }
3276     return result;
3277 }
3278 
OnSetWindowSystemBarEnable(napi_env env,napi_callback_info info)3279 napi_value JsWindow::OnSetWindowSystemBarEnable(napi_env env, napi_callback_info info)
3280 {
3281     size_t argc = FOUR_PARAMS_SIZE;
3282     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
3283     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3284     std::unordered_map<WindowType, SystemBarProperty> systemBarProperties;
3285     std::unordered_map<WindowType, SystemBarPropertyFlag> systemBarPropertyFlags;
3286     if (argc < ARG_COUNT_ONE || !GetSystemBarStatus(env, info, systemBarProperties, systemBarPropertyFlags)) {
3287         TLOGE(WmsLogTag::WMS_IMMS, "failed to convert parameter to systemBarProperties");
3288         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
3289     }
3290     napi_value lastParam = nullptr;
3291     if (argc >= ARG_COUNT_ONE && argv[INDEX_ZERO] != nullptr && GetType(env, argv[INDEX_ZERO]) == napi_function) {
3292         lastParam = argv[INDEX_ZERO];
3293     } else if (argc >= ARG_COUNT_TWO && argv[INDEX_ONE] != nullptr && GetType(env, argv[INDEX_ONE]) == napi_function) {
3294         lastParam = argv[INDEX_ONE];
3295     }
3296     napi_value result = nullptr;
3297     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
3298     auto asyncTask = [weakToken = wptr<Window>(windowToken_), env, task = napiAsyncTask,
3299         systemBarProperties = std::move(systemBarProperties),
3300         systemBarPropertyFlags = std::move(systemBarPropertyFlags)] {
3301         auto window = weakToken.promote();
3302         if (window == nullptr) {
3303             TLOGNE(WmsLogTag::WMS_IMMS, "window is nullptr");
3304             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
3305             return;
3306         }
3307         auto errCode = WM_JS_TO_ERROR_CODE_MAP.at(
3308             window->UpdateSystemBarProperties(systemBarProperties, systemBarPropertyFlags));
3309         if (errCode == WmErrorCode::WM_OK) {
3310             task->Resolve(env, NapiGetUndefined(env));
3311         } else {
3312             TLOGNE(WmsLogTag::WMS_IMMS, "set system bar enable failed, errcode: %{public}d", errCode);
3313             task->Reject(env, JsErrUtils::CreateJsError(env, errCode, "JsWindow::OnSetWindowSystemBarEnable failed"));
3314         }
3315     };
3316     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetWindowSystemBarEnable") != napi_status::napi_ok) {
3317         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
3318         napiAsyncTask->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
3319             "JsWindow::OnSetWindowSystemBarEnable failed"));
3320     }
3321     return result;
3322 }
3323 
OnSetSpecificSystemBarEnabled(napi_env env,napi_callback_info info)3324 napi_value JsWindow::OnSetSpecificSystemBarEnabled(napi_env env, napi_callback_info info)
3325 {
3326     size_t argc = FOUR_PARAMS_SIZE;
3327     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
3328     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3329     std::string name;
3330     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], name) ||
3331         (name.compare("status") != 0 && name.compare("navigation") != 0 && name.compare("navigationIndicator") != 0)) {
3332         TLOGE(WmsLogTag::WMS_IMMS, "invalid systemBar name");
3333         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
3334     }
3335     auto systemBarType = name.compare("status") == 0 ? WindowType::WINDOW_TYPE_STATUS_BAR :
3336                     (name.compare("navigation") == 0 ? WindowType::WINDOW_TYPE_NAVIGATION_BAR :
3337                                                        WindowType::WINDOW_TYPE_NAVIGATION_INDICATOR);
3338     bool systemBarEnable = false;
3339     bool systemBarEnableAnimation = false;
3340     if (!GetSpecificBarStatus(env, info, systemBarEnable, systemBarEnableAnimation)) {
3341         TLOGE(WmsLogTag::WMS_IMMS, "invalid param or argc:%{public}zu", argc);
3342         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
3343     }
3344     napi_value result = nullptr;
3345     const char* const where = __func__;
3346     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
3347     auto asyncTask = [weakToken = wptr<Window>(windowToken_), env, task = napiAsyncTask,
3348         systemBarType, systemBarEnable, systemBarEnableAnimation, where] {
3349         auto window = weakToken.promote();
3350         if (window == nullptr) {
3351             TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s window is nullptr", where);
3352             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
3353             return;
3354         }
3355         auto property = window->GetSystemBarPropertyByType(systemBarType);
3356         window->UpdateSpecificSystemBarEnabled(systemBarEnable, systemBarEnableAnimation, property);
3357         auto errCode =
3358             WM_JS_TO_ERROR_CODE_MAP.at(window->SetSpecificBarProperty(systemBarType, property));
3359         if (errCode == WmErrorCode::WM_OK) {
3360             window->NotifySystemBarPropertyUpdate(systemBarType, property);
3361             task->Resolve(env, NapiGetUndefined(env));
3362         } else {
3363             TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s failed, ret %{public}d", where, errCode);
3364             task->Reject(env, JsErrUtils::CreateJsError(env, errCode,
3365                 "JsWindow::OnSetSpecificSystemBarEnabled failed"));
3366         }
3367     };
3368     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetSpecificSystemBarEnabled") != napi_status::napi_ok) {
3369         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
3370         napiAsyncTask->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
3371             "JsWindow::OnSetSpecificSystemBarEnabled failed"));
3372     }
3373     return result;
3374 }
3375 
OnSetSystemBarProperties(napi_env env,napi_callback_info info)3376 napi_value JsWindow::OnSetSystemBarProperties(napi_env env, napi_callback_info info)
3377 {
3378     size_t argc = FOUR_PARAMS_SIZE;
3379     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
3380     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3381     napi_value lastParam = (argc <= ARG_COUNT_ONE) ? nullptr :
3382         (GetType(env, argv[INDEX_ONE]) == napi_function ? argv[INDEX_ONE] : nullptr);
3383     napi_value result = nullptr;
3384     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
3385     std::unordered_map<WindowType, SystemBarProperty> systemBarProperties;
3386     std::unordered_map<WindowType, SystemBarPropertyFlag> systemBarPropertyFlags;
3387     if (argc < ARG_COUNT_ONE || argc > ARG_COUNT_TWO || argv[INDEX_ZERO] == nullptr ||
3388         !GetSystemBarPropertiesFromJs(env, argv[INDEX_ZERO], systemBarProperties, systemBarPropertyFlags)) {
3389         TLOGE(WmsLogTag::WMS_IMMS, "Failed to convert parameter to systemBarProperties");
3390         napiAsyncTask->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_INVALID_PARAM));
3391         return result;
3392     }
3393     auto asyncTask = [weakToken = wptr<Window>(windowToken_), env, task = napiAsyncTask,
3394         systemBarProperties = std::move(systemBarProperties),
3395         systemBarPropertyFlags = std::move(systemBarPropertyFlags)] {
3396         auto window = weakToken.promote();
3397         if (window == nullptr) {
3398             TLOGNE(WmsLogTag::WMS_IMMS, "window is nullptr");
3399             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
3400             return;
3401         }
3402         auto errCode = window->UpdateSystemBarProperties(systemBarProperties, systemBarPropertyFlags);
3403         if (errCode == WMError::WM_OK) {
3404             task->Resolve(env, NapiGetUndefined(env));
3405         } else {
3406             TLOGNE(WmsLogTag::WMS_IMMS, "set system bar properties failed, errcode: %{public}d", errCode);
3407             task->Reject(env, JsErrUtils::CreateJsError(env, errCode, "JsWindow::OnSetSystemBarProperties failed"));
3408         }
3409     };
3410     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetSystemBarProperties") != napi_status::napi_ok) {
3411         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
3412     }
3413     return result;
3414 }
3415 
OnSetWindowSystemBarProperties(napi_env env,napi_callback_info info)3416 napi_value JsWindow::OnSetWindowSystemBarProperties(napi_env env, napi_callback_info info)
3417 {
3418     size_t argc = FOUR_PARAMS_SIZE;
3419     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
3420     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3421     napi_value lastParam = (argc <= ARG_COUNT_ONE) ? nullptr :
3422         (GetType(env, argv[INDEX_ONE]) == napi_function ? argv[INDEX_ONE] : nullptr);
3423     napi_value result = nullptr;
3424     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
3425     std::unordered_map<WindowType, SystemBarProperty> systemBarProperties;
3426     std::unordered_map<WindowType, SystemBarPropertyFlag> systemBarPropertyFlags;
3427     if (argc < ARG_COUNT_ONE || argv[INDEX_ZERO] == nullptr ||
3428         !GetSystemBarPropertiesFromJs(env, argv[INDEX_ZERO], systemBarProperties, systemBarPropertyFlags)) {
3429         TLOGE(WmsLogTag::WMS_IMMS, "argc is invalid or failed to convert parameter");
3430         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
3431     }
3432     auto asyncTask = [weakToken = wptr<Window>(windowToken_), env, task = napiAsyncTask,
3433         systemBarProperties = std::move(systemBarProperties),
3434         systemBarPropertyFlags = std::move(systemBarPropertyFlags)] {
3435         auto window = weakToken.promote();
3436         if (window == nullptr) {
3437             TLOGNE(WmsLogTag::WMS_IMMS, "window is nullptr");
3438             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
3439             return;
3440         }
3441         auto errCode = WM_JS_TO_ERROR_CODE_MAP.at(
3442             window->UpdateSystemBarProperties(systemBarProperties, systemBarPropertyFlags));
3443         if (errCode == WmErrorCode::WM_OK) {
3444             task->Resolve(env, NapiGetUndefined(env));
3445         } else {
3446             TLOGNE(WmsLogTag::WMS_IMMS, "set system bar properties failed, errcode: %{public}d", errCode);
3447             task->Reject(env, JsErrUtils::CreateJsError(env, errCode,
3448                 "JsWindow::OnSetWindowSystemBarProperties failed"));
3449         }
3450     };
3451     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetWindowSystemBarProperties") != napi_status::napi_ok) {
3452         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
3453         napiAsyncTask->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
3454             "JsWindow::OnSetWindowSystemBarProperties failed"));
3455     }
3456     return result;
3457 }
3458 
OnGetWindowSystemBarPropertiesSync(napi_env env,napi_callback_info info)3459 napi_value JsWindow::OnGetWindowSystemBarPropertiesSync(napi_env env, napi_callback_info info)
3460 {
3461     if (windowToken_ == nullptr) {
3462         TLOGE(WmsLogTag::WMS_IMMS, "window is null");
3463         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
3464     }
3465     if (!WindowHelper::IsMainWindow(windowToken_->GetType())) {
3466         TLOGE(WmsLogTag::WMS_IMMS, "only main window is allowed");
3467         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
3468     }
3469     auto objValue = CreateJsSystemBarPropertiesObject(env, windowToken_);
3470     if (objValue == nullptr) {
3471         TLOGE(WmsLogTag::WMS_IMMS, "get properties failed");
3472         return NapiThrowError(env, WmErrorCode::WM_ERROR_SYSTEM_ABNORMALLY);
3473     }
3474     return objValue;
3475 }
3476 
OnSetStatusBarColor(napi_env env,napi_callback_info info)3477 napi_value JsWindow::OnSetStatusBarColor(napi_env env, napi_callback_info info)
3478 {
3479     size_t argc = FOUR_PARAMS_SIZE;
3480     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
3481     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3482     if (argc < ARG_COUNT_ONE || argv[INDEX_ZERO] == nullptr) {
3483         TLOGE(WmsLogTag::WMS_IMMS, "no enough arguments");
3484         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
3485     }
3486     uint32_t contentColor = 0;
3487     if (!ParseColorMetrics(env, argv[INDEX_ZERO], contentColor)) {
3488         TLOGE(WmsLogTag::WMS_IMMS, "parse color failed");
3489         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
3490     }
3491     napi_value result = nullptr;
3492     napi_value lastParam = (argc <= ARG_COUNT_ONE) ? nullptr :
3493         (GetType(env, argv[INDEX_ONE]) == napi_function ? argv[INDEX_ONE] : nullptr);
3494     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
3495     TLOGI(WmsLogTag::WMS_IMMS, "target color: %{public}u", contentColor);
3496     auto asyncTask = [weakToken = wptr<Window>(windowToken_), env, contentColor, task = napiAsyncTask] {
3497         auto window = weakToken.promote();
3498         if (window == nullptr) {
3499             TLOGNE(WmsLogTag::WMS_IMMS, "window is null");
3500             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
3501             return;
3502         }
3503         auto errCode = UpdateStatusBarProperty(window, contentColor);
3504         if (errCode == WMError::WM_OK) {
3505             task->Resolve(env, NapiGetUndefined(env));
3506         } else {
3507             TLOGNE(WmsLogTag::WMS_IMMS, "set status bar property error: %{public}d", errCode);
3508             task->Reject(env, JsErrUtils::CreateJsError(env, WM_JS_TO_ERROR_CODE_MAP.at(errCode),
3509                 "JsWindow::OnSetStatusBarProperty failed"));
3510         }
3511     };
3512     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetStatusBarColor") != napi_status::napi_ok) {
3513         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
3514         napiAsyncTask->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_SYSTEM_ABNORMALLY,
3515             "JsWindow::OnSetStatusBarProperty failed"));
3516     }
3517     return result;
3518 }
3519 
OnGetStatusBarPropertySync(napi_env env,napi_callback_info info)3520 napi_value JsWindow::OnGetStatusBarPropertySync(napi_env env, napi_callback_info info)
3521 {
3522     if (windowToken_ == nullptr) {
3523         TLOGE(WmsLogTag::WMS_IMMS, "window is null");
3524         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
3525     }
3526     if (!WindowHelper::IsMainWindow(windowToken_->GetType())) {
3527         TLOGE(WmsLogTag::WMS_IMMS, "only main window is allowed");
3528         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
3529     }
3530     auto objValue = GetStatusBarPropertyObject(env, windowToken_);
3531     if (objValue == nullptr) {
3532         TLOGE(WmsLogTag::WMS_IMMS, "get property failed");
3533         return NapiThrowError(env, WmErrorCode::WM_ERROR_SYSTEM_ABNORMALLY);
3534     }
3535     return objValue;
3536 }
3537 
OnEnableLandscapeMultiWindow(napi_env env,napi_callback_info info)3538 napi_value JsWindow::OnEnableLandscapeMultiWindow(napi_env env, napi_callback_info info)
3539 {
3540     TLOGI(WmsLogTag::WMS_MULTI_WINDOW, "In");
3541     WmErrorCode err = (windowToken_ == nullptr) ? WmErrorCode::WM_ERROR_STATE_ABNORMALLY : WmErrorCode::WM_OK;
3542     size_t argc = 4;
3543     napi_value argv[4] = {nullptr};
3544     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3545     napi_value result = nullptr;
3546     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
3547     auto asyncTask = [weakToken = wptr<Window>(windowToken_), env, task = napiAsyncTask, err]() mutable {
3548         auto weakWindow = weakToken.promote();
3549         err = (weakWindow == nullptr) ? WmErrorCode::WM_ERROR_STATE_ABNORMALLY : err;
3550         if (err != WmErrorCode::WM_OK) {
3551             task->Reject(env, JsErrUtils::CreateJsError(env, err));
3552             return;
3553         }
3554         WMError ret = weakWindow->SetLandscapeMultiWindow(true);
3555         if (ret == WMError::WM_OK) {
3556             task->Resolve(env, NapiGetUndefined(env));
3557         } else {
3558             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_SYSTEM_ABNORMALLY,
3559                 "JsWindow::OnEnableLandscapeMultiWindow failed"));
3560         }
3561     };
3562     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnEnableLandscapeMultiWindow") != napi_status::napi_ok) {
3563         napiAsyncTask->Reject(
3564             env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
3565     }
3566     return result;
3567 }
3568 
OnDisableLandscapeMultiWindow(napi_env env,napi_callback_info info)3569 napi_value JsWindow::OnDisableLandscapeMultiWindow(napi_env env, napi_callback_info info)
3570 {
3571     TLOGI(WmsLogTag::WMS_MULTI_WINDOW, "In");
3572     WmErrorCode err = (windowToken_ == nullptr) ? WmErrorCode::WM_ERROR_STATE_ABNORMALLY : WmErrorCode::WM_OK;
3573     size_t argc = 4;
3574     napi_value argv[4] = {nullptr};
3575     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3576 
3577     napi_value result = nullptr;
3578     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
3579     auto asyncTask = [weakToken = wptr<Window>(windowToken_), env, task = napiAsyncTask, err]() mutable {
3580         auto weakWindow = weakToken.promote();
3581         err = (weakWindow == nullptr) ? WmErrorCode::WM_ERROR_STATE_ABNORMALLY : err;
3582         if (err != WmErrorCode::WM_OK) {
3583             task->Reject(env, JsErrUtils::CreateJsError(env, err));
3584             return;
3585         }
3586         WMError ret = weakWindow->SetLandscapeMultiWindow(false);
3587         if (ret == WMError::WM_OK) {
3588             task->Resolve(env, NapiGetUndefined(env));
3589         } else {
3590             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_SYSTEM_ABNORMALLY,
3591                 "JsWindow::OnDisableLandscapeMultiWindow failed"));
3592         }
3593     };
3594     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnDisableLandscapeMultiWindow") != napi_status::napi_ok) {
3595         napiAsyncTask->Reject(
3596             env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
3597     }
3598     return result;
3599 }
3600 
ParseAvoidAreaParam(napi_env env,napi_callback_info info,WMError & errCode,AvoidAreaType & avoidAreaType)3601 static void ParseAvoidAreaParam(napi_env env, napi_callback_info info, WMError& errCode, AvoidAreaType& avoidAreaType)
3602 {
3603     size_t argc = 4;
3604     napi_value argv[4] = {nullptr};
3605     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3606     if (argc < 1 || argc > 2) { // 2: maximum params num
3607         TLOGE(WmsLogTag::WMS_IMMS, "Argc is invalid %{public}zu", argc);
3608         errCode = WMError::WM_ERROR_INVALID_PARAM;
3609     }
3610     if (errCode == WMError::WM_OK) {
3611         napi_value nativeMode = argv[0];
3612         if (nativeMode == nullptr) {
3613             TLOGE(WmsLogTag::WMS_IMMS, "Failed to convert parameter to AvoidAreaType");
3614             errCode = WMError::WM_ERROR_INVALID_PARAM;
3615         } else {
3616             uint32_t resultValue = 0;
3617             CHECK_NAPI_RETCODE(errCode, WMError::WM_ERROR_INVALID_PARAM,
3618                 napi_get_value_uint32(env, nativeMode, &resultValue));
3619             avoidAreaType = static_cast<AvoidAreaType>(resultValue);
3620             errCode = avoidAreaType > AvoidAreaType::TYPE_KEYBOARD ?
3621                 WMError::WM_ERROR_INVALID_PARAM : WMError::WM_OK;
3622         }
3623     }
3624 }
3625 
OnGetAvoidArea(napi_env env,napi_callback_info info)3626 napi_value JsWindow::OnGetAvoidArea(napi_env env, napi_callback_info info)
3627 {
3628     WMError errCode = WMError::WM_OK;
3629     AvoidAreaType avoidAreaType = AvoidAreaType::TYPE_SYSTEM;
3630     ParseAvoidAreaParam(env, info, errCode, avoidAreaType);
3631     const char* const where = __func__;
3632     size_t argc = 4;
3633     napi_value argv[4] = {nullptr};
3634     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3635     napi_value lastParam = (argc <= 1) ? nullptr :
3636         (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
3637     napi_value result = nullptr;
3638     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
3639     auto asyncTask = [weakToken = wptr<Window>(windowToken_), errCode, avoidAreaType, where,
3640                       env, task = napiAsyncTask] {
3641         auto weakWindow = weakToken.promote();
3642         if (weakWindow == nullptr) {
3643             TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s window is nullptr", where);
3644             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
3645             return;
3646         }
3647         if (errCode != WMError::WM_OK) {
3648             task->Reject(env, JsErrUtils::CreateJsError(env, errCode));
3649             TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s window is nullptr or get invalid param", where);
3650             return;
3651         }
3652         // getAvoidRect by avoidAreaType
3653         AvoidArea avoidArea;
3654         WMError ret = weakWindow->GetAvoidAreaByType(avoidAreaType, avoidArea);
3655         if (ret != WMError::WM_OK) {
3656             TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s failed, ret %{public}d", where, ret);
3657             avoidArea.topRect_ = g_emptyRect;
3658             avoidArea.leftRect_ = g_emptyRect;
3659             avoidArea.rightRect_ = g_emptyRect;
3660             avoidArea.bottomRect_ = g_emptyRect;
3661         }
3662         napi_value avoidAreaObj = ConvertAvoidAreaToJsValue(env, avoidArea, avoidAreaType);
3663         if (avoidAreaObj != nullptr) {
3664             task->Resolve(env, avoidAreaObj);
3665         } else {
3666             TLOGNE(WmsLogTag::WMS_IMMS, "ConvertAvoidAreaToJsValue failed");
3667             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR,
3668                 "JsWindow::OnGetAvoidArea failed"));
3669         }
3670     };
3671     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnGetAvoidArea") != napi_status::napi_ok) {
3672         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
3673         napiAsyncTask->Reject(env,
3674             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
3675     }
3676     return result;
3677 }
3678 
OnGetWindowAvoidAreaSync(napi_env env,napi_callback_info info)3679 napi_value JsWindow::OnGetWindowAvoidAreaSync(napi_env env, napi_callback_info info)
3680 {
3681     WmErrorCode errCode = WmErrorCode::WM_OK;
3682     size_t argc = 4;
3683     napi_value argv[4] = {nullptr};
3684     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3685     if (argc < 1) { // 1: params num
3686         TLOGE(WmsLogTag::WMS_IMMS, "invalid argc %{public}zu", argc);
3687         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
3688     }
3689     AvoidAreaType avoidAreaType = AvoidAreaType::TYPE_SYSTEM;
3690     napi_value nativeMode = argv[0];
3691     if (nativeMode == nullptr) {
3692         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
3693     } else {
3694         uint32_t resultValue = 0;
3695         CHECK_NAPI_RETCODE(errCode, WmErrorCode::WM_ERROR_INVALID_PARAM,
3696             napi_get_value_uint32(env, nativeMode, &resultValue));
3697         avoidAreaType = static_cast<AvoidAreaType>(resultValue);
3698         errCode = avoidAreaType >= AvoidAreaType::TYPE_END ?
3699             WmErrorCode::WM_ERROR_INVALID_PARAM : WmErrorCode::WM_OK;
3700     }
3701     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
3702         TLOGE(WmsLogTag::WMS_IMMS, "invalid param");
3703         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
3704     }
3705 
3706     if (windowToken_ == nullptr) {
3707         TLOGE(WmsLogTag::WMS_IMMS, "window is nullptr");
3708         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
3709     }
3710     // getAvoidRect by avoidAreaType
3711     AvoidArea avoidArea;
3712     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->GetAvoidAreaByType(avoidAreaType, avoidArea));
3713     if (ret != WmErrorCode::WM_OK) {
3714         TLOGE(WmsLogTag::WMS_IMMS, "GetWindowAvoidAreaSync failed, ret %{public}d", ret);
3715         avoidArea.topRect_ = g_emptyRect;
3716         avoidArea.leftRect_ = g_emptyRect;
3717         avoidArea.rightRect_ = g_emptyRect;
3718         avoidArea.bottomRect_ = g_emptyRect;
3719     }
3720     napi_value avoidAreaObj = ConvertAvoidAreaToJsValue(env, avoidArea, avoidAreaType);
3721     if (avoidAreaObj != nullptr) {
3722         return avoidAreaObj;
3723     } else {
3724         TLOGE(WmsLogTag::WMS_IMMS, "ConvertAvoidAreaToJsValue failed");
3725         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
3726     }
3727 }
3728 
OnIsShowing(napi_env env,napi_callback_info info)3729 napi_value JsWindow::OnIsShowing(napi_env env, napi_callback_info info)
3730 {
3731     WMError errCode = WMError::WM_OK;
3732     size_t argc = 4;
3733     napi_value argv[4] = {nullptr};
3734     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3735     if (argc > 1) {
3736         TLOGE(WmsLogTag::WMS_LIFE, "Argc is invalid: %{public}zu", argc);
3737         errCode = WMError::WM_ERROR_INVALID_PARAM;
3738     }
3739     wptr<Window> weakToken(windowToken_);
3740     const char* const where = __func__;
3741     napi_value lastParam = (argc == 0) ? nullptr : (GetType(env, argv[0]) == napi_function ? argv[0] : nullptr);
3742     napi_value result = nullptr;
3743     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
3744     auto asyncTask = [weakToken, errCode, where, env, task = napiAsyncTask] {
3745         auto weakWindow = weakToken.promote();
3746         if (weakWindow == nullptr) {
3747             TLOGNE(WmsLogTag::WMS_LIFE, "window is nullptr");
3748             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
3749             return;
3750         }
3751         if (errCode != WMError::WM_OK) {
3752             task->Reject(env, JsErrUtils::CreateJsError(env, errCode));
3753             TLOGNE(WmsLogTag::WMS_LIFE, "window is nullptr or get invalid param");
3754             return;
3755         }
3756         bool state = weakWindow->GetWindowState() == WindowState::STATE_SHOWN;
3757         task->Resolve(env, CreateJsValue(env, state));
3758         TLOGNI(WmsLogTag::WMS_LIFE, "%{public}s end, window [%{public}u, %{public}s] state=%{public}u",
3759             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), state);
3760     };
3761     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnIsShowing") != napi_status::napi_ok) {
3762         TLOGE(WmsLogTag::WMS_LIFE, "napi send event failed, window state is abnormal");
3763     }
3764     return result;
3765 }
3766 
OnIsWindowShowingSync(napi_env env,napi_callback_info info)3767 napi_value JsWindow::OnIsWindowShowingSync(napi_env env, napi_callback_info info)
3768 {
3769     if (windowToken_ == nullptr) {
3770         TLOGE(WmsLogTag::WMS_LIFE, "window is nullptr");
3771         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
3772     }
3773     bool state = (windowToken_->GetWindowState() == WindowState::STATE_SHOWN);
3774     TLOGD(WmsLogTag::WMS_LIFE, "Id=%{public}u, state=%{public}u", windowToken_->GetWindowId(), state);
3775     return CreateJsValue(env, state);
3776 }
3777 
OnSetPreferredOrientation(napi_env env,napi_callback_info info)3778 napi_value JsWindow::OnSetPreferredOrientation(napi_env env, napi_callback_info info)
3779 {
3780     WmErrorCode errCode = WmErrorCode::WM_OK;
3781     Orientation requestedOrientation = Orientation::UNSPECIFIED;
3782     size_t argc = 4;
3783     napi_value argv[4] = {nullptr};
3784     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3785     if (argc < 1) { // 1: params num
3786         TLOGE(WmsLogTag::WMS_ROTATION, "Argc is invalid: %{public}zu", argc);
3787         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
3788     } else {
3789         if (argv[0] == nullptr) {
3790             errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
3791             TLOGE(WmsLogTag::WMS_ROTATION, "Failed to convert parameter to Orientation");
3792         } else {
3793             uint32_t resultValue = 0;
3794             if (errCode == WmErrorCode::WM_OK && !ConvertFromJsValue(env, argv[0], resultValue)) {
3795                 TLOGE(WmsLogTag::WMS_ROTATION, "Failed to convert parameter to orientation");
3796                 errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
3797             }
3798             auto apiOrientation = static_cast<ApiOrientation>(resultValue);
3799             if (apiOrientation < ApiOrientation::BEGIN ||
3800                 apiOrientation > ApiOrientation::END) {
3801                 TLOGE(WmsLogTag::WMS_ROTATION, "Orientation %{public}u invalid!",
3802                     static_cast<uint32_t>(apiOrientation));
3803                 errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
3804             } else {
3805                 requestedOrientation = JS_TO_NATIVE_ORIENTATION_MAP.at(apiOrientation);
3806             }
3807         }
3808     }
3809     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
3810         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
3811     }
3812 
3813     napi_value lastParam = (argc <= 1) ? nullptr :
3814         ((argv[1] != nullptr && GetType(env, argv[1]) == napi_function) ? argv[1] : nullptr);
3815     napi_value result = nullptr;
3816     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
3817     auto asyncTask = [windowToken = wptr<Window>(windowToken_), errCode, requestedOrientation, env,
3818             task = napiAsyncTask, where = __func__] {
3819         if (errCode != WmErrorCode::WM_OK) {
3820             task->Reject(env, JsErrUtils::CreateJsError(env, errCode));
3821             TLOGNE(WmsLogTag::WMS_ROTATION, "%{public}s: invalid param", where);
3822             return;
3823         }
3824         auto weakWindow = windowToken.promote();
3825         if (weakWindow == nullptr) {
3826             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
3827                 "[window][setPreferredOrientation]msg: window is nullptr"));
3828             return;
3829         }
3830         if (requestedOrientation == Orientation::INVALID) {
3831             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM,
3832                     "Invalid param"));
3833             return;
3834         }
3835         weakWindow->SetRequestedOrientation(requestedOrientation);
3836         task->Resolve(env, NapiGetUndefined(env));
3837         TLOGNI(WmsLogTag::WMS_ROTATION, "%{public}s end, window [%{public}u, %{public}s] orientation=%{public}u",
3838             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(),
3839             static_cast<uint32_t>(requestedOrientation));
3840     };
3841     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetPreferredOrientation") != napi_status::napi_ok) {
3842         napiAsyncTask->Reject(env,
3843             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "send event failed"));
3844     }
3845     return result;
3846 }
3847 
OnGetPreferredOrientation(napi_env env,napi_callback_info info)3848 napi_value JsWindow::OnGetPreferredOrientation(napi_env env, napi_callback_info info)
3849 {
3850     size_t argc = 4;
3851     napi_value argv[4] = {nullptr};
3852     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3853     if (argc >= 1) {
3854         TLOGE(WmsLogTag::WMS_ROTATION, "Argc is invalid: %{public}zu, expect zero params", argc);
3855         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
3856     }
3857     if (windowToken_ == nullptr) {
3858         TLOGE(WmsLogTag::WMS_ROTATION, "window is nullptr");
3859         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
3860             "[window][getPreferredOrientation]msg: window is nullptr"));
3861         return NapiGetUndefined(env);
3862     }
3863     Orientation requestedOrientation = windowToken_->GetRequestedOrientation();
3864     ApiOrientation apiOrientation = ApiOrientation::UNSPECIFIED;
3865     if (requestedOrientation >= Orientation::BEGIN &&
3866         requestedOrientation <= Orientation::END) {
3867         apiOrientation = NATIVE_TO_JS_ORIENTATION_MAP.at(requestedOrientation);
3868     } else {
3869         TLOGE(WmsLogTag::WMS_ROTATION, "Orientation %{public}u invalid!", static_cast<uint32_t>(requestedOrientation));
3870     }
3871     TLOGD(WmsLogTag::WMS_ROTATION, "end, window [%{public}u, %{public}s] orientation=%{public}u",
3872         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), static_cast<uint32_t>(apiOrientation));
3873     return CreateJsValue(env, static_cast<uint32_t>(apiOrientation));
3874 }
3875 
OnIsSupportWideGamut(napi_env env,napi_callback_info info)3876 napi_value JsWindow::OnIsSupportWideGamut(napi_env env, napi_callback_info info)
3877 {
3878     WMError errCode = WMError::WM_OK;
3879     size_t argc = 4;
3880     napi_value argv[4] = {nullptr};
3881     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3882     if (argc > 1) {
3883         WLOGFE("Argc is invalid: %{public}zu", argc);
3884         errCode = WMError::WM_ERROR_INVALID_PARAM;
3885     }
3886     const char* const where = __func__;
3887     napi_value lastParam = (argc == 0) ? nullptr :
3888         (GetType(env, argv[0]) == napi_function ? argv[0] : nullptr);
3889     napi_value result = nullptr;
3890     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
3891     auto asyncTask = [weakToken = wptr<Window>(windowToken_), errCode, where, env, task = napiAsyncTask] {
3892         auto weakWindow = weakToken.promote();
3893         if (weakWindow == nullptr) {
3894             WLOGFE("window is nullptr");
3895             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
3896             return;
3897         }
3898         if (errCode != WMError::WM_OK) {
3899             task->Reject(env, JsErrUtils::CreateJsError(env, errCode));
3900             WLOGFE("window is nullptr or get invalid param");
3901             return;
3902         }
3903         bool flag = weakWindow->IsSupportWideGamut();
3904         task->Resolve(env, CreateJsValue(env, flag));
3905         WLOGI("%{public}s end, window [%{public}u, %{public}s] ret=%{public}u",
3906             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), flag);
3907     };
3908     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnIsSupportWideGamut") != napi_status::napi_ok) {
3909         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
3910         napiAsyncTask->Reject(env,
3911             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
3912     }
3913     return result;
3914 }
3915 
OnIsWindowSupportWideGamut(napi_env env,napi_callback_info info)3916 napi_value JsWindow::OnIsWindowSupportWideGamut(napi_env env, napi_callback_info info)
3917 {
3918     const char* const where = __func__;
3919 
3920     size_t argc = 4;
3921     napi_value argv[4] = {nullptr};
3922     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3923     napi_value lastParam = (argc == 0) ? nullptr :
3924         ((argv[0] != nullptr && GetType(env, argv[0]) == napi_function) ? argv[0] : nullptr);
3925     napi_value result = nullptr;
3926     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
3927     auto asyncTask = [weakToken = wptr<Window>(windowToken_), where, env, task = napiAsyncTask] {
3928         auto weakWindow = weakToken.promote();
3929         if (weakWindow == nullptr) {
3930             WLOGFE("window is nullptr or get invalid param");
3931             task->Reject(env,
3932                 JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
3933             return;
3934         }
3935         bool flag = weakWindow->IsSupportWideGamut();
3936         task->Resolve(env, CreateJsValue(env, flag));
3937         WLOGI("%{public}s end, window [%{public}u, %{public}s] ret=%{public}u",
3938             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), flag);
3939     };
3940     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnIsWindowSupportWideGamut") != napi_status::napi_ok) {
3941         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
3942         napiAsyncTask->Reject(env,
3943             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
3944     }
3945     return result;
3946 }
3947 
OnSetBackgroundColor(napi_env env,napi_callback_info info)3948 napi_value JsWindow::OnSetBackgroundColor(napi_env env, napi_callback_info info)
3949 {
3950     WMError errCode = WMError::WM_OK;
3951     size_t argc = 4;
3952     napi_value argv[4] = {nullptr};
3953     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
3954     if (argc < 1 || argc > 2) { // 2: maximum params num
3955         WLOGFE("Argc is invalid: %{public}zu", argc);
3956         errCode = WMError::WM_ERROR_INVALID_PARAM;
3957     }
3958     std::string color;
3959     if (errCode == WMError::WM_OK && !ConvertFromJsValue(env, argv[0], color)) {
3960         WLOGFE("Failed to convert parameter to background color");
3961         errCode = WMError::WM_ERROR_INVALID_PARAM;
3962     }
3963 
3964     const char* const where = __func__;
3965     napi_value lastParam = (argc <= 1) ? nullptr :
3966         (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
3967     napi_value result = nullptr;
3968     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
3969     auto asyncTask = [weakToken = wptr<Window>(windowToken_), color, errCode, where, env, task = napiAsyncTask] {
3970         auto weakWindow = weakToken.promote();
3971         if (weakWindow == nullptr) {
3972             WLOGFE("window is nullptr");
3973             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
3974             return;
3975         }
3976         if (errCode != WMError::WM_OK) {
3977             task->Reject(env, JsErrUtils::CreateJsError(env, errCode, "Invalidate params."));
3978             return;
3979         }
3980         WMError ret = weakWindow->SetBackgroundColor(color);
3981         if (ret == WMError::WM_OK) {
3982             task->Resolve(env, NapiGetUndefined(env));
3983         } else {
3984             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window set background color failed"));
3985         }
3986         WLOGD("%{public}s window [%{public}u, %{public}s] end",
3987             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str());
3988     };
3989     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetBackgroundColor") != napi_status::napi_ok) {
3990         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
3991         napiAsyncTask->Reject(env,
3992             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
3993     }
3994     return result;
3995 }
3996 
OnSetWindowBackgroundColorSync(napi_env env,napi_callback_info info)3997 napi_value JsWindow::OnSetWindowBackgroundColorSync(napi_env env, napi_callback_info info)
3998 {
3999     WmErrorCode errCode = WmErrorCode::WM_OK;
4000     size_t argc = 4;
4001     napi_value argv[4] = {nullptr};
4002     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4003     if (argc < 1) { // 1: params num
4004         WLOGFE("Argc is invalid: %{public}zu", argc);
4005         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
4006     }
4007     std::string color;
4008     if (errCode == WmErrorCode::WM_OK && !GetWindowBackgroundColorFromJs(env, argv[0], color)) {
4009         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "parse js color failed");
4010         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
4011     }
4012     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
4013         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4014     }
4015 
4016     if (windowToken_ == nullptr) {
4017         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "window is null");
4018         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
4019     }
4020     auto retErr = windowToken_->SetBackgroundColor(color);
4021     TLOGI(WmsLogTag::WMS_ATTRIBUTE, "win=%{public}u, color=%{public}s, retErr=%{public}d",
4022         windowToken_->GetWindowId(), color.c_str(), static_cast<int32_t>(retErr));
4023     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(retErr);
4024     if (ret == WmErrorCode::WM_OK) {
4025         return NapiGetUndefined(env);
4026     } else {
4027         return NapiThrowError(env, ret);
4028     }
4029 }
4030 
OnSetBrightness(napi_env env,napi_callback_info info)4031 napi_value JsWindow::OnSetBrightness(napi_env env, napi_callback_info info)
4032 {
4033     WMError errCode = WMError::WM_OK;
4034     size_t argc = 4;
4035     napi_value argv[4] = {nullptr};
4036     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4037     if (argc < 1 || argc > 2) { // 2: maximum params num
4038         WLOGFE("Argc is invalid: %{public}zu", argc);
4039         errCode = WMError::WM_ERROR_INVALID_PARAM;
4040     }
4041     double brightness = UNDEFINED_BRIGHTNESS;
4042     if (errCode == WMError::WM_OK) {
4043         napi_value nativeVal = argv[0];
4044         if (nativeVal == nullptr) {
4045             WLOGFE("Failed to convert parameter to brightness");
4046             errCode = WMError::WM_ERROR_INVALID_PARAM;
4047         } else {
4048             CHECK_NAPI_RETCODE(errCode, WMError::WM_ERROR_INVALID_PARAM,
4049                 napi_get_value_double(env, nativeVal, &brightness));
4050         }
4051     }
4052 
4053     napi_value lastParam = (argc <= 1) ? nullptr :
4054         (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
4055     napi_value result = nullptr;
4056     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
4057     auto asyncTask = [weakToken = wptr<Window>(windowToken_), brightness, errCode, env, task = napiAsyncTask] {
4058         auto weakWindow = weakToken.promote();
4059         if (weakWindow == nullptr) {
4060             WLOGFE("window is nullptr");
4061             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
4062             return;
4063         }
4064         if (errCode != WMError::WM_OK) {
4065             task->Reject(env, JsErrUtils::CreateJsError(env, errCode, "Invalidate params."));
4066             return;
4067         }
4068         WMError ret = weakWindow->SetBrightness(brightness);
4069         if (ret == WMError::WM_OK) {
4070             task->Resolve(env, NapiGetUndefined(env));
4071         } else {
4072             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window set brightness failed"));
4073         }
4074         WLOGI("Window [%{public}u, %{public}s] set brightness end",
4075             weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str());
4076     };
4077     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetBrightness") != napi_status::napi_ok) {
4078         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
4079         napiAsyncTask->Reject(env,
4080             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
4081     }
4082     return result;
4083 }
4084 
OnSetWindowBrightness(napi_env env,napi_callback_info info)4085 napi_value JsWindow::OnSetWindowBrightness(napi_env env, napi_callback_info info)
4086 {
4087     WmErrorCode errCode = WmErrorCode::WM_OK;
4088     size_t argc = 4;
4089     napi_value argv[4] = {nullptr};
4090     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4091     if (argc < 1) { // 1: params num
4092         WLOGFE("Argc is invalid: %{public}zu", argc);
4093         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
4094     }
4095     double brightness = UNDEFINED_BRIGHTNESS;
4096     if (errCode == WmErrorCode::WM_OK) {
4097         napi_value nativeVal = argv[0];
4098         if (nativeVal == nullptr) {
4099             WLOGFE("Failed to convert parameter to brightness");
4100             errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
4101         } else {
4102             CHECK_NAPI_RETCODE(errCode, WmErrorCode::WM_ERROR_INVALID_PARAM,
4103                 napi_get_value_double(env, nativeVal, &brightness));
4104         }
4105     }
4106     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
4107         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4108     }
4109 
4110     napi_value lastParam = (argc <= 1) ? nullptr :
4111         ((argv[1] != nullptr && GetType(env, argv[1]) == napi_function) ? argv[1] : nullptr);
4112     napi_value result = nullptr;
4113     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
4114     auto asyncTask = [weakToken = wptr<Window>(windowToken_), brightness, env, task = napiAsyncTask] {
4115         auto weakWindow = weakToken.promote();
4116         if (weakWindow == nullptr) {
4117             task->Reject(env,
4118                 JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "Invalidate params."));
4119             return;
4120         }
4121         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(weakWindow->SetBrightness(brightness));
4122         if (ret == WmErrorCode::WM_OK) {
4123             task->Resolve(env, NapiGetUndefined(env));
4124         } else {
4125             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window set brightness failed"));
4126         }
4127         TLOGNI(WmsLogTag::WMS_ATTRIBUTE, "Window [%{public}u, %{public}s] set brightness end, result: %{public}d",
4128             weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), ret);
4129     };
4130     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetWindowBrightness") != napi_status::napi_ok) {
4131         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
4132         napiAsyncTask->Reject(env,
4133             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
4134     }
4135     return result;
4136 }
4137 
OnSetDimBehind(napi_env env,napi_callback_info info)4138 napi_value JsWindow::OnSetDimBehind(napi_env env, napi_callback_info info)
4139 {
4140     NapiAsyncTask::CompleteCallback complete =
4141         [](napi_env env, NapiAsyncTask& task, int32_t status) {
4142             task.Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_DEVICE_NOT_SUPPORT));
4143         };
4144     size_t argc = 4;
4145     napi_value argv[4] = {nullptr};
4146     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4147     napi_value lastParam = (argc <= 1) ? nullptr : (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
4148     napi_value result = nullptr;
4149     NapiAsyncTask::Schedule("JsWindow::OnSetDimBehind",
4150         env, CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result));
4151     return result;
4152 }
4153 
OnSetFocusable(napi_env env,napi_callback_info info)4154 napi_value JsWindow::OnSetFocusable(napi_env env, napi_callback_info info)
4155 {
4156     WMError errCode = WMError::WM_OK;
4157     size_t argc = 4;
4158     napi_value argv[4] = {nullptr};
4159     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4160     if (argc < 1 || argc > 2) { // 2: maximum params num
4161         TLOGE(WmsLogTag::WMS_FOCUS, "Argc is invalid: %{public}zu", argc);
4162         errCode = WMError::WM_ERROR_INVALID_PARAM;
4163     }
4164     bool focusable = true;
4165     if (!ConvertFromJsValue(env, argv[0], focusable)) {
4166         TLOGE(WmsLogTag::WMS_FOCUS, "Failed to convert parameter to focusable");
4167         errCode = WMError::WM_ERROR_INVALID_PARAM;
4168     }
4169 
4170     napi_value lastParam = (argc <= 1) ? nullptr : (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
4171     napi_value result = nullptr;
4172     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
4173     auto asyncTask =
4174         [weakToken = wptr<Window>(windowToken_), focusable, errCode, env, task = napiAsyncTask, where = __func__] {
4175             auto window = weakToken.promote();
4176             if (window == nullptr) {
4177                 TLOGNE(WmsLogTag::WMS_FOCUS, "%{public}s: window is nullptr", where);
4178                 task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
4179                 return;
4180             }
4181             if (errCode != WMError::WM_OK) {
4182                 task->Reject(env, JsErrUtils::CreateJsError(env, errCode, "Invalidate params."));
4183                 return;
4184             }
4185             WMError ret = window->SetFocusable(focusable);
4186             if (ret == WMError::WM_OK) {
4187                 task->Resolve(env, NapiGetUndefined(env));
4188             } else {
4189                 task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window set focusable failed"));
4190             }
4191             TLOGNI(WmsLogTag::WMS_FOCUS, "%{public}s: Window [%{public}u, %{public}s] set focusable end",
4192                 where, window->GetWindowId(), window->GetWindowName().c_str());
4193         };
4194     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetFocusable") != napi_status::napi_ok) {
4195         TLOGE(WmsLogTag::WMS_FOCUS, "window state is abnormal!");
4196     }
4197     return result;
4198 }
4199 
OnSetWindowFocusable(napi_env env,napi_callback_info info)4200 napi_value JsWindow::OnSetWindowFocusable(napi_env env, napi_callback_info info)
4201 {
4202     size_t argc = 4;
4203     napi_value argv[4] = {nullptr};
4204     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4205     if (argc < 1) { // 1: maximum params num
4206         TLOGE(WmsLogTag::WMS_FOCUS, "Argc is invalid: %{public}zu", argc);
4207         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4208     }
4209     bool focusable = true;
4210     if (!ConvertFromJsValue(env, argv[0], focusable)) {
4211         TLOGE(WmsLogTag::WMS_FOCUS, "Failed to convert parameter to focusable");
4212         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4213     }
4214 
4215     napi_value lastParam = (argc <= 1) ? nullptr :
4216         ((argv[1] != nullptr && GetType(env, argv[1]) == napi_function) ? argv[1] : nullptr);
4217     napi_value result = nullptr;
4218     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
4219     auto asyncTask =
4220         [weakToken = wptr<Window>(windowToken_), focusable, env, task = napiAsyncTask, where = __func__] {
4221             auto window = weakToken.promote();
4222             if (window == nullptr) {
4223                 task->Reject(env,
4224                     JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
4225                         "[window][setWindowFocusable]msg: Window is nullptr"));
4226                 return;
4227             }
4228             WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->SetFocusable(focusable));
4229             if (ret == WmErrorCode::WM_OK) {
4230                 task->Resolve(env, NapiGetUndefined(env));
4231             } else {
4232                 task->Reject(env, JsErrUtils::CreateJsError(env, ret,
4233                     "[window][setWindowFocusable]msg: Window set focusable failed"));
4234             }
4235             TLOGNI(WmsLogTag::WMS_FOCUS, "%{public}s: Window [%{public}u, %{public}s] set focusable end",
4236                 where, window->GetWindowId(), window->GetWindowName().c_str());
4237         };
4238     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetWindowFocusable") != napi_status::napi_ok) {
4239         napiAsyncTask->Reject(env,
4240             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
4241                 "[window][setWindowFocusable]msg: Failed to send event"));
4242     }
4243     return result;
4244 }
4245 
OnSetTopmost(napi_env env,napi_callback_info info)4246 napi_value JsWindow::OnSetTopmost(napi_env env, napi_callback_info info)
4247 {
4248     if (!Permission::IsSystemCalling()) {
4249         TLOGE(WmsLogTag::WMS_HIERARCHY, "SetTopmost permission denied!");
4250         return NapiThrowError(env, WmErrorCode::WM_ERROR_NOT_SYSTEM_APP);
4251     }
4252     if (windowToken_ == nullptr) {
4253         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
4254     }
4255     if (!WindowHelper::IsMainWindow(windowToken_->GetType())) {
4256         TLOGE(WmsLogTag::WMS_HIERARCHY, "SetTopmost is not allowed since window is not main window");
4257         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
4258     }
4259 
4260     size_t argc = 4;
4261     napi_value argv[4] = {nullptr};
4262     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4263     if (argc != 1 || argv[0] == nullptr) {
4264         TLOGE(WmsLogTag::WMS_HIERARCHY, "Argc is invalid: %{public}zu. Failed to convert parameter to topmost", argc);
4265         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4266     }
4267     bool topmost = false;
4268     napi_get_value_bool(env, argv[0], &topmost);
4269 
4270     wptr<Window> weakToken(windowToken_);
4271     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
4272     NapiAsyncTask::ExecuteCallback execute = [weakToken, topmost, errCodePtr] {
4273         if (errCodePtr == nullptr) {
4274             return;
4275         }
4276         auto window = weakToken.promote();
4277         if (window == nullptr) {
4278             *errCodePtr = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
4279             return;
4280         }
4281         *errCodePtr = WM_JS_TO_ERROR_CODE_MAP.at(window->SetTopmost(topmost));
4282         TLOGI(WmsLogTag::WMS_HIERARCHY, "Window [%{public}u, %{public}s] set topmost end",
4283             window->GetWindowId(), window->GetWindowName().c_str());
4284     };
4285     NapiAsyncTask::CompleteCallback complete =
4286         [weakToken, errCodePtr](napi_env env, NapiAsyncTask& task, int32_t status) {
4287             if (errCodePtr == nullptr) {
4288                 task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
4289                     "[window][setTopmost]msg: System abnormal"));
4290                 return;
4291             }
4292             if (*errCodePtr == WmErrorCode::WM_OK) {
4293                 task.Resolve(env, NapiGetUndefined(env));
4294             } else {
4295                 task.Reject(env, JsErrUtils::CreateJsError(env, *errCodePtr,
4296                     "[window][setTopmost]msg: Window set topmost failed"));
4297             }
4298         };
4299     napi_value result = nullptr;
4300     NapiAsyncTask::Schedule("JsWindow::OnSetTopmost",
4301         env, CreateAsyncTaskWithLastParam(env, nullptr, std::move(execute), std::move(complete), &result));
4302     return result;
4303 }
4304 
OnSetWindowTopmost(napi_env env,napi_callback_info info)4305 napi_value JsWindow::OnSetWindowTopmost(napi_env env, napi_callback_info info)
4306 {
4307     if (windowToken_ == nullptr) {
4308         TLOGE(WmsLogTag::WMS_HIERARCHY, "windowToken is nullptr");
4309         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
4310     }
4311     if (windowToken_->IsPadAndNotFreeMutiWindowCompatibleMode()) {
4312         TLOGE(WmsLogTag::WMS_HIERARCHY, "This is PcAppInPad, not support");
4313         return NapiGetUndefined(env);
4314     }
4315     if (!windowToken_->IsPcOrPadFreeMultiWindowMode()) {
4316         TLOGE(WmsLogTag::WMS_HIERARCHY, "device not support");
4317         return NapiThrowError(env, WmErrorCode::WM_ERROR_DEVICE_NOT_SUPPORT);
4318     }
4319     if (!WindowHelper::IsMainWindow(windowToken_->GetType())) {
4320         TLOGE(WmsLogTag::WMS_HIERARCHY, "not allowed since window is not main window");
4321         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
4322     }
4323     size_t argc = FOUR_PARAMS_SIZE;
4324     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
4325     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4326     bool isMainWindowTopmost = false;
4327     if (argc != 1 || !ConvertFromJsValue(env, argv[INDEX_ZERO], isMainWindowTopmost)) {
4328         TLOGE(WmsLogTag::WMS_HIERARCHY,
4329             "Argc is invalid: %{public}zu. Failed to convert parameter to topmost", argc);
4330         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4331     }
4332     napi_value result = nullptr;
4333     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
4334     const char* const where = __func__;
4335     auto asyncTask = [weakToken = wptr<Window>(windowToken_), isMainWindowTopmost, env,
4336         task = napiAsyncTask, where] {
4337         auto window = weakToken.promote();
4338         if (window == nullptr) {
4339             TLOGNE(WmsLogTag::WMS_HIERARCHY, "%{public}s window is nullptr", where);
4340             WmErrorCode wmErrorCode = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
4341             task->Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode, "window is nullptr"));
4342             return;
4343         }
4344         auto ret = WM_JS_TO_ERROR_CODE_MAP.at(window->SetMainWindowTopmost(isMainWindowTopmost));
4345         if (ret != WmErrorCode::WM_OK) {
4346             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window set main window topmost failed"));
4347             return;
4348         }
4349         task->Resolve(env, NapiGetUndefined(env));
4350         TLOGNI(WmsLogTag::WMS_HIERARCHY,
4351             "%{public}s id: %{public}u, name: %{public}s, isMainWindowTopmost: %{public}d",
4352             where, window->GetWindowId(), window->GetWindowName().c_str(), isMainWindowTopmost);
4353     };
4354     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetWindowTopmost") != napi_status::napi_ok) {
4355         napiAsyncTask->Reject(env,
4356             CreateJsError(env, static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
4357     }
4358     return result;
4359 }
4360 
4361 /** @note @window.hierarchy */
OnSetSubWindowZLevel(napi_env env,napi_callback_info info)4362 napi_value JsWindow::OnSetSubWindowZLevel(napi_env env, napi_callback_info info)
4363 {
4364     if (windowToken_ == nullptr) {
4365         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
4366     }
4367     if (!WindowHelper::IsSubWindow(windowToken_->GetType())) {
4368         TLOGE(WmsLogTag::WMS_HIERARCHY, "not allowed since window is not sub window");
4369         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
4370     }
4371     WmErrorCode errCode = WmErrorCode::WM_OK;
4372     size_t argc = FOUR_PARAMS_SIZE;
4373     napi_value argv[FOUR_PARAMS_SIZE] = {nullptr};
4374     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4375     if (argc != 1 || argv[0] == nullptr) { // 1: params num
4376         TLOGE(WmsLogTag::WMS_HIERARCHY, "argc is invalid: %{public}zu", argc);
4377         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4378     }
4379     int32_t zLevel = 0;
4380     if (errCode == WmErrorCode::WM_OK && !ConvertFromJsValue(env, argv[0], zLevel)) {
4381         TLOGE(WmsLogTag::WMS_HIERARCHY, "failed to convert paramter to zLevel");
4382         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4383     }
4384     napi_value lastParam = nullptr;
4385     napi_value result = nullptr;
4386     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
4387     auto asyncTask = [windowToken = wptr<Window>(windowToken_), zLevel, env,
4388         task = napiAsyncTask, where = __func__] {
4389         auto window = windowToken.promote();
4390         if (window == nullptr) {
4391             TLOGNE(WmsLogTag::WMS_HIERARCHY, "%{public}s window is nullptr", where);
4392             task->Reject(env, JsErrUtils::CreateJsError(env,
4393                 WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "[window][setSubWindowZLevel]msg: Window is nullptr"));
4394             return;
4395         }
4396         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->SetSubWindowZLevel(zLevel));
4397         if (ret == WmErrorCode::WM_OK) {
4398             task->Resolve(env, NapiGetUndefined(env));
4399         } else {
4400             task->Reject(env, JsErrUtils::CreateJsError(env, ret,
4401                 "[window][setSubWindowZLevel]msg: Set sub window zLevel failed"));
4402         }
4403         TLOGNI(WmsLogTag::WMS_HIERARCHY, "window [%{public}u, %{public}s], zLevel = %{public}d, ret = %{public}d",
4404             window->GetWindowId(), window->GetWindowName().c_str(), zLevel, ret);
4405     };
4406     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetSubWindowZLevel") != napi_status::napi_ok) {
4407         napiAsyncTask->Reject(env,
4408             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
4409                 "[window][setSubWindowZLevel]msg: Failed to send event"));
4410     }
4411     return result;
4412 }
4413 
4414 /** @note @window.hierarchy */
OnGetSubWindowZLevel(napi_env env,napi_callback_info info)4415 napi_value JsWindow::OnGetSubWindowZLevel(napi_env env, napi_callback_info info)
4416 {
4417     size_t argc = FOUR_PARAMS_SIZE;
4418     napi_value argv[FOUR_PARAMS_SIZE] = {nullptr};
4419     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4420     if (argc > 1) {
4421         TLOGE(WmsLogTag::WMS_HIERARCHY, "argc is invalid: %{public}zu", argc);
4422         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4423     }
4424     if (windowToken_ == nullptr) {
4425         TLOGE(WmsLogTag::WMS_HIERARCHY, "window is nullptr");
4426         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
4427             "[window][getSubWindowZLevel]msg: Window is nullptr");
4428     }
4429     int32_t zLevel = 0;
4430     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->GetSubWindowZLevel(zLevel));
4431     if (ret != WmErrorCode::WM_OK) {
4432         return NapiThrowError(env, ret, "[window][getSubWindowZLevel]msg: Get sub window zLevel failed");
4433     }
4434     napi_value objValue = nullptr;
4435     napi_set_named_property(env, objValue, "zLevel", CreateJsValue(env, zLevel));
4436     if (objValue != nullptr) {
4437         return objValue;
4438     } else {
4439         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
4440     }
4441 }
4442 
OnSetWindowDelayRaiseOnDrag(napi_env env,napi_callback_info info)4443 napi_value JsWindow::OnSetWindowDelayRaiseOnDrag(napi_env env, napi_callback_info info)
4444 {
4445     if (windowToken_ == nullptr) {
4446         TLOGE(WmsLogTag::WMS_FOCUS, "windowToken is nullptr");
4447         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
4448     }
4449     size_t argc = FOUR_PARAMS_SIZE;
4450     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
4451     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4452     if (argc != 1 || argv[0] == nullptr) {
4453         TLOGE(WmsLogTag::WMS_FOCUS,
4454             "Argc is invalid: %{public}zu. Failed to convert parameter to delay raise", argc);
4455         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4456     }
4457     bool isDelayRaise = false;
4458     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], isDelayRaise)) {
4459         TLOGE(WmsLogTag::WMS_FOCUS, "Failed to convert parameter from jsValue");
4460         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4461     }
4462     auto result = windowToken_->SetWindowDelayRaiseEnabled(isDelayRaise);
4463     if (result != WMError::WM_OK) {
4464         TLOGE(WmsLogTag::WMS_FOCUS, "failed");
4465         return NapiThrowError(env, WM_JS_TO_ERROR_CODE_MAP.at(result));
4466     }
4467     return NapiGetUndefined(env);
4468 }
4469 
OnSetKeepScreenOn(napi_env env,napi_callback_info info)4470 napi_value JsWindow::OnSetKeepScreenOn(napi_env env, napi_callback_info info)
4471 {
4472     WMError errCode = WMError::WM_OK;
4473     size_t argc = 4;
4474     napi_value argv[4] = {nullptr};
4475     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4476     if (argc < 1 || argc > 2) { // 2: maximum params num
4477         WLOGFE("Argc is invalid: %{public}zu", argc);
4478         errCode = WMError::WM_ERROR_INVALID_PARAM;
4479     }
4480     bool keepScreenOn = true;
4481     if (errCode == WMError::WM_OK) {
4482         napi_value nativeVal = argv[0];
4483         if (nativeVal == nullptr) {
4484             WLOGFE("Failed to convert parameter to keepScreenOn");
4485             errCode = WMError::WM_ERROR_INVALID_PARAM;
4486         } else {
4487             CHECK_NAPI_RETCODE(errCode, WMError::WM_ERROR_INVALID_PARAM,
4488                 napi_get_value_bool(env, nativeVal, &keepScreenOn));
4489         }
4490     }
4491 
4492     napi_value lastParam = (argc <= 1) ? nullptr :
4493         (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
4494     napi_value result = nullptr;
4495     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
4496     auto asyncTask = [weakToken = wptr<Window>(windowToken_), keepScreenOn, errCode,
4497                       env, task = napiAsyncTask] {
4498         auto weakWindow = weakToken.promote();
4499         if (weakWindow == nullptr) {
4500             WLOGFE("window is nullptr");
4501             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
4502             return;
4503         }
4504         if (errCode != WMError::WM_OK) {
4505             task->Reject(env, JsErrUtils::CreateJsError(env, errCode, "Invalidate params."));
4506             return;
4507         }
4508         WMError ret = weakWindow->SetKeepScreenOn(keepScreenOn);
4509         if (ret == WMError::WM_OK) {
4510             task->Resolve(env, NapiGetUndefined(env));
4511         } else {
4512             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window set keep screen on failed"));
4513         }
4514         WLOGI("Window [%{public}u, %{public}s] set keep screen on end",
4515             weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str());
4516     };
4517     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetKeepScreenOn") != napi_status::napi_ok) {
4518         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
4519         napiAsyncTask->Reject(env,
4520             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
4521     }
4522     return result;
4523 }
4524 
OnSetWindowKeepScreenOn(napi_env env,napi_callback_info info)4525 napi_value JsWindow::OnSetWindowKeepScreenOn(napi_env env, napi_callback_info info)
4526 {
4527     WmErrorCode errCode = WmErrorCode::WM_OK;
4528     size_t argc = 4;
4529     napi_value argv[4] = {nullptr};
4530     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4531     if (argc < 1) { // 1: params num
4532         WLOGFE("Argc is invalid: %{public}zu", argc);
4533         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
4534     }
4535     bool keepScreenOn = true;
4536     if (errCode == WmErrorCode::WM_OK) {
4537         napi_value nativeVal = argv[0];
4538         if (nativeVal == nullptr) {
4539             WLOGFE("Failed to convert parameter to keepScreenOn");
4540             errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
4541         } else {
4542             CHECK_NAPI_RETCODE(errCode, WmErrorCode::WM_ERROR_INVALID_PARAM,
4543                 napi_get_value_bool(env, nativeVal, &keepScreenOn));
4544         }
4545     }
4546     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
4547         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4548     }
4549     wptr<Window> weakToken(windowToken_);
4550     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
4551     NapiAsyncTask::ExecuteCallback execute = [weakToken, keepScreenOn, errCodePtr] {
4552         if (errCodePtr == nullptr) {
4553             return;
4554         }
4555         auto weakWindow = weakToken.promote();
4556         if (weakWindow == nullptr) {
4557             *errCodePtr = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
4558             return;
4559         }
4560         *errCodePtr = WM_JS_TO_ERROR_CODE_MAP.at(weakWindow->SetKeepScreenOn(keepScreenOn));
4561         WLOGI("Window [%{public}u, %{public}s] set keep screen on end",
4562             weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str());
4563     };
4564     NapiAsyncTask::CompleteCallback complete =
4565         [weakToken, keepScreenOn, errCodePtr](napi_env env, NapiAsyncTask& task, int32_t status) {
4566             if (errCodePtr == nullptr) {
4567                 task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
4568                 "System abnormal."));
4569                 return;
4570             }
4571             if (*errCodePtr == WmErrorCode::WM_OK) {
4572                 task.Resolve(env, NapiGetUndefined(env));
4573             } else {
4574                 task.Reject(env, JsErrUtils::CreateJsError(env, *errCodePtr, "Window set keep screen on failed"));
4575             }
4576         };
4577 
4578     napi_value lastParam = (argc <= 1) ? nullptr :
4579         ((argv[1] != nullptr && GetType(env, argv[1]) == napi_function) ? argv[1] : nullptr);
4580     napi_value result = nullptr;
4581     NapiAsyncTask::Schedule("JsWindow::OnSetWindowKeepScreenOn",
4582         env, CreateAsyncTaskWithLastParam(env, lastParam, std::move(execute), std::move(complete), &result));
4583     return result;
4584 }
4585 
OnSetWakeUpScreen(napi_env env,napi_callback_info info)4586 napi_value JsWindow::OnSetWakeUpScreen(napi_env env, napi_callback_info info)
4587 {
4588     if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
4589         WLOGFE("set wake up screen permission denied!");
4590         return NapiThrowError(env, WmErrorCode::WM_ERROR_NOT_SYSTEM_APP);
4591     }
4592     if (windowToken_ == nullptr) {
4593         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
4594     }
4595     size_t argc = 4;
4596     napi_value argv[4] = {nullptr};
4597     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4598     if (argc < 1) {
4599         WLOGFE("Argc is invalid: %{public}zu", argc);
4600         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4601     }
4602     bool wakeUp = false;
4603     napi_value nativeVal = argv[0];
4604     if (nativeVal == nullptr) {
4605         WLOGFE("Failed to convert parameter to keepScreenOn");
4606         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4607     } else {
4608         napi_get_value_bool(env, nativeVal, &wakeUp);
4609     }
4610 
4611     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetTurnScreenOn(wakeUp));
4612     if (ret != WmErrorCode::WM_OK) {
4613         return NapiThrowError(env, ret);
4614     }
4615 
4616     WLOGI("Window [%{public}u, %{public}s] set wake up screen %{public}d end",
4617         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), wakeUp);
4618     return NapiGetUndefined(env);
4619 }
4620 
OnSetOutsideTouchable(napi_env env,napi_callback_info info)4621 napi_value JsWindow::OnSetOutsideTouchable(napi_env env, napi_callback_info info)
4622 {
4623     size_t argc = 4;
4624     napi_value argv[4] = {nullptr};
4625     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4626     napi_value lastParam = (argc <= 1) ? nullptr :
4627         (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
4628     napi_value result = nullptr;
4629     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
4630     auto asyncTask = [env, task = napiAsyncTask] {
4631         task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_DEVICE_NOT_SUPPORT));
4632     };
4633     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetOutsideTouchable") != napi_status::napi_ok) {
4634         TLOGE(WmsLogTag::WMS_EVENT, "napi_send_event failed");
4635     }
4636     return result;
4637 }
4638 
OnSetPrivacyMode(napi_env env,napi_callback_info info)4639 napi_value JsWindow::OnSetPrivacyMode(napi_env env, napi_callback_info info)
4640 {
4641     WMError errCode = WMError::WM_OK;
4642     size_t argc = 4;
4643     napi_value argv[4] = {nullptr};
4644     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4645     if (argc < 1 || argc > 2) { // 2: maximum params num
4646         WLOGFE("Argc is invalid: %{public}zu", argc);
4647         errCode = WMError::WM_ERROR_INVALID_PARAM;
4648     }
4649     bool isPrivacyMode = false;
4650     if (errCode == WMError::WM_OK) {
4651         napi_value nativeVal = argv[0];
4652         if (nativeVal == nullptr) {
4653             WLOGFE("Failed to convert parameter to isPrivacyMode");
4654             errCode = WMError::WM_ERROR_INVALID_PARAM;
4655         } else {
4656             CHECK_NAPI_RETCODE(errCode, WMError::WM_ERROR_INVALID_PARAM,
4657                 napi_get_value_bool(env, nativeVal, &isPrivacyMode));
4658         }
4659     }
4660 
4661     napi_value lastParam = (argc <= 1) ? nullptr :
4662         (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
4663     napi_value result = nullptr;
4664     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
4665     auto asyncTask = [weakToken = wptr<Window>(windowToken_), isPrivacyMode, errCode, env, task = napiAsyncTask] {
4666         auto weakWindow = weakToken.promote();
4667         if (weakWindow == nullptr) {
4668             WLOGFE("window is nullptr");
4669             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
4670             return;
4671         }
4672         if (errCode != WMError::WM_OK) {
4673             task->Reject(env, JsErrUtils::CreateJsError(env, errCode, "Invalidate params"));
4674             return;
4675         }
4676         weakWindow->SetPrivacyMode(isPrivacyMode);
4677         task->Resolve(env, NapiGetUndefined(env));
4678         WLOGI("Window [%{public}u, %{public}s] set privacy mode end, mode=%{public}u",
4679             weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), isPrivacyMode);
4680     };
4681     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetPrivacyMode") != napi_status::napi_ok) {
4682         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
4683         napiAsyncTask->Reject(env,
4684             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
4685     }
4686     return result;
4687 }
4688 
OnSetWindowPrivacyMode(napi_env env,napi_callback_info info)4689 napi_value JsWindow::OnSetWindowPrivacyMode(napi_env env, napi_callback_info info)
4690 {
4691     WmErrorCode errCode = WmErrorCode::WM_OK;
4692     size_t argc = 4;
4693     napi_value argv[4] = {nullptr};
4694     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4695     if (argc < 1) { // 1: params num
4696         WLOGFE("Argc is invalid: %{public}zu", argc);
4697         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
4698     }
4699     bool isPrivacyMode = false;
4700     if (errCode == WmErrorCode::WM_OK) {
4701         napi_value nativeVal = argv[0];
4702         if (nativeVal == nullptr) {
4703             WLOGFE("Failed to convert parameter to isPrivacyMode");
4704             errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
4705         } else {
4706             CHECK_NAPI_RETCODE(errCode, WmErrorCode::WM_ERROR_INVALID_PARAM,
4707                 napi_get_value_bool(env, nativeVal, &isPrivacyMode));
4708         }
4709     }
4710     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
4711         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4712     }
4713     const char* const where = __func__;
4714     napi_value lastParam = (argc <= 1) ? nullptr :
4715         ((argv[1] != nullptr && GetType(env, argv[1]) == napi_function) ? argv[1] : nullptr);
4716     napi_value result = nullptr;
4717     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
4718     auto asyncTask = [weakToken = wptr<Window>(windowToken_), isPrivacyMode, where, env, task = napiAsyncTask] {
4719         auto weakWindow = weakToken.promote();
4720         if (weakWindow == nullptr) {
4721             task->Reject(env,
4722                 JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "Invalidate params"));
4723             return;
4724         }
4725         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(weakWindow->SetPrivacyMode(isPrivacyMode));
4726         if (ret == WmErrorCode::WM_ERROR_NO_PERMISSION) {
4727             task->Reject(env, JsErrUtils::CreateJsError(env, ret));
4728             WLOGI("%{public}s failed, window [%{public}u, %{public}s] mode=%{public}u",
4729                 where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), isPrivacyMode);
4730             return;
4731         }
4732         task->Resolve(env, NapiGetUndefined(env));
4733         WLOGI("%{public}s succeed, window [%{public}u, %{public}s] mode=%{public}u",
4734             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), isPrivacyMode);
4735     };
4736     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetWindowPrivacyMode") != napi_status::napi_ok) {
4737         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
4738         napiAsyncTask->Reject(env,
4739             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
4740     }
4741     return result;
4742 }
4743 
OnSetTouchable(napi_env env,napi_callback_info info)4744 napi_value JsWindow::OnSetTouchable(napi_env env, napi_callback_info info)
4745 {
4746     WMError errCode = WMError::WM_OK;
4747     size_t argc = 4;
4748     napi_value argv[4] = {nullptr};
4749     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4750     if (argc < 1 || argc > 2) { // 2: maximum params num
4751         WLOGFE("Argc is invalid: %{public}zu", argc);
4752         errCode = WMError::WM_ERROR_INVALID_PARAM;
4753     }
4754     bool touchable = true;
4755     if (errCode == WMError::WM_OK) {
4756         napi_value nativeVal = argv[0];
4757         if (nativeVal == nullptr) {
4758             WLOGFE("Failed to convert parameter to touchable");
4759             errCode = WMError::WM_ERROR_INVALID_PARAM;
4760         } else {
4761             CHECK_NAPI_RETCODE(errCode, WMError::WM_ERROR_INVALID_PARAM,
4762                 napi_get_value_bool(env, nativeVal, &touchable));
4763         }
4764     }
4765 
4766     wptr<Window> weakToken(windowToken_);
4767     const char* const where = __func__;
4768     napi_value lastParam = (argc <= 1) ? nullptr :
4769         (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
4770     napi_value result = nullptr;
4771     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
4772     auto asyncTask = [weakToken, touchable, errCode, where, env, task = napiAsyncTask] {
4773         auto weakWindow = weakToken.promote();
4774         if (weakWindow == nullptr) {
4775             WLOGFE("window is nullptr");
4776             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
4777             return;
4778         }
4779         if (errCode != WMError::WM_OK) {
4780             task->Reject(env, JsErrUtils::CreateJsError(env, errCode, "Invalidate params."));
4781             return;
4782         }
4783         WMError ret = weakWindow->SetTouchable(touchable);
4784         if (ret == WMError::WM_OK) {
4785             task->Resolve(env, NapiGetUndefined(env));
4786         } else {
4787             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window set touchable failed"));
4788         }
4789         WLOGI("%{public}s end, window [%{public}u, %{public}s]",
4790             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str());
4791     };
4792     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetTouchable") != napi_status::napi_ok) {
4793         TLOGE(WmsLogTag::WMS_EVENT, "napi_send_event failed");
4794     }
4795     return result;
4796 }
4797 
OnSetTouchableAreas(napi_env env,napi_callback_info info)4798 napi_value JsWindow::OnSetTouchableAreas(napi_env env, napi_callback_info info)
4799 {
4800     if (!Permission::IsSystemCalling()) {
4801         TLOGE(WmsLogTag::WMS_EVENT, "OnSetTouchableAreas permission denied!");
4802         return NapiThrowError(env, WmErrorCode::WM_ERROR_NOT_SYSTEM_APP);
4803     }
4804     if (windowToken_ == nullptr) {
4805         TLOGE(WmsLogTag::WMS_EVENT, "WindowToken_ is nullptr");
4806         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
4807     }
4808     Rect windowRect = windowToken_->GetRect();
4809     std::vector<Rect> touchableAreas;
4810     WmErrorCode errCode = ParseTouchableAreas(env, info, windowRect, touchableAreas);
4811     if (errCode != WmErrorCode::WM_OK) {
4812         return NapiThrowError(env, errCode);
4813     }
4814     wptr<Window> weakToken(windowToken_);
4815     const char* const where = __func__;
4816     napi_value result = nullptr;
4817     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
4818     auto asyncTask = [weakToken, touchableAreas, where, env, task = napiAsyncTask] {
4819         auto weakWindow = weakToken.promote();
4820         if (weakWindow == nullptr) {
4821             TLOGNE(WmsLogTag::WMS_EVENT, "%{public}s window is nullptr", where);
4822             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
4823             return;
4824         }
4825         WMError ret = weakWindow->SetTouchHotAreas(touchableAreas);
4826         if (ret == WMError::WM_OK) {
4827             task->Resolve(env, NapiGetUndefined(env));
4828         } else {
4829             WmErrorCode wmErrorCode = WM_JS_TO_ERROR_CODE_MAP.at(ret);
4830             task->Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode, "OnSetTouchableAreas failed"));
4831         }
4832         TLOGNI(WmsLogTag::WMS_EVENT, "%{public}s Window [%{public}u, %{public}s] end",
4833             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str());
4834     };
4835     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetTouchableAreas") != napi_status::napi_ok) {
4836         napiAsyncTask->Reject(env,
4837             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
4838     }
4839     return result;
4840 }
4841 
OnSetResizeByDragEnabled(napi_env env,napi_callback_info info)4842 napi_value JsWindow::OnSetResizeByDragEnabled(napi_env env, napi_callback_info info)
4843 {
4844     size_t argc = 4;
4845     napi_value argv[4] = {nullptr};
4846     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4847     if (argc < 1 || argc > 2) { // 2: maximum params num
4848         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
4849         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4850     }
4851     bool dragEnabled = true;
4852     if (!ConvertFromJsValue(env, argv[0], dragEnabled)) {
4853         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to dragEnabled");
4854         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4855     }
4856     napi_value lastParam = (argc <= 1) ? nullptr : (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
4857     napi_value result = nullptr;
4858     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
4859     auto asyncTask = [weakToken = wptr<Window>(windowToken_), dragEnabled,
4860                       env, task = napiAsyncTask, where = __func__] {
4861         auto window = weakToken.promote();
4862         if (window == nullptr) {
4863             TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s: window is nullptr", where);
4864             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
4865             return;
4866         }
4867         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->SetResizeByDragEnabled(dragEnabled));
4868         if (ret == WmErrorCode::WM_OK) {
4869             task->Resolve(env, NapiGetUndefined(env));
4870         } else {
4871             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "set dragEnabled failed"));
4872         }
4873         TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s: Window [%{public}u, %{public}s] set dragEnabled end",
4874                where, window->GetWindowId(), window->GetWindowName().c_str());
4875     };
4876     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetResizeByDragEnabled") != napi_status::napi_ok) {
4877         napiAsyncTask->Reject(env,
4878             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
4879     }
4880     return result;
4881 }
4882 
OnSetRaiseByClickEnabled(napi_env env,napi_callback_info info)4883 napi_value JsWindow::OnSetRaiseByClickEnabled(napi_env env, napi_callback_info info)
4884 {
4885     WMError errCode = WMError::WM_OK;
4886     size_t argc = 4;
4887     napi_value argv[4] = {nullptr};
4888     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4889     if (argc < 1 || argc > 2) { // 2: maximum params num
4890         TLOGE(WmsLogTag::WMS_HIERARCHY, "Argc is invalid: %{public}zu", argc);
4891         errCode = WMError::WM_ERROR_INVALID_PARAM;
4892     }
4893     bool raiseEnabled = true;
4894     if (!ConvertFromJsValue(env, argv[0], raiseEnabled)) {
4895         TLOGE(WmsLogTag::WMS_HIERARCHY, "Failed to convert parameter to raiseEnabled");
4896         errCode = WMError::WM_ERROR_INVALID_PARAM;
4897     }
4898 
4899     napi_value lastParam = (argc <= 1) ? nullptr : (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
4900     napi_value result = nullptr;
4901     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
4902     auto asyncTask =
4903         [weakToken = wptr<Window>(windowToken_), raiseEnabled, env, errCode, task = napiAsyncTask, where = __func__] {
4904             auto window = weakToken.promote();
4905             if (window == nullptr) {
4906                 TLOGNE(WmsLogTag::WMS_HIERARCHY, "%{public}s: window is nullptr", where);
4907                 task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
4908                 return;
4909             }
4910             if (errCode != WMError::WM_OK) {
4911                 WmErrorCode wmErrorCode = WM_JS_TO_ERROR_CODE_MAP.at(errCode);
4912                 task->Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode, "Invalidate params."));
4913                 return;
4914             }
4915             WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->SetRaiseByClickEnabled(raiseEnabled));
4916             if (ret == WmErrorCode::WM_OK) {
4917                 task->Resolve(env, NapiGetUndefined(env));
4918             } else {
4919                 task->Reject(env, JsErrUtils::CreateJsError(env, ret, "set raiseEnabled failed"));
4920             }
4921             TLOGNI(WmsLogTag::WMS_HIERARCHY, "%{public}s: Window [%{public}u, %{public}s] set raiseEnabled end",
4922                 where, window->GetWindowId(), window->GetWindowName().c_str());
4923         };
4924     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetRaiseByClickEnabled") != napi_status::napi_ok) {
4925         napiAsyncTask->Reject(env,
4926             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
4927     }
4928     return result;
4929 }
4930 
OnHideNonSystemFloatingWindows(napi_env env,napi_callback_info info)4931 napi_value JsWindow::OnHideNonSystemFloatingWindows(napi_env env, napi_callback_info info)
4932 {
4933     size_t argc = FOUR_PARAMS_SIZE;
4934     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
4935     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4936     if (argc < ONE_PARAMS_SIZE || argc > TWO_PARAMS_SIZE) { // 2: maximum params num
4937         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Argc is invalid: %{public}zu", argc);
4938         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4939     }
4940     bool shouldHide = false;
4941     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], shouldHide)) {
4942         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Failed to convert parameter to shouldHide");
4943         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
4944     }
4945     napi_value lastParam = (argc <= ONE_PARAMS_SIZE) ? nullptr :
4946         (GetType(env, argv[INDEX_ONE]) == napi_function ? argv[INDEX_ONE] : nullptr);
4947     napi_value result = nullptr;
4948     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
4949     auto asyncTask = [weakToken = wptr<Window>(windowToken_), shouldHide, env,
4950         task = napiAsyncTask, where = __func__] {
4951         auto window = weakToken.promote();
4952         if (window == nullptr) {
4953             TLOGNE(WmsLogTag::WMS_ATTRIBUTE, "%{public}s window is nullptr", where);
4954             task->Reject(env, JsErrUtils::CreateJsError(env,
4955                 WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "window is nullptr."));
4956             return;
4957         }
4958         if (window->IsFloatingWindowAppType()) {
4959             TLOGNE(WmsLogTag::WMS_ATTRIBUTE, "%{public}s window is app floating window", where);
4960             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_CALLING,
4961                 "HideNonSystemFloatingWindows is not allowed since window is app window"));
4962             return;
4963         }
4964         WMError ret = window->HideNonSystemFloatingWindows(shouldHide);
4965         if (ret != WMError::WM_OK) {
4966             TLOGNE(WmsLogTag::WMS_ATTRIBUTE, "%{public}s failed", where);
4967             task->Reject(env, JsErrUtils::CreateJsError(env, WM_JS_TO_ERROR_CODE_MAP.at(ret),
4968                 "Hide non-system floating windows failed"));
4969             return;
4970         }
4971         task->Resolve(env, NapiGetUndefined(env));
4972         TLOGNI(WmsLogTag::WMS_ATTRIBUTE,
4973             "%{public}s end. Window [%{public}u, %{public}s]",
4974             where, window->GetWindowId(), window->GetWindowName().c_str());
4975     };
4976     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnHideNonSystemFloatingWindows") != napi_status::napi_ok) {
4977         napiAsyncTask->Reject(env,
4978             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "send event failed"));
4979     }
4980     return result;
4981 }
4982 
OnSetSingleFrameComposerEnabled(napi_env env,napi_callback_info info)4983 napi_value JsWindow::OnSetSingleFrameComposerEnabled(napi_env env, napi_callback_info info)
4984 {
4985     WmErrorCode errCode = WmErrorCode::WM_OK;
4986     if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
4987         WLOGFE("set single frame composer enabled permission denied!");
4988         errCode = WmErrorCode::WM_ERROR_NOT_SYSTEM_APP;
4989     }
4990 
4991     bool enabled = false;
4992     if (errCode == WmErrorCode::WM_OK) {
4993         size_t argc = 4;
4994         napi_value argv[4] = {nullptr};
4995         napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
4996         if (argc != 1) { // 1: the param num
4997             WLOGFE("Invalid parameter, argc is invalid: %{public}zu", argc);
4998             errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
4999         }
5000         if (errCode == WmErrorCode::WM_OK) {
5001             napi_value nativeVal = argv[0];
5002             if (nativeVal == nullptr) {
5003                 WLOGFE("Invalid parameter, failed to convert parameter to enabled");
5004                 errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
5005             } else {
5006                 CHECK_NAPI_RETCODE(errCode, WmErrorCode::WM_ERROR_INVALID_PARAM,
5007                     napi_get_value_bool(env, nativeVal, &enabled));
5008             }
5009         }
5010     }
5011 
5012     const char* const where = __func__;
5013     napi_value lastParam = nullptr;
5014     napi_value result = nullptr;
5015     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
5016     auto asyncTask = [weakToken = wptr<Window>(windowToken_), enabled, errCode, where, env, task = napiAsyncTask] {
5017         if (errCode != WmErrorCode::WM_OK) {
5018             task->Reject(env, JsErrUtils::CreateJsError(env, errCode, "permission denied or invalid parameter."));
5019             return;
5020         }
5021 
5022         auto weakWindow = weakToken.promote();
5023         WmErrorCode wmErrorCode;
5024         if (weakWindow == nullptr) {
5025             WLOGFE("window is nullptr");
5026             wmErrorCode = WM_JS_TO_ERROR_CODE_MAP.at(WMError::WM_ERROR_NULLPTR);
5027             task->Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode, "window is nullptr."));
5028             return;
5029         }
5030 
5031         WMError ret = weakWindow->SetSingleFrameComposerEnabled(enabled);
5032         if (ret == WMError::WM_OK) {
5033             task->Resolve(env, NapiGetUndefined(env));
5034         } else {
5035             wmErrorCode = WM_JS_TO_ERROR_CODE_MAP.at(ret);
5036             WLOGFE("Set single frame composer enabled failed, ret is %{public}d", wmErrorCode);
5037             task->Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode,
5038                         "Set single frame composer enabled failed"));
5039             return;
5040         }
5041         WLOGI("%{public}s end, window [%{public}u, %{public}s] enabled flag=%{public}d",
5042             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), enabled);
5043     };
5044     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetSingleFrameComposerEnabled") != napi_status::napi_ok) {
5045         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
5046         napiAsyncTask->Reject(env,
5047             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
5048     }
5049     return result;
5050 }
5051 
GetSubWindowId(napi_env env,napi_value nativeVal,WmErrorCode & errCode,int32_t & subWindowId)5052 void GetSubWindowId(napi_env env, napi_value nativeVal, WmErrorCode& errCode, int32_t& subWindowId)
5053 {
5054     if (nativeVal == nullptr) {
5055         WLOGFE("Failed to get subWindowId");
5056         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
5057     } else {
5058         int32_t resultValue = 0;
5059         CHECK_NAPI_RETCODE(errCode, WmErrorCode::WM_ERROR_INVALID_PARAM,
5060             napi_get_value_int32(env, nativeVal, &resultValue));
5061         if (resultValue <= 0) {
5062             WLOGFE("Failed to get subWindowId due to resultValue less than or equal to 0");
5063             errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
5064         } else {
5065             subWindowId = resultValue;
5066         }
5067     }
5068     return;
5069 }
5070 
OnRaiseAboveTarget(napi_env env,napi_callback_info info)5071 napi_value JsWindow::OnRaiseAboveTarget(napi_env env, napi_callback_info info)
5072 {
5073     WmErrorCode errCode = WmErrorCode::WM_OK;
5074     size_t argc = 4;
5075     napi_value argv[4] = {nullptr};
5076     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5077     if (argc < 1 || argc > 2) { // 2: maximum params num
5078         TLOGE(WmsLogTag::WMS_HIERARCHY, "Argc is invalid: %{public}zu", argc);
5079         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5080     }
5081     int32_t subWindowId = -1;
5082     GetSubWindowId(env, argv[0], errCode, subWindowId);
5083     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
5084         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5085     }
5086 
5087     napi_value lastParam = (argc <= 1) ? nullptr : (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
5088     napi_value result = nullptr;
5089     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
5090     auto asyncTask =
5091         [weakToken = wptr<Window>(windowToken_), subWindowId, errCode, env, task = napiAsyncTask, where = __func__] {
5092             auto window = weakToken.promote();
5093             if (window == nullptr) {
5094                 task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
5095                     "[window][raiseAboveTarget]msg: Window is nullptr"));
5096                 return;
5097             }
5098             if (errCode != WmErrorCode::WM_OK) {
5099                 task->Reject(env, JsErrUtils::CreateJsError(env, errCode,
5100                     "[window][raiseAboveTarget]msg: Invalidate params."));
5101                 return;
5102             }
5103             WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->RaiseAboveTarget(subWindowId));
5104             if (ret == WmErrorCode::WM_OK) {
5105                 task->Resolve(env, NapiGetUndefined(env));
5106             } else {
5107                 task->Reject(env, JsErrUtils::CreateJsError(env, ret,
5108                     "[window][raiseAboveTarget]msg: Window set raiseAboveTarget failed"));
5109             }
5110         };
5111     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnRaiseAboveTarget") != napi_status::napi_ok) {
5112         napiAsyncTask->Reject(env,
5113             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
5114                 "[window][raiseAboveTarget]msg: Failed to send event"));
5115     }
5116     return result;
5117 }
5118 
CheckRaiseMainWindowParams(napi_env env,size_t argc,napi_value argv[],int32_t sourceId,int32_t & targetId)5119 WmErrorCode JsWindow::CheckRaiseMainWindowParams(napi_env env, size_t argc, napi_value argv[],
5120                                                  int32_t sourceId, int32_t& targetId)
5121 {
5122     if (argc != ONE_PARAMS_SIZE || argv[0] == nullptr) {
5123         TLOGE(WmsLogTag::WMS_HIERARCHY, "argc is invalid: %{public}zu", argc);
5124         return WmErrorCode::WM_ERROR_ILLEGAL_PARAM;
5125     }
5126     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], targetId)) {
5127         TLOGE(WmsLogTag::WMS_HIERARCHY, "failed to convert parameter to target window id");
5128         return WmErrorCode::WM_ERROR_ILLEGAL_PARAM;
5129     }
5130     if (targetId <= static_cast<int32_t>(INVALID_WINDOW_ID) || targetId == sourceId) {
5131         TLOGE(WmsLogTag::WMS_HIERARCHY, "target window id is invalid or equals to source window id");
5132         return WmErrorCode::WM_ERROR_ILLEGAL_PARAM;
5133     }
5134     return WmErrorCode::WM_OK;
5135 }
5136 
OnRaiseMainWindowAboveTarget(napi_env env,napi_callback_info info)5137 napi_value JsWindow::OnRaiseMainWindowAboveTarget(napi_env env, napi_callback_info info)
5138 {
5139     WmErrorCode errCode = WmErrorCode::WM_OK;
5140     if (!Permission::IsSystemCallingOrStartByHdcd(true)) {
5141         TLOGE(WmsLogTag::WMS_HIERARCHY, "permission denied, require system application");
5142         errCode = WmErrorCode::WM_ERROR_NOT_SYSTEM_APP;
5143     }
5144     size_t argc = FOUR_PARAMS_SIZE;
5145     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
5146     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5147     int32_t targetId = static_cast<int32_t>(INVALID_WINDOW_ID);
5148     errCode == WmErrorCode::WM_OK ?
5149         CheckRaiseMainWindowParams(env, argc, argv, windowToken_->GetWindowId(), targetId) : errCode;
5150     napi_value lastParam = nullptr;
5151     napi_value result = nullptr;
5152     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
5153     auto asyncTask = [weakToken = wptr<Window>(windowToken_), targetId, env, task = napiAsyncTask, errCode] {
5154         if (errCode != WmErrorCode::WM_OK) {
5155             task->Reject(env, JsErrUtils::CreateJsError(env, errCode,
5156                 "[window][raiseMainWindowAboveTarget]msg: Invalidate params."));
5157             return;
5158         }
5159         auto window = weakToken.promote();
5160         if (window == nullptr) {
5161             TLOGNE(WmsLogTag::WMS_HIERARCHY, "window is nullptr");
5162             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
5163                 "[window][raiseMainWindowAboveTarget]msg: Window is nullptr"));
5164             return;
5165         }
5166         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->RaiseMainWindowAboveTarget(targetId));
5167         if (ret == WmErrorCode::WM_OK) {
5168             task->Resolve(env, NapiGetUndefined(env));
5169         } else {
5170             task->Reject(env, JsErrUtils::CreateJsError(env, ret,
5171                 "[window][raiseMainWindowAboveTarget]msg: Raise main window above target failed"));
5172         }
5173         TLOGNI(WmsLogTag::WMS_HIERARCHY,
5174                "source window: %{public}u, target window: %{public}u, ret = %{public}d",
5175                window->GetWindowId(), targetId, ret);
5176     };
5177     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnRaiseMainWindowAboveTarget") != napi_status::napi_ok) {
5178         napiAsyncTask->Reject(
5179             env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
5180                 "[window][raiseMainWindowAboveTarget]msg: Failed to send event"));
5181     }
5182     return result;
5183 }
5184 
OnKeepKeyboardOnFocus(napi_env env,napi_callback_info info)5185 napi_value JsWindow::OnKeepKeyboardOnFocus(napi_env env, napi_callback_info info)
5186 {
5187     size_t argc = 4;
5188     napi_value argv[4] = {nullptr};
5189     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5190     if (argc < 1) {
5191         WLOGFE("Argc is invalid: %{public}zu", argc);
5192         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5193     }
5194     bool keepKeyboardFlag = false;
5195     napi_value nativeVal = argv[0];
5196     if (nativeVal == nullptr) {
5197         WLOGFE("Failed to get parameter keepKeyboardFlag");
5198         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5199     } else {
5200         WmErrorCode errCode = WmErrorCode::WM_OK;
5201         CHECK_NAPI_RETCODE(errCode, WmErrorCode::WM_ERROR_INVALID_PARAM,
5202             napi_get_value_bool(env, nativeVal, &keepKeyboardFlag));
5203         if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
5204             return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5205         }
5206     }
5207 
5208     if (windowToken_ == nullptr) {
5209         WLOGFE("WindowToken_ is nullptr");
5210         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
5211     }
5212     if (!WindowHelper::IsSystemWindow(windowToken_->GetType()) &&
5213         !WindowHelper::IsSubWindow(windowToken_->GetType())) {
5214         WLOGFE("not allowed since window is not system window or app subwindow");
5215         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
5216     }
5217 
5218     WmErrorCode ret = windowToken_->KeepKeyboardOnFocus(keepKeyboardFlag);
5219     if (ret != WmErrorCode::WM_OK) {
5220         WLOGFE("failed");
5221         return NapiThrowError(env, ret);
5222     }
5223 
5224     WLOGFI("end, window [%{public}u, %{public}s] keepKeyboardFlag=%{public}d",
5225         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), keepKeyboardFlag);
5226 
5227     return NapiGetUndefined(env);
5228 }
5229 
OnSetWindowTouchable(napi_env env,napi_callback_info info)5230 napi_value JsWindow::OnSetWindowTouchable(napi_env env, napi_callback_info info)
5231 {
5232     WmErrorCode errCode = WmErrorCode::WM_OK;
5233     size_t argc = 4;
5234     napi_value argv[4] = {nullptr};
5235     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5236     if (argc < 1) { // 1: params num
5237         WLOGFE("Argc is invalid: %{public}zu", argc);
5238         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
5239     }
5240     bool touchable = true;
5241     if (errCode == WmErrorCode::WM_OK) {
5242         napi_value nativeVal = argv[0];
5243         if (nativeVal == nullptr) {
5244             WLOGFE("Failed to convert parameter to touchable");
5245             errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
5246         } else {
5247             CHECK_NAPI_RETCODE(errCode, WmErrorCode::WM_ERROR_INVALID_PARAM,
5248                 napi_get_value_bool(env, nativeVal, &touchable));
5249         }
5250     }
5251     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
5252         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5253     }
5254 
5255     wptr<Window> weakToken(windowToken_);
5256     napi_value lastParam = (argc <= 1) ? nullptr :
5257         ((argv[1] != nullptr && GetType(env, argv[1]) == napi_function) ? argv[1] : nullptr);
5258     napi_value result = nullptr;
5259     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
5260     auto asyncTask = [weakToken, touchable, env, task = napiAsyncTask] {
5261         auto weakWindow = weakToken.promote();
5262         if (weakWindow == nullptr) {
5263             task->Reject(env,
5264                 JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "Invalidate params."));
5265             return;
5266         }
5267         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(weakWindow->SetTouchable(touchable));
5268         if (ret == WmErrorCode::WM_OK) {
5269             task->Resolve(env, NapiGetUndefined(env));
5270         } else {
5271             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window set touchable failed"));
5272         }
5273         WLOGI("Window [%{public}u, %{public}s] set touchable end",
5274             weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str());
5275     };
5276     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetWindowTouchable") != napi_status::napi_ok) {
5277         napiAsyncTask->Reject(env,
5278             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
5279     }
5280     return result;
5281 }
5282 
OnSetTransparent(napi_env env,napi_callback_info info)5283 napi_value JsWindow::OnSetTransparent(napi_env env, napi_callback_info info)
5284 {
5285     WMError errCode = WMError::WM_OK;
5286     size_t argc = 4;
5287     napi_value argv[4] = {nullptr};
5288     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5289     if (argc < 1 || argc > 2) { // 2: maximum params num
5290         WLOGFE("Argc is invalid: %{public}zu", argc);
5291         errCode = WMError::WM_ERROR_INVALID_PARAM;
5292     }
5293     bool isTransparent = true;
5294     if (errCode == WMError::WM_OK) {
5295         napi_value nativeVal = argv[0];
5296         if (nativeVal == nullptr) {
5297             WLOGFE("Failed to convert parameter to isTransparent");
5298             errCode = WMError::WM_ERROR_INVALID_PARAM;
5299         } else {
5300             CHECK_NAPI_RETCODE(errCode, WMError::WM_ERROR_INVALID_PARAM,
5301                 napi_get_value_bool(env, nativeVal, &isTransparent));
5302         }
5303     }
5304 
5305     napi_value lastParam = (argc <= 1) ? nullptr :
5306         (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
5307     napi_value result = nullptr;
5308     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
5309     auto asyncTask = [env, task = napiAsyncTask, weakToken = wptr<Window>(windowToken_), isTransparent, errCode] {
5310         auto weakWindow = weakToken.promote();
5311         if (weakWindow == nullptr) {
5312             WLOGFE("window is nullptr");
5313             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
5314             return;
5315         }
5316         if (errCode != WMError::WM_OK) {
5317             task->Reject(env, JsErrUtils::CreateJsError(env, errCode, "Invalidate params."));
5318             return;
5319         }
5320         WMError ret = weakWindow->SetTransparent(isTransparent);
5321         if (ret == WMError::WM_OK) {
5322             task->Resolve(env, NapiGetUndefined(env));
5323         } else {
5324             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window set transparent failed"));
5325         }
5326         WLOGI("Window [%{public}u, %{public}s] set transparent end",
5327             weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str());
5328     };
5329     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetTransparent") != napi_status::napi_ok) {
5330         napiAsyncTask->Reject(env,
5331             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
5332     }
5333     return result;
5334 }
5335 
OnSetCallingWindow(napi_env env,napi_callback_info info)5336 napi_value JsWindow::OnSetCallingWindow(napi_env env, napi_callback_info info)
5337 {
5338     WMError errCode = WMError::WM_OK;
5339     size_t argc = 4;
5340     napi_value argv[4] = {nullptr};
5341     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5342     if (argc < 1 || argc > 2) { // 2: maximum params num
5343         TLOGE(WmsLogTag::WMS_LIFE, "Argc is invalid: %{public}zu", argc);
5344         errCode = WMError::WM_ERROR_INVALID_PARAM;
5345     }
5346     uint32_t callingWindow = INVALID_WINDOW_ID;
5347     if (errCode == WMError::WM_OK) {
5348         napi_value nativeVal = argv[0];
5349         if (nativeVal == nullptr) {
5350             TLOGE(WmsLogTag::WMS_LIFE, "Failed to convert parameter to touchable");
5351             errCode = WMError::WM_ERROR_INVALID_PARAM;
5352         } else {
5353             napi_get_value_uint32(env, nativeVal, &callingWindow);
5354         }
5355     }
5356 
5357     wptr<Window> weakToken(windowToken_);
5358     napi_value lastParam = (argc <= 1) ? nullptr : (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
5359     napi_value result = nullptr;
5360     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
5361     auto asyncTask = [weakToken, callingWindow, errCode, env, task = napiAsyncTask] {
5362         auto weakWindow = weakToken.promote();
5363         if (weakWindow == nullptr) {
5364             TLOGNE(WmsLogTag::WMS_LIFE, "window is nullptr");
5365             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
5366             return;
5367         }
5368         if (errCode != WMError::WM_OK) {
5369             task->Reject(env, JsErrUtils::CreateJsError(env, errCode, "Invalidate params."));
5370             return;
5371         }
5372         WMError ret = weakWindow->SetCallingWindow(callingWindow);
5373         if (ret == WMError::WM_OK) {
5374             task->Resolve(env, NapiGetUndefined(env));
5375         } else {
5376             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window set calling window failed"));
5377         }
5378         TLOGNI(WmsLogTag::WMS_LIFE, "Window [%{public}u, %{public}s] set calling window end",
5379             weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str());
5380     };
5381     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetCallingWindow") != napi_status::napi_ok) {
5382         TLOGE(WmsLogTag::WMS_LIFE, "napi send event failed, window state is abnormal");
5383     }
5384     return result;
5385 }
5386 
OnDisableWindowDecor(napi_env env,napi_callback_info info)5387 napi_value JsWindow::OnDisableWindowDecor(napi_env env, napi_callback_info info)
5388 {
5389     if (windowToken_ == nullptr) {
5390         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
5391             "[window][disableWindowDecor]msg: windowToken is nullptr");
5392     }
5393     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->DisableAppWindowDecor());
5394     if (ret != WmErrorCode::WM_OK) {
5395         TLOGE(WmsLogTag::WMS_DECOR, "Window DisableWindowDecor failed");
5396         return NapiThrowError(env, ret);
5397     }
5398     TLOGI(WmsLogTag::WMS_DECOR, "Window [%{public}u, %{public}s] end",
5399         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str());
5400     return NapiGetUndefined(env);
5401 }
5402 
OnSetColorSpace(napi_env env,napi_callback_info info)5403 napi_value JsWindow::OnSetColorSpace(napi_env env, napi_callback_info info)
5404 {
5405     WMError errCode = WMError::WM_OK;
5406     ColorSpace colorSpace = ColorSpace::COLOR_SPACE_DEFAULT;
5407     size_t argc = 4;
5408     napi_value argv[4] = {nullptr};
5409     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5410     if (argc < 1 || argc > 2) { // 2: maximum params num
5411         WLOGFE("Argc is invalid: %{public}zu", argc);
5412         errCode = WMError::WM_ERROR_INVALID_PARAM;
5413     } else {
5414         napi_value nativeType = argv[0];
5415         if (nativeType == nullptr) {
5416             errCode = WMError::WM_ERROR_INVALID_PARAM;
5417             WLOGFE("Failed to convert parameter to ColorSpace");
5418         } else {
5419             uint32_t resultValue = 0;
5420             CHECK_NAPI_RETCODE(errCode, WMError::WM_ERROR_INVALID_PARAM,
5421                 napi_get_value_uint32(env, nativeType, &resultValue));
5422             colorSpace = static_cast<ColorSpace>(resultValue);
5423             if (colorSpace > ColorSpace::COLOR_SPACE_WIDE_GAMUT || colorSpace < ColorSpace::COLOR_SPACE_DEFAULT) {
5424                 WLOGFE("ColorSpace %{public}u invalid!", static_cast<uint32_t>(colorSpace));
5425                 errCode = WMError::WM_ERROR_INVALID_PARAM;
5426             }
5427         }
5428     }
5429 
5430     napi_value lastParam = (argc <= 1) ? nullptr :
5431         (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
5432     napi_value result = nullptr;
5433     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
5434     auto asyncTask = [weakToken = wptr<Window>(windowToken_), colorSpace, errCode, env, task = napiAsyncTask] {
5435         auto weakWindow = weakToken.promote();
5436         if (weakWindow == nullptr) {
5437             WLOGFE("window is nullptr");
5438             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
5439             return;
5440         }
5441         if (errCode != WMError::WM_OK) {
5442             task->Reject(env, JsErrUtils::CreateJsError(env, errCode, "OnSetColorSpace failed"));
5443             WLOGFE("window is nullptr or get invalid param");
5444             return;
5445         }
5446         weakWindow->SetColorSpace(colorSpace);
5447         task->Resolve(env, NapiGetUndefined(env));
5448         WLOGI("Window [%{public}u, %{public}s] OnSetColorSpace end, colorSpace=%{public}u",
5449             weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(), static_cast<uint32_t>(colorSpace));
5450     };
5451     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetColorSpace") != napi_status::napi_ok) {
5452         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
5453         napiAsyncTask->Reject(env,
5454             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
5455     }
5456     return result;
5457 }
5458 
OnSetWindowColorSpace(napi_env env,napi_callback_info info)5459 napi_value JsWindow::OnSetWindowColorSpace(napi_env env, napi_callback_info info)
5460 {
5461     WmErrorCode errCode = WmErrorCode::WM_OK;
5462     ColorSpace colorSpace = ColorSpace::COLOR_SPACE_DEFAULT;
5463     size_t argc = 4;
5464     napi_value argv[4] = {nullptr};
5465     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5466     if (argc < 1) { // 1: params num
5467         WLOGFE("Argc is invalid: %{public}zu", argc);
5468         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
5469     } else {
5470         napi_value nativeType = argv[0];
5471         if (nativeType == nullptr) {
5472             errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
5473             WLOGFE("Failed to convert parameter to ColorSpace");
5474         } else {
5475             uint32_t resultValue = 0;
5476             CHECK_NAPI_RETCODE(errCode, WmErrorCode::WM_ERROR_INVALID_PARAM,
5477                 napi_get_value_uint32(env, nativeType, &resultValue));
5478             colorSpace = static_cast<ColorSpace>(resultValue);
5479             if (colorSpace > ColorSpace::COLOR_SPACE_WIDE_GAMUT || colorSpace < ColorSpace::COLOR_SPACE_DEFAULT) {
5480                 WLOGFE("ColorSpace %{public}u invalid!", static_cast<uint32_t>(colorSpace));
5481                 errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
5482             }
5483         }
5484     }
5485     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
5486         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5487     }
5488 
5489     napi_value lastParam = (argc <= 1) ? nullptr :
5490         ((argv[1] != nullptr && GetType(env, argv[1]) == napi_function) ? argv[1] : nullptr);
5491     napi_value result = nullptr;
5492     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
5493     const char* const where = __func__;
5494     auto asyncTask = [weakToken = wptr<Window>(windowToken_), colorSpace, where, env, task = napiAsyncTask] {
5495         auto weakWindow = weakToken.promote();
5496         if (weakWindow == nullptr) {
5497             WLOGFE("window is nullptr");
5498             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
5499                 "OnSetWindowColorSpace failed"));
5500             return;
5501         }
5502         weakWindow->SetColorSpace(colorSpace);
5503         task->Resolve(env, NapiGetUndefined(env));
5504         WLOGI("%{public}s end, window [%{public}u, %{public}s] colorSpace=%{public}u",
5505             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(),
5506             static_cast<uint32_t>(colorSpace));
5507     };
5508     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetWindowColorSpace") != napi_status::napi_ok) {
5509         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
5510         napiAsyncTask->Reject(env,
5511             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
5512     }
5513     return result;
5514 }
5515 
OnGetColorSpace(napi_env env,napi_callback_info info)5516 napi_value JsWindow::OnGetColorSpace(napi_env env, napi_callback_info info)
5517 {
5518     WMError errCode = WMError::WM_OK;
5519     size_t argc = 4;
5520     napi_value argv[4] = {nullptr};
5521     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5522     if (argc > 1) {
5523         WLOGFE("Argc is invalid: %{public}zu", argc);
5524         errCode = WMError::WM_ERROR_INVALID_PARAM;
5525     }
5526     const char* const where = __func__;
5527 
5528     napi_value lastParam = (argc == 0) ? nullptr :
5529         (GetType(env, argv[0]) == napi_function ? argv[0] : nullptr);
5530     napi_value result = nullptr;
5531     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
5532     auto asyncTask = [weakToken = wptr<Window>(windowToken_), errCode, where, env, task = napiAsyncTask] {
5533         auto weakWindow = weakToken.promote();
5534         if (weakWindow == nullptr) {
5535             WLOGFE("window is nullptr");
5536             task->Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR));
5537             return;
5538         }
5539         if (errCode != WMError::WM_OK) {
5540             task->Reject(env, JsErrUtils::CreateJsError(env, errCode));
5541             WLOGFE("window is nullptr or get invalid param");
5542             return;
5543         }
5544         ColorSpace colorSpace = weakWindow->GetColorSpace();
5545         task->Resolve(env, CreateJsValue(env, static_cast<uint32_t>(colorSpace)));
5546         WLOGI("%{public}s end, window [%{public}u, %{public}s] colorSpace=%{public}u",
5547             where, weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(),
5548             static_cast<uint32_t>(colorSpace));
5549     };
5550     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnGetColorSpace") != napi_status::napi_ok) {
5551         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
5552         napiAsyncTask->Reject(env,
5553             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
5554     }
5555     return result;
5556 }
5557 
OnGetWindowColorSpaceSync(napi_env env,napi_callback_info info)5558 napi_value JsWindow::OnGetWindowColorSpaceSync(napi_env env, napi_callback_info info)
5559 {
5560     if (windowToken_ == nullptr) {
5561         WLOGFE("window is nullptr");
5562         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
5563     }
5564     ColorSpace colorSpace = windowToken_->GetColorSpace();
5565     WLOGFI("end, window [%{public}u, %{public}s] colorSpace=%{public}u",
5566         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), static_cast<uint32_t>(colorSpace));
5567 
5568     return CreateJsValue(env, static_cast<uint32_t>(colorSpace));
5569 }
5570 
OnDump(napi_env env,napi_callback_info info)5571 napi_value JsWindow::OnDump(napi_env env, napi_callback_info info)
5572 {
5573     WLOGFI("[NAPI]");
5574     size_t argc = 4;
5575     napi_value argv[4] = {nullptr};
5576     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5577     if (argc < 1 || argc > 2) { // 2: maximum params num
5578         WLOGFE("Argc is invalid: %{public}zu", argc);
5579         return nullptr;
5580     }
5581     if (windowToken_ == nullptr) {
5582         WLOGFE("window is nullptr or get invalid param");
5583         return nullptr;
5584     }
5585     std::vector<std::string> params;
5586     if (!ConvertNativeValueToVector(env, argv[0], params)) {
5587         WLOGFE("ConvertNativeValueToVector fail");
5588         return nullptr;
5589     }
5590     std::vector<std::string> dumpInfo;
5591     windowToken_->DumpInfo(params, dumpInfo);
5592     napi_value dumpInfoValue = CreateNativeArray(env, dumpInfo);
5593     WLOGI("Window [%{public}u, %{public}s] dump end",
5594         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str());
5595     return dumpInfoValue;
5596 }
5597 
Snapshot(napi_env env,napi_callback_info info)5598 napi_value JsWindow::Snapshot(napi_env env, napi_callback_info info)
5599 {
5600     WLOGI("Snapshot");
5601     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
5602     return (me != nullptr) ? me->OnSnapshot(env, info) : nullptr;
5603 }
5604 
SnapshotSync(napi_env env,napi_callback_info info)5605 napi_value JsWindow::SnapshotSync(napi_env env, napi_callback_info info)
5606 {
5607     TLOGD(WmsLogTag::WMS_ATTRIBUTE, "[NAPI]");
5608     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
5609     return (me != nullptr) ? me->OnSnapshotSync(env, info) : nullptr;
5610 }
5611 
SnapshotIgnorePrivacy(napi_env env,napi_callback_info info)5612 napi_value JsWindow::SnapshotIgnorePrivacy(napi_env env, napi_callback_info info)
5613 {
5614     TLOGD(WmsLogTag::WMS_ATTRIBUTE, "SnapshotIgnorePrivacy");
5615     JsWindow* me = CheckParamsAndGetThis<JsWindow>(env, info);
5616     return (me != nullptr) ? me->OnSnapshotIgnorePrivacy(env, info) : nullptr;
5617 }
5618 
OnSetForbidSplitMove(napi_env env,napi_callback_info info)5619 napi_value JsWindow::OnSetForbidSplitMove(napi_env env, napi_callback_info info)
5620 {
5621     WmErrorCode errCode = WmErrorCode::WM_OK;
5622     size_t argc = 4;
5623     napi_value argv[4] = {nullptr};
5624     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5625     if (argc < 1) { // 1: params num
5626         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
5627     }
5628     bool isForbidSplitMove = false;
5629     if (errCode == WmErrorCode::WM_OK) {
5630         if (argv[0] == nullptr) {
5631             errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
5632         } else {
5633             CHECK_NAPI_RETCODE(errCode, WmErrorCode::WM_ERROR_INVALID_PARAM,
5634                 napi_get_value_bool(env, argv[0], &isForbidSplitMove));
5635         }
5636     }
5637     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
5638         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5639     }
5640     napi_value lastParam = (argc <= 1) ? nullptr :
5641         ((argv[1] != nullptr && GetType(env, argv[1]) == napi_function) ? argv[1] : nullptr);
5642     napi_value result = nullptr;
5643     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
5644     auto asyncTask = [weakToken = wptr<Window>(windowToken_), task = napiAsyncTask, isForbidSplitMove, env] {
5645         auto window = weakToken.promote();
5646         if (window == nullptr) {
5647             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
5648                 "Invalidate params."));
5649             return;
5650         }
5651         WmErrorCode ret;
5652         if (isForbidSplitMove) {
5653             ret = WM_JS_TO_ERROR_CODE_MAP.at(
5654                 window->AddWindowFlag(WindowFlag::WINDOW_FLAG_FORBID_SPLIT_MOVE));
5655         } else {
5656             ret = WM_JS_TO_ERROR_CODE_MAP.at(
5657                 window->RemoveWindowFlag(WindowFlag::WINDOW_FLAG_FORBID_SPLIT_MOVE));
5658         }
5659         if (ret == WmErrorCode::WM_OK) {
5660             task->Resolve(env, NapiGetUndefined(env));
5661         } else {
5662             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window OnSetForbidSplitMove failed."));
5663         }
5664     };
5665     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetForbidSplitMove") != napi_status::napi_ok) {
5666         napiAsyncTask->Reject(env,
5667             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
5668     }
5669     return result;
5670 }
5671 
OnSnapshot(napi_env env,napi_callback_info info)5672 napi_value JsWindow::OnSnapshot(napi_env env, napi_callback_info info)
5673 {
5674     size_t argc = 4;
5675     napi_value argv[4] = {nullptr};
5676     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5677     napi_value lastParam = (argc == 0) ? nullptr :
5678         ((argv[0] != nullptr && GetType(env, argv[0]) == napi_function) ? argv[0] : nullptr);
5679     napi_value result = nullptr;
5680     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
5681     auto asyncTask = [weakToken = wptr<Window>(windowToken_), env, task = napiAsyncTask] {
5682         auto weakWindow = weakToken.promote();
5683         if (weakWindow == nullptr) {
5684             WLOGFE("window is nullptr");
5685             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
5686             return;
5687         }
5688 
5689         std::shared_ptr<Media::PixelMap> pixelMap = weakWindow->Snapshot();
5690         if (pixelMap == nullptr) {
5691             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
5692             WLOGFE("window snapshot get pixelmap is null");
5693             return;
5694         }
5695 
5696         auto nativePixelMap = Media::PixelMapNapi::CreatePixelMap(env, pixelMap);
5697         if (nativePixelMap == nullptr) {
5698             WLOGFE("window snapshot get nativePixelMap is null");
5699         }
5700         task->Resolve(env, nativePixelMap);
5701         WLOGI("Window [%{public}u, %{public}s] OnSnapshot, WxH=%{public}dx%{public}d",
5702             weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str(),
5703             pixelMap->GetWidth(), pixelMap->GetHeight());
5704     };
5705     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSnapshot") != napi_status::napi_ok) {
5706         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
5707         napiAsyncTask->Reject(env,
5708             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
5709     }
5710     return result;
5711 }
5712 
OnSnapshotSync(napi_env env,napi_callback_info info)5713 napi_value JsWindow::OnSnapshotSync(napi_env env, napi_callback_info info)
5714 {
5715     if (windowToken_ == nullptr) {
5716         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "windowToken is null");
5717         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
5718     }
5719     std::shared_ptr<Media::PixelMap> pixelMap = nullptr;
5720     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->Snapshot(pixelMap));
5721     TLOGI(WmsLogTag::WMS_ATTRIBUTE, "winId: %{public}u snapshot end, result: %{public}d",
5722         windowToken_->GetWindowId(), ret);
5723     if (ret != WmErrorCode::WM_OK) {
5724         return NapiThrowError(env, ret);
5725     }
5726     auto nativePixelMap = Media::PixelMapNapi::CreatePixelMap(env, pixelMap);
5727     if (nativePixelMap == nullptr) {
5728         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "winId: %{public}u get nativePixelMap is null",
5729             windowToken_->GetWindowId());
5730         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
5731     }
5732     return nativePixelMap;
5733 }
5734 
OnSnapshotIgnorePrivacy(napi_env env,napi_callback_info info)5735 napi_value JsWindow::OnSnapshotIgnorePrivacy(napi_env env, napi_callback_info info)
5736 {
5737     size_t argc = 4;
5738     napi_value argv[4] = {nullptr};
5739     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5740     napi_value result = nullptr;
5741     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
5742     auto asyncTask = [weakToken = wptr<Window>(windowToken_), env, task = napiAsyncTask] {
5743         auto weakWindow = weakToken.promote();
5744             if (weakWindow == nullptr) {
5745                 TLOGNE(WmsLogTag::WMS_ATTRIBUTE, "window is nullptr");
5746                 task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
5747                 return;
5748             }
5749 
5750             std::shared_ptr<Media::PixelMap> pixelMap = nullptr;
5751             WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(weakWindow->SnapshotIgnorePrivacy(pixelMap));
5752             if (ret == WmErrorCode::WM_ERROR_DEVICE_NOT_SUPPORT) {
5753                 task->Reject(env, JsErrUtils::CreateJsError(env, ret));
5754                 TLOGNE(WmsLogTag::WMS_ATTRIBUTE, "device not support");
5755                 return;
5756             } else if (ret != WmErrorCode::WM_OK) {
5757                 task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
5758                 TLOGNE(WmsLogTag::WMS_ATTRIBUTE, "get pixelmap failed, code:%{public}d", ret);
5759                 return;
5760             }
5761 
5762             auto nativePixelMap = Media::PixelMapNapi::CreatePixelMap(env, pixelMap);
5763             if (nativePixelMap == nullptr) {
5764                 TLOGNE(WmsLogTag::WMS_ATTRIBUTE, "get nativePixelMap is null");
5765                 return;
5766             }
5767             task->Resolve(env, nativePixelMap);
5768             TLOGNI(WmsLogTag::WMS_ATTRIBUTE, "windowId:%{public}u, WxH=%{public}dx%{public}d",
5769                 weakWindow->GetWindowId(), pixelMap->GetWidth(), pixelMap->GetHeight());
5770     };
5771     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSnapshotIgnorePrivacy") != napi_status::napi_ok) {
5772         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "napi_send_event failed");
5773         napiAsyncTask->Reject(env,
5774             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
5775     }
5776     return result;
5777 }
5778 
OnSetSnapshotSkip(napi_env env,napi_callback_info info)5779 napi_value JsWindow::OnSetSnapshotSkip(napi_env env, napi_callback_info info)
5780 {
5781     WmErrorCode errCode = WmErrorCode::WM_OK;
5782     size_t argc = 4;
5783     napi_value argv[4] = {nullptr};
5784     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5785     if (argc < 1) { // 1: params num
5786         WLOGFE(" inbalid param");
5787         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
5788     }
5789     bool isSkip = false;
5790     if (errCode == WmErrorCode::WM_OK) {
5791         napi_value nativeVal = argv[0];
5792         if (nativeVal == nullptr) {
5793             errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
5794         } else {
5795             CHECK_NAPI_RETCODE(errCode, WmErrorCode::WM_ERROR_INVALID_PARAM,
5796                 napi_get_value_bool(env, nativeVal, &isSkip));
5797         }
5798     }
5799     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
5800         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5801     }
5802 
5803     if (windowToken_ == nullptr) {
5804         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
5805     }
5806 
5807     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetSnapshotSkip(isSkip));
5808     if (ret != WmErrorCode::WM_OK) {
5809         WLOGFE("Window SetSnapshotSkip failed");
5810         return NapiThrowError(env, ret);
5811     }
5812     WLOGI("[%{public}u, %{public}s] set snapshotSkip end",
5813         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str());
5814 
5815     return NapiGetUndefined(env);
5816 }
5817 
OnRaiseToAppTop(napi_env env,napi_callback_info info)5818 napi_value JsWindow::OnRaiseToAppTop(napi_env env, napi_callback_info info)
5819 {
5820     size_t argc = 4;
5821     napi_value argv[4] = {nullptr};
5822     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5823     napi_value lastParam = (argc == 0) ? nullptr :
5824         ((argv[0] != nullptr && GetType(env, argv[0]) == napi_function) ? argv[0] : nullptr);
5825     napi_value result = nullptr;
5826     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
5827     auto asyncTask =
5828         [weakToken = wptr<Window>(windowToken_), env, task = napiAsyncTask, where = __func__] {
5829             auto window = weakToken.promote();
5830             if (window == nullptr) {
5831                 TLOGNE(WmsLogTag::WMS_HIERARCHY, "%{public}s: window is nullptr", where);
5832                 task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
5833                     "[window][raiseToAppTop]msg: Window is nullptr"));
5834                 return;
5835             }
5836 
5837             WmErrorCode errCode = WM_JS_TO_ERROR_CODE_MAP.at(window->RaiseToAppTop());
5838             if (errCode != WmErrorCode::WM_OK) {
5839                 TLOGNE(WmsLogTag::WMS_HIERARCHY, "raise window zorder failed");
5840                 task->Reject(env, JsErrUtils::CreateJsError(env, errCode,
5841                     "[window][raiseToAppTop]msg: Raise window zorder failed"));
5842                 return;
5843             }
5844             task->Resolve(env, NapiGetUndefined(env));
5845             TLOGNI(WmsLogTag::WMS_HIERARCHY, "%{public}s: Window [%{public}u, %{public}s] zorder raise success",
5846                 where, window->GetWindowId(), window->GetWindowName().c_str());
5847         };
5848     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnRaiseToAppTop") != napi_status::napi_ok) {
5849         napiAsyncTask->Reject(env,
5850             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
5851                 "[window][raiseToAppTop]msg: Failed to send event"));
5852     }
5853     return result;
5854 }
5855 
OnOpacity(napi_env env,napi_callback_info info)5856 napi_value JsWindow::OnOpacity(napi_env env, napi_callback_info info)
5857 {
5858     size_t argc = 4;
5859     napi_value argv[4] = {nullptr};
5860     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5861     if (argc < 1) {
5862         WLOGFE("Argc is invalid: %{public}zu", argc);
5863         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5864     }
5865     if (windowToken_ == nullptr) {
5866         WLOGFE("WindowToken_ is nullptr");
5867         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
5868     }
5869     if (!WindowHelper::IsSystemWindow(windowToken_->GetType())) {
5870         WLOGFE("Opacity is not allowed since window is not system window");
5871         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
5872     }
5873     napi_value nativeVal = argv[0];
5874     if (nativeVal == nullptr) {
5875         WLOGFE("Failed to convert parameter to alpha");
5876         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5877     }
5878     double alpha = 0.0;
5879     napi_status statusCode = napi_get_value_double(env, nativeVal, &alpha);
5880     if (statusCode != napi_ok) {
5881         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5882     }
5883     if (MathHelper::LessNotEqual(alpha, 0.0) || MathHelper::GreatNotEqual(alpha, 1.0)) {
5884         WLOGFE("alpha should greater than 0 or smaller than 1.0");
5885         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5886     }
5887 
5888     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetAlpha(alpha));
5889     if (ret != WmErrorCode::WM_OK) {
5890         WLOGFE("Window Opacity failed");
5891         return NapiThrowError(env, ret);
5892     }
5893     WLOGFI("end, window [%{public}u, %{public}s] alpha=%{public}f",
5894         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), alpha);
5895     return NapiGetUndefined(env);
5896 }
5897 
IsPivotValid(double data)5898 static bool IsPivotValid(double data)
5899 {
5900     if (MathHelper::LessNotEqual(data, 0.0) || (MathHelper::GreatNotEqual(data, 1.0))) {
5901         return false;
5902     }
5903     return true;
5904 }
5905 
IsScaleValid(double data)5906 static bool IsScaleValid(double data)
5907 {
5908     if (!MathHelper::GreatNotEqual(data, 0.0)) {
5909         return false;
5910     }
5911     return true;
5912 }
5913 
ParseScaleOption(napi_env env,napi_value jsObject,Transform & trans)5914 bool JsWindow::ParseScaleOption(napi_env env, napi_value jsObject, Transform& trans)
5915 {
5916     double data = 0.0f;
5917     if (ParseJsValue(jsObject, env, "pivotX", data)) {
5918         if (!IsPivotValid(data)) {
5919             return false;
5920         }
5921         trans.pivotX_ = data;
5922     }
5923     if (ParseJsValue(jsObject, env, "pivotY", data)) {
5924         if (!IsPivotValid(data)) {
5925             return false;
5926         }
5927         trans.pivotY_ = data;
5928     }
5929     if (ParseJsValue(jsObject, env, "x", data)) {
5930         if (!IsScaleValid(data)) {
5931             return false;
5932         }
5933         trans.scaleX_ = data;
5934     }
5935     if (ParseJsValue(jsObject, env, "y", data)) {
5936         if (!IsScaleValid(data)) {
5937             return false;
5938         }
5939         trans.scaleY_ = data;
5940     }
5941     return true;
5942 }
5943 
OnScale(napi_env env,napi_callback_info info)5944 napi_value JsWindow::OnScale(napi_env env, napi_callback_info info)
5945 {
5946     if (!Permission::IsSystemCalling()) {
5947         TLOGE(WmsLogTag::WMS_SYSTEM, "not system app, permission denied!");
5948         return NapiThrowError(env, WmErrorCode::WM_ERROR_NOT_SYSTEM_APP);
5949     }
5950 
5951     size_t argc = 4;
5952     napi_value argv[4] = {nullptr};
5953     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
5954     if (argc < 1) {
5955         WLOGFE("Argc is invalid: %{public}zu", argc);
5956         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5957     }
5958     if (windowToken_ == nullptr) {
5959         WLOGFE("WindowToken_ is nullptr");
5960         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
5961     }
5962     if (!WindowHelper::IsSystemWindow(windowToken_->GetType())) {
5963         WLOGFE("Scale is not allowed since window is not system window");
5964         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
5965     }
5966     napi_value nativeObj = argv[0];
5967     if (nativeObj == nullptr) {
5968         WLOGFE("Failed to convert object to ScaleOptions");
5969         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5970     }
5971     auto trans = windowToken_->GetTransform();
5972     if (!ParseScaleOption(env, nativeObj, trans)) {
5973         WLOGFE(" PivotX or PivotY should between 0.0 ~ 1.0, scale should greater than 0.0");
5974         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
5975     }
5976     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetTransform(trans));
5977     if (ret != WmErrorCode::WM_OK) {
5978         WLOGFE("Window Scale failed");
5979         return NapiThrowError(env, ret);
5980     }
5981     WLOGI("Window [%{public}u, %{public}s] Scale end",
5982         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str());
5983     WLOGI("scaleX=%{public}f, scaleY=%{public}f, pivotX=%{public}f pivotY=%{public}f",
5984         trans.scaleX_, trans.scaleY_, trans.pivotX_, trans.pivotY_);
5985     return NapiGetUndefined(env);
5986 }
5987 
ParseRotateOption(napi_env env,napi_value jsObject,Transform & trans)5988 bool JsWindow::ParseRotateOption(napi_env env, napi_value jsObject, Transform& trans)
5989 {
5990     double data = 0.0f;
5991     if (ParseJsValue(jsObject, env, "pivotX", data)) {
5992         if (!IsPivotValid(data)) {
5993             return false;
5994         }
5995         trans.pivotX_ = data;
5996     }
5997     if (ParseJsValue(jsObject, env, "pivotY", data)) {
5998         if (!IsPivotValid(data)) {
5999             return false;
6000         }
6001         trans.pivotY_ = data;
6002     }
6003     if (ParseJsValue(jsObject, env, "x", data)) {
6004         trans.rotationX_ = data;
6005     }
6006     if (ParseJsValue(jsObject, env, "y", data)) {
6007         trans.rotationY_ = data;
6008     }
6009     if (ParseJsValue(jsObject, env, "z", data)) {
6010         trans.rotationZ_ = data;
6011     }
6012     return true;
6013 }
6014 
OnRotate(napi_env env,napi_callback_info info)6015 napi_value JsWindow::OnRotate(napi_env env, napi_callback_info info)
6016 {
6017     if (!Permission::IsSystemCalling()) {
6018         TLOGE(WmsLogTag::WMS_SYSTEM, "not system app, permission denied!");
6019         return NapiThrowError(env, WmErrorCode::WM_ERROR_NOT_SYSTEM_APP);
6020     }
6021 
6022     size_t argc = 4;
6023     napi_value argv[4] = {nullptr};
6024     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6025     if (argc < 1) {
6026         WLOGFE("Argc is invalid: %{public}zu", argc);
6027         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6028     }
6029     if (windowToken_ == nullptr) {
6030         WLOGFE("WindowToken_ is nullptr");
6031         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
6032     }
6033     if (!WindowHelper::IsSystemWindow(windowToken_->GetType())) {
6034         WLOGFE("Rotate is not allowed since window is not system window");
6035         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
6036     }
6037     napi_value nativeObj = argv[0];
6038     if (nativeObj == nullptr) {
6039         WLOGFE("Failed to convert object to RotateOptions");
6040         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6041     }
6042     // cannot use sync task since next transform base on current transform
6043     auto trans = windowToken_->GetTransform();
6044     if (!ParseRotateOption(env, nativeObj, trans)) {
6045         WLOGFE(" PivotX or PivotY should between 0.0 ~ 1.0");
6046         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6047     }
6048     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetTransform(trans));
6049     if (ret != WmErrorCode::WM_OK) {
6050         WLOGFE("Window Rotate failed");
6051         return NapiThrowError(env, ret);
6052     }
6053     WLOGI("Window [%{public}u, %{public}s] Rotate end",
6054         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str());
6055     WLOGI("rotateX=%{public}f, rotateY=%{public}f, rotateZ=%{public}f pivotX=%{public}f pivotY=%{public}f",
6056         trans.rotationX_, trans.rotationY_, trans.rotationZ_, trans.pivotX_, trans.pivotY_);
6057     return NapiGetUndefined(env);
6058 }
6059 
ParseTranslateOption(napi_env env,napi_value jsObject,Transform & trans)6060 bool JsWindow::ParseTranslateOption(napi_env env, napi_value jsObject, Transform& trans)
6061 {
6062     double data = 0.0f;
6063     if (ParseJsValue(jsObject, env, "x", data)) {
6064         trans.translateX_ = data;
6065     }
6066     if (ParseJsValue(jsObject, env, "y", data)) {
6067         trans.translateY_ = data;
6068     }
6069     if (ParseJsValue(jsObject, env, "z", data)) {
6070         trans.translateZ_ = data;
6071     }
6072     return true;
6073 }
6074 
OnTranslate(napi_env env,napi_callback_info info)6075 napi_value JsWindow::OnTranslate(napi_env env, napi_callback_info info)
6076 {
6077     if (!Permission::IsSystemCalling()) {
6078         TLOGE(WmsLogTag::WMS_SYSTEM, "not system app, permission denied!");
6079         return NapiThrowError(env, WmErrorCode::WM_ERROR_NOT_SYSTEM_APP);
6080     }
6081 
6082     size_t argc = 4;
6083     napi_value argv[4] = {nullptr};
6084     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6085     if (argc < 1) {
6086         WLOGFE("Argc is invalid: %{public}zu", argc);
6087         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6088     }
6089     if (windowToken_ == nullptr) {
6090         WLOGFE("WindowToken_ is nullptr");
6091         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
6092     }
6093     if (!WindowHelper::IsSystemWindow(windowToken_->GetType())) {
6094         WLOGFE("Translate is not allowed since window is not system window");
6095         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
6096     }
6097     napi_value nativeObj = argv[0];
6098     if (nativeObj == nullptr) {
6099         WLOGFE("Failed to convert object to TranslateOptions");
6100         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6101     }
6102     auto trans = windowToken_->GetTransform();
6103     if (!ParseTranslateOption(env, nativeObj, trans)) {
6104         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6105     }
6106     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetTransform(trans));
6107     if (ret != WmErrorCode::WM_OK) {
6108         WLOGFE("Window Translate failed");
6109         return NapiThrowError(env, ret);
6110     }
6111     WLOGI("Window [%{public}u, %{public}s] Translate end, "
6112         "translateX=%{public}f, translateY=%{public}f, translateZ=%{public}f",
6113         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(),
6114         trans.translateX_, trans.translateY_, trans.translateZ_);
6115     return NapiGetUndefined(env);
6116 }
6117 
CreateTransitionController(napi_env env)6118 WmErrorCode JsWindow::CreateTransitionController(napi_env env)
6119 {
6120     if (windowToken_ == nullptr) {
6121         TLOGE(WmsLogTag::WMS_SYSTEM, "windowToken is nullptr");
6122         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
6123     }
6124     if (!WindowHelper::IsSystemWindow(windowToken_->GetType())) {
6125         TLOGE(WmsLogTag::WMS_SYSTEM, "Unexpected window type:%{public}d", windowToken_->GetType());
6126         return WmErrorCode::WM_ERROR_INVALID_CALLING;
6127     }
6128     napi_value objValue = nullptr;
6129     napi_create_object(env, &objValue);
6130     if (objValue == nullptr) {
6131         TLOGE(WmsLogTag::WMS_SYSTEM, "Failed to convert to TransitionController Object");
6132         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
6133     }
6134     auto name = GetWindowName();
6135     std::shared_ptr<NativeReference> jsWindowObj = FindJsWindowObject(name);
6136     if (jsWindowObj == nullptr || jsWindowObj->GetNapiValue() == nullptr) {
6137         TLOGE(WmsLogTag::WMS_SYSTEM, "FindJsWindowObject failed");
6138         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
6139     }
6140     sptr<JsTransitionController> nativeController = new JsTransitionController(
6141         env, jsWindowObj, windowToken_);
6142     auto nativeControllerVal = new wptr<JsTransitionController>(nativeController);
6143     auto finalizer = [](napi_env, void* data, void*) {
6144         TLOGNI(WmsLogTag::WMS_SYSTEM, "Finalizer for wptr JsTransitionController called");
6145         delete static_cast<wptr<JsTransitionController>*>(data);
6146     };
6147     if (napi_wrap(env, objValue, nativeControllerVal, finalizer, nullptr, nullptr) != napi_ok) {
6148         finalizer(env, nativeControllerVal, nullptr);
6149         TLOGE(WmsLogTag::WMS_SYSTEM, "Failed to wrap TransitionController Object");
6150         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
6151     };
6152     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->RegisterAnimationTransitionController(nativeController));
6153     napi_ref result = nullptr;
6154     napi_create_reference(env, objValue, 1, &result);
6155     jsTransControllerObj_.reset(reinterpret_cast<NativeReference*>(result));
6156     nativeController->SetJsController(jsTransControllerObj_);
6157     TLOGE(WmsLogTag::WMS_SYSTEM, "Window [%{public}u, %{public}s] create success",
6158         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str());
6159     return ret;
6160 }
6161 
OnGetTransitionController(napi_env env,napi_callback_info info)6162 napi_value JsWindow::OnGetTransitionController(napi_env env, napi_callback_info info)
6163 {
6164     if (!Permission::IsSystemCalling()) {
6165         TLOGE(WmsLogTag::WMS_SYSTEM, "not system app, permission denied!");
6166         return NapiThrowError(env, WmErrorCode::WM_ERROR_NOT_SYSTEM_APP);
6167     }
6168 
6169     if (windowToken_ == nullptr) {
6170         TLOGE(WmsLogTag::WMS_SYSTEM, "windowToken is nullptr");
6171         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
6172     }
6173     if (!WindowHelper::IsSystemWindow(windowToken_->GetType())) {
6174         TLOGE(WmsLogTag::WMS_SYSTEM, "Unexpected window type:%{public}d", windowToken_->GetType());
6175         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
6176     }
6177     if (jsTransControllerObj_ == nullptr || jsTransControllerObj_->GetNapiValue() == nullptr) {
6178         WmErrorCode ret = CreateTransitionController(env);
6179         if (ret != WmErrorCode::WM_OK) {
6180             TLOGE(WmsLogTag::WMS_SYSTEM, "CreateTransitionController failed, error code:%{public}d", ret);
6181             napi_throw(env, JsErrUtils::CreateJsError(env, ret));
6182         }
6183     }
6184     return jsTransControllerObj_ == nullptr ? nullptr : jsTransControllerObj_->GetNapiValue();
6185 }
6186 
OnSetCornerRadius(napi_env env,napi_callback_info info)6187 napi_value JsWindow::OnSetCornerRadius(napi_env env, napi_callback_info info)
6188 {
6189     if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
6190         TLOGE(WmsLogTag::WMS_SYSTEM, "Permission denied!");
6191         return NapiThrowError(env, WmErrorCode::WM_ERROR_NOT_SYSTEM_APP);
6192     }
6193 
6194     size_t argc = 4;
6195     napi_value argv[4] = {nullptr};
6196     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6197     if (argc < 1) {
6198         TLOGE(WmsLogTag::WMS_SYSTEM, "Argc is invalid: %{public}zu", argc);
6199         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6200     }
6201     if (windowToken_ == nullptr) {
6202         TLOGE(WmsLogTag::WMS_SYSTEM, "windowToken is nullptr");
6203         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
6204     }
6205     if (!WindowHelper::IsSystemWindow(windowToken_->GetType())) {
6206         TLOGE(WmsLogTag::WMS_SYSTEM, "Unexpected window type:%{public}d", windowToken_->GetType());
6207         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
6208     }
6209     napi_value nativeVal = argv[0];
6210     if (nativeVal == nullptr) {
6211         TLOGE(WmsLogTag::WMS_SYSTEM, "Invalid radius due to nativeVal is nullptr");
6212         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6213     }
6214     double radius = 0.0;
6215     napi_status statusCode = napi_get_value_double(env, nativeVal, &radius);
6216     if (statusCode != napi_ok) {
6217         TLOGE(WmsLogTag::WMS_SYSTEM, "napi get radius value failed");
6218         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6219     }
6220     if (MathHelper::LessNotEqual(radius, 0.0)) {
6221         TLOGE(WmsLogTag::WMS_SYSTEM, "Invalid radius:%{public}f", radius);
6222         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6223     }
6224     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetCornerRadius(radius));
6225     if (ret != WmErrorCode::WM_OK) {
6226         TLOGE(WmsLogTag::WMS_SYSTEM, "SetCornerRadius failed:%{public}d", ret);
6227         return NapiThrowError(env, ret);
6228     }
6229     TLOGI(WmsLogTag::WMS_SYSTEM, "Window [%{public}u, %{public}s] set success, radius=%{public}f",
6230         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), radius);
6231     return NapiGetUndefined(env);
6232 }
6233 
OnSetWindowCornerRadius(napi_env env,napi_callback_info info)6234 napi_value JsWindow::OnSetWindowCornerRadius(napi_env env, napi_callback_info info)
6235 {
6236     size_t argc = FOUR_PARAMS_SIZE;
6237     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
6238     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6239     if (argc != ARG_COUNT_ONE) {
6240         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Argc is invalid: %{public}zu", argc);
6241         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6242     }
6243     double radius = 0.0;
6244     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], radius)) {
6245         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Failed to convert parameter to radius");
6246         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6247     }
6248     float cornerRadius = static_cast<float>(radius);
6249     if (MathHelper::LessNotEqual(cornerRadius, 0.0f)) {
6250         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "The corner radius is less than zero.");
6251         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6252     }
6253 
6254     const char* const where = __func__;
6255     napi_value result = nullptr;
6256     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
6257     auto asyncTask = [weakWindow = wptr(windowToken_), where, env, task = napiAsyncTask, cornerRadius] {
6258         auto window = weakWindow.promote();
6259         if (window == nullptr) {
6260             TLOGNE(WmsLogTag::WMS_ATTRIBUTE, "%{public}s window is nullptr", where);
6261             WmErrorCode wmErrorCode = WM_JS_TO_ERROR_CODE_MAP.at(WMError::WM_ERROR_NULLPTR);
6262             task->Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode,
6263                 "[window][setWindowCornerRadius]msg:native window is nullptr."));
6264             return;
6265         }
6266         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->SetWindowCornerRadius(cornerRadius));
6267         if (ret != WmErrorCode::WM_OK) {
6268             TLOGNE(WmsLogTag::WMS_ATTRIBUTE, "Set failed!");
6269             task->Reject(env, JsErrUtils::CreateJsError(env, ret,
6270                 "[window][setWindowCornerRadius]msg:set window corner radius failed."));
6271         } else {
6272             TLOGNI(WmsLogTag::WMS_ATTRIBUTE, "Window [%{public}u, %{public}s] set success.",
6273                 window->GetWindowId(), window->GetWindowName().c_str());
6274             task->Resolve(env, NapiGetUndefined(env));
6275         }
6276     };
6277     napi_status status = napi_send_event(env, std::move(asyncTask), napi_eprio_high, "OnSetWindowCornerRadius");
6278     if (status != napi_status::napi_ok) {
6279         napiAsyncTask->Reject(env,
6280             CreateJsError(env, static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY),
6281                 "[window][setWindowCornerRadius]msg:send event failed"));
6282     }
6283     return result;
6284 }
6285 
OnGetWindowCornerRadius(napi_env env,napi_callback_info info)6286 napi_value JsWindow::OnGetWindowCornerRadius(napi_env env, napi_callback_info info)
6287 {
6288     size_t argc = FOUR_PARAMS_SIZE;
6289     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
6290     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6291     if (argc > ARG_COUNT_ZERO) {
6292         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Argc is invalid: %{public}zu", argc);
6293         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6294     }
6295     if (windowToken_ == nullptr) {
6296         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "WindowToken is nullptr.");
6297         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
6298             "[window][getWindowCornerRadius]msg:native window is nullptr.");
6299     }
6300     if (!WindowHelper::IsFloatOrSubWindow(windowToken_->GetType())) {
6301         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "This is not sub window or float window.");
6302         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
6303     }
6304 
6305     float cornerRadius = 0.0f;
6306     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->GetWindowCornerRadius(cornerRadius));
6307     if (ret != WmErrorCode::WM_OK) {
6308         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Get failed, cornerRadius: %{public}f.", cornerRadius);
6309         return NapiThrowError(env, ret, "[window][getWindowCornerRadius]msg:get window corner radius failed.");
6310     }
6311     napi_value jsCornerRadius = CreateJsValue(env, cornerRadius);
6312     if (jsCornerRadius == nullptr) {
6313         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "jsCornerRadius is nullptr");
6314         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
6315             "[window][getWindowCornerRadius]msg:convert corner radius to js value failed.");
6316     }
6317     TLOGI(WmsLogTag::WMS_ATTRIBUTE, "Window [%{public}u, %{public}s] Get success, cornerRadius=%{public}f.",
6318         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), cornerRadius);
6319     return jsCornerRadius;
6320 }
6321 
OnSetShadow(napi_env env,napi_callback_info info)6322 napi_value JsWindow::OnSetShadow(napi_env env, napi_callback_info info)
6323 {
6324     WmErrorCode ret = WmErrorCode::WM_OK;
6325     double radius;
6326     std::shared_ptr<ShadowsInfo> shadowsInfo = std::make_shared<ShadowsInfo>();
6327     size_t argc = 4;
6328     napi_value argv[4] = {nullptr};
6329     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6330 
6331     if (argc < 1) { // 1: min param num
6332         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6333     }
6334     if (windowToken_ == nullptr) {
6335         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
6336     }
6337     if (!WindowHelper::IsSystemWindow(windowToken_->GetType()) &&
6338         !WindowHelper::IsSubWindow(windowToken_->GetType())) {
6339         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
6340     }
6341 
6342     if (argv[0] == nullptr) {
6343         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6344     }
6345     napi_status statusCode = napi_get_value_double(env, argv[0], &radius);
6346     if (statusCode != napi_ok) {
6347         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6348     }
6349     if (MathHelper::LessNotEqual(radius, 0.0)) {
6350         return NapiThrowError(env,  WmErrorCode::WM_ERROR_INVALID_PARAM);
6351     }
6352     ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetShadowRadius(radius));
6353     shadowsInfo->radius_ = radius;
6354     shadowsInfo->hasRadiusValue_ = true;
6355 
6356     ParseShadowOptionalParameters(ret, shadowsInfo, env, argv, argc);
6357     if (ret != WmErrorCode::WM_OK) {
6358         napi_throw(env, JsErrUtils::CreateJsError(env, ret));
6359     }
6360 
6361     WmErrorCode syncShadowsRet = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SyncShadowsToComponent(*shadowsInfo));
6362     if (syncShadowsRet != WmErrorCode::WM_OK) {
6363         TLOGE(WmsLogTag::WMS_ANIMATION, "Sync shadows to component failed! ret:  %{public}u",
6364             static_cast<int32_t>(syncShadowsRet));
6365     }
6366     return NapiGetUndefined(env);
6367 }
6368 
ParseShadowOptionalParameters(WmErrorCode & ret,std::shared_ptr<ShadowsInfo> & shadowsInfo,napi_env env,const napi_value * argv,size_t argc)6369 void JsWindow::ParseShadowOptionalParameters(WmErrorCode& ret, std::shared_ptr<ShadowsInfo>& shadowsInfo,
6370     napi_env env, const napi_value* argv, size_t argc)
6371 {
6372     std::string color;
6373     double offsetX;
6374     double offsetY;
6375     if ((ret == WmErrorCode::WM_OK) && (argc >= 2)) { // parse the 2nd param: color
6376         if (ConvertFromJsValue(env, argv[1], color)) {
6377             ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetShadowColor(color));
6378             shadowsInfo->color_ = color;
6379             shadowsInfo->hasColorValue_ = true;
6380         }
6381     }
6382     if ((ret == WmErrorCode::WM_OK) && argc >= 3) { // parse the 3rd param: offsetX
6383         if (argv[2] != nullptr) { // 2: the 3rd param
6384             napi_get_value_double(env, argv[2], &offsetX);
6385             ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetShadowOffsetX(offsetX));
6386             shadowsInfo->offsetX_ = offsetX;
6387             shadowsInfo->hasOffsetXValue_ = true;
6388         }
6389     }
6390     if ((ret == WmErrorCode::WM_OK) && argc >= 4) { // parse the 4th param: offsetY
6391         if (argv[3] != nullptr) {  // 3: the 4th param
6392             napi_get_value_double(env, argv[3], &offsetY);
6393             ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetShadowOffsetY(offsetY));
6394             shadowsInfo->offsetY_ = offsetY;
6395             shadowsInfo->hasOffsetYValue_ = true;
6396         }
6397     }
6398 }
6399 
OnSetWindowShadowRadius(napi_env env,napi_callback_info info)6400 napi_value JsWindow::OnSetWindowShadowRadius(napi_env env, napi_callback_info info)
6401 {
6402     size_t argc = FOUR_PARAMS_SIZE;
6403     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
6404     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6405     if (argc != ARG_COUNT_ONE) {
6406         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Argc is invalid: %{public}zu", argc);
6407         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6408     }
6409     if (windowToken_ == nullptr) {
6410         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "WindowToken is nullptr.");
6411         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
6412             "[window][setWindowShadowRadius]msg:native window is nullptr");
6413     }
6414     if (!WindowHelper::IsFloatOrSubWindow(windowToken_->GetType())) {
6415         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "This is not sub window or float window.");
6416         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
6417     }
6418 
6419     double result = 0.0;
6420     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], result)) {
6421         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Napi get radius value failed.");
6422         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6423     }
6424     float radius = static_cast<float>(result);
6425     if (MathHelper::LessNotEqual(radius, 0.0f)) {
6426         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "The shadow radius is less than zero.");
6427         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6428     }
6429     std::shared_ptr<ShadowsInfo> shadowsInfo = std::make_shared<ShadowsInfo>();
6430     shadowsInfo->radius_ = result;
6431     shadowsInfo->hasRadiusValue_ = true;
6432     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetWindowShadowRadius(radius));
6433     if (ret != WmErrorCode::WM_OK) {
6434         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Set failed, radius: %{public}f.", radius);
6435         return NapiThrowError(env, ret, "[window][setWindowShadowRadius]msg:set shadow radius failed");
6436     }
6437     WmErrorCode syncShadowsRet = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SyncShadowsToComponent(*shadowsInfo));
6438     if (syncShadowsRet != WmErrorCode::WM_OK) {
6439         TLOGE(WmsLogTag::WMS_ANIMATION, "Sync shadows to component fail! ret:  %{public}u",
6440             static_cast<int32_t>(syncShadowsRet));
6441         return NapiThrowError(env, syncShadowsRet,
6442             "[window][setWindowShadowRadius]msg:sync shadows to component failed");
6443     }
6444     TLOGI(WmsLogTag::WMS_ATTRIBUTE, "Window [%{public}u, %{public}s] set success, radius=%{public}f.",
6445         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), radius);
6446     return NapiGetUndefined(env);
6447 }
6448 
OnSetBlur(napi_env env,napi_callback_info info)6449 napi_value JsWindow::OnSetBlur(napi_env env, napi_callback_info info)
6450 {
6451     size_t argc = 4;
6452     napi_value argv[4] = {nullptr};
6453     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6454     if (argc < 1) {
6455         TLOGE(WmsLogTag::WMS_SYSTEM, "Argc is invalid: %{public}zu", argc);
6456         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6457     }
6458     if (windowToken_ == nullptr) {
6459         TLOGE(WmsLogTag::WMS_SYSTEM, "windowToken is nullptr");
6460         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
6461     }
6462     if (!WindowHelper::IsSystemWindow(windowToken_->GetType())) {
6463         TLOGE(WmsLogTag::WMS_SYSTEM, "Unexpected window type:%{public}d", windowToken_->GetType());
6464         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
6465     }
6466     napi_value nativeVal = argv[0];
6467     if (nativeVal == nullptr) {
6468         TLOGE(WmsLogTag::WMS_SYSTEM, "nativeVal is nullptr");
6469         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6470     }
6471     double radius = 0.0;
6472     napi_status statusCode = napi_get_value_double(env, nativeVal, &radius);
6473     if (statusCode != napi_ok) {
6474         TLOGE(WmsLogTag::WMS_SYSTEM, "napi get radius value failed");
6475         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6476     }
6477     if (MathHelper::LessNotEqual(radius, 0.0)) {
6478         TLOGE(WmsLogTag::WMS_SYSTEM, "Invalid radius:%{public}f", radius);
6479         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6480     }
6481     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetBlur(radius));
6482     if (ret != WmErrorCode::WM_OK) {
6483         TLOGE(WmsLogTag::WMS_SYSTEM, "failed:%{public}d", ret);
6484         return NapiThrowError(env, ret);
6485     }
6486     TLOGI(WmsLogTag::WMS_SYSTEM, "end, window [%{public}u, %{public}s] radius=%{public}f",
6487         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), radius);
6488     return NapiGetUndefined(env);
6489 }
6490 
OnSetBackdropBlur(napi_env env,napi_callback_info info)6491 napi_value JsWindow::OnSetBackdropBlur(napi_env env, napi_callback_info info)
6492 {
6493     size_t argc = 4;
6494     napi_value argv[4] = {nullptr};
6495     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6496     if (argc < 1) {
6497         TLOGE(WmsLogTag::WMS_SYSTEM, "Argc is invalid: %{public}zu", argc);
6498         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6499     }
6500     if (windowToken_ == nullptr) {
6501         TLOGE(WmsLogTag::WMS_SYSTEM, "windowToken is nullptr");
6502         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
6503     }
6504     if (!WindowHelper::IsSystemWindow(windowToken_->GetType())) {
6505         TLOGE(WmsLogTag::WMS_SYSTEM, "Unexpected window type:%{public}d", windowToken_->GetType());
6506         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
6507     }
6508     napi_value nativeVal = argv[0];
6509     if (nativeVal == nullptr) {
6510         TLOGE(WmsLogTag::WMS_SYSTEM, "Invalid radius due to nativeVal is nullptr");
6511         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6512     }
6513     double radius = 0.0;
6514     napi_status statusCode = napi_get_value_double(env, nativeVal, &radius);
6515     if (statusCode != napi_ok) {
6516         TLOGE(WmsLogTag::WMS_SYSTEM, "napi get radius value failed");
6517         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6518     }
6519     if (MathHelper::LessNotEqual(radius, 0.0)) {
6520         TLOGE(WmsLogTag::WMS_SYSTEM, "Invalid radius:%{public}f", radius);
6521         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6522     }
6523     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetBackdropBlur(radius));
6524     if (ret != WmErrorCode::WM_OK) {
6525         TLOGE(WmsLogTag::WMS_SYSTEM, "failed:%{public}d", ret);
6526         return NapiThrowError(env, ret);
6527     }
6528     TLOGI(WmsLogTag::WMS_SYSTEM, "Window [%{public}u, %{public}s] set success, radius=%{public}f",
6529         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), radius);
6530     return NapiGetUndefined(env);
6531 }
6532 
OnSetBackdropBlurStyle(napi_env env,napi_callback_info info)6533 napi_value JsWindow::OnSetBackdropBlurStyle(napi_env env, napi_callback_info info)
6534 {
6535     size_t argc = 4;
6536     napi_value argv[4] = {nullptr};
6537     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6538     if (argc < 1) {
6539         TLOGE(WmsLogTag::WMS_SYSTEM, "Argc is invalid: %{public}zu", argc);
6540         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6541     }
6542     if (windowToken_ == nullptr) {
6543         TLOGE(WmsLogTag::WMS_SYSTEM, "windowToken is nullptr");
6544         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
6545     }
6546     if (!WindowHelper::IsSystemWindow(windowToken_->GetType())) {
6547         TLOGE(WmsLogTag::WMS_SYSTEM, "Unexpected window type:%{public}d", windowToken_->GetType());
6548         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
6549     }
6550 
6551     napi_value nativeMode = argv[0];
6552     if (nativeMode == nullptr) {
6553         TLOGE(WmsLogTag::WMS_SYSTEM, "nativeMode is nullptr");
6554         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6555     }
6556     uint32_t resultValue = 0;
6557     napi_status statusCode = napi_get_value_uint32(env, nativeMode, &resultValue);
6558     if (statusCode != napi_ok) {
6559         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6560     }
6561     if (resultValue > static_cast<uint32_t>(WindowBlurStyle::WINDOW_BLUR_THICK)) {
6562         TLOGE(WmsLogTag::WMS_SYSTEM, "Invalid window blur style:%{public}u", resultValue);
6563         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6564     }
6565     WindowBlurStyle style = static_cast<WindowBlurStyle>(resultValue);
6566     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetBackdropBlurStyle(style));
6567     if (ret != WmErrorCode::WM_OK) {
6568         TLOGE(WmsLogTag::WMS_SYSTEM, "set failed: %{public}d", ret);
6569         return NapiThrowError(env, ret);
6570     }
6571 
6572     TLOGI(WmsLogTag::WMS_SYSTEM, "Window [%{public}u, %{public}s] set success, style=%{public}u",
6573         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), style);
6574     return NapiGetUndefined(env);
6575 }
6576 
OnSetWaterMarkFlag(napi_env env,napi_callback_info info)6577 napi_value JsWindow::OnSetWaterMarkFlag(napi_env env, napi_callback_info info)
6578 {
6579     size_t argc = 4;
6580     napi_value argv[4] = {nullptr};
6581     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6582     if (argc < 1) {
6583         WLOGFE("Argc is invalid: %{public}zu", argc);
6584         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6585     }
6586 
6587     napi_value nativeBool = argv[0];
6588     if (nativeBool == nullptr) {
6589         WLOGFE("Invalid window flag");
6590         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6591     }
6592 
6593     bool isAddSafetyLayer = false;
6594     napi_status statusCode = napi_get_value_bool(env, nativeBool, &isAddSafetyLayer);
6595     if (statusCode != napi_ok) {
6596         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6597     }
6598     const char* const where = __func__;
6599     napi_value lastParam = (argc == 1) ? nullptr :
6600         (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
6601     napi_value result = nullptr;
6602     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
6603     auto asyncTask = [weakToken = wptr<Window>(windowToken_), isAddSafetyLayer, where, env, task = napiAsyncTask] {
6604         auto window = weakToken.promote();
6605         if (window == nullptr) {
6606             task->Reject(env,
6607                 JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
6608                 "OnSetWaterMarkFlag failed."));
6609             return;
6610         }
6611         WMError ret = WMError::WM_OK;
6612         if (isAddSafetyLayer) {
6613             ret = window->AddWindowFlag(WindowFlag::WINDOW_FLAG_WATER_MARK);
6614         } else {
6615             ret = window->RemoveWindowFlag(WindowFlag::WINDOW_FLAG_WATER_MARK);
6616         }
6617         if (ret == WMError::WM_OK) {
6618             task->Resolve(env, NapiGetUndefined(env));
6619         } else {
6620             task->Reject(env, JsErrUtils::CreateJsError(env, WM_JS_TO_ERROR_CODE_MAP.at(ret),
6621                 "SetWaterMarkFlag failed."));
6622         }
6623         WLOGI("%{public}s end, window [%{public}u, %{public}s] ret=%{public}d",
6624             where, window->GetWindowId(), window->GetWindowName().c_str(), ret);
6625     };
6626     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetWaterMarkFlag") != napi_status::napi_ok) {
6627         TLOGE(WmsLogTag::WMS_IMMS, "napi_send_event failed");
6628         napiAsyncTask->Reject(env,
6629             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
6630     }
6631     return result;
6632 }
6633 
OnSetHandwritingFlag(napi_env env,napi_callback_info info)6634 napi_value JsWindow::OnSetHandwritingFlag(napi_env env, napi_callback_info info)
6635 {
6636     size_t argc = 4;
6637     napi_value argv[4] = {nullptr};
6638     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6639     if (argc < 1) {
6640         WLOGFE("Argc is invalid: %{public}zu", argc);
6641         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6642     }
6643 
6644     napi_value nativeBool = argv[0];
6645     if (nativeBool == nullptr) {
6646         WLOGFE("SetHandwritingFlag Invalid window flag");
6647         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6648     }
6649     bool isAddFlag = false;
6650     napi_get_value_bool(env, nativeBool, &isAddFlag);
6651     wptr<Window> weakToken(windowToken_);
6652     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
6653     NapiAsyncTask::ExecuteCallback execute = [weakToken, isAddFlag, errCodePtr] {
6654         if (errCodePtr == nullptr) {
6655             return;
6656         }
6657         auto weakWindow = weakToken.promote();
6658         if (weakWindow == nullptr) {
6659             *errCodePtr = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
6660             return;
6661         }
6662         WMError ret = isAddFlag ? weakWindow->AddWindowFlag(WindowFlag::WINDOW_FLAG_HANDWRITING) :
6663             weakWindow->RemoveWindowFlag(WindowFlag::WINDOW_FLAG_HANDWRITING);
6664         *errCodePtr = WM_JS_TO_ERROR_CODE_MAP.at(ret);
6665         WLOGI("Window [%{public}u, %{public}s] set handwriting flag on end",
6666             weakWindow->GetWindowId(), weakWindow->GetWindowName().c_str());
6667     };
6668     NapiAsyncTask::CompleteCallback complete =
6669         [weakToken, isAddFlag, errCodePtr](napi_env env, NapiAsyncTask& task, int32_t status) {
6670             if (errCodePtr == nullptr) {
6671                 task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
6672                     "System abnormal."));
6673                 return;
6674             }
6675             if (*errCodePtr == WmErrorCode::WM_OK) {
6676                 task.Resolve(env, NapiGetUndefined(env));
6677             } else {
6678                 task.Reject(env, JsErrUtils::CreateJsError(env, *errCodePtr, "SetHandwritingFlag failed."));
6679             }
6680         };
6681 
6682     napi_value lastParam = (argc == 1) ? nullptr : (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
6683     napi_value result = nullptr;
6684     NapiAsyncTask::Schedule("JsWindow::OnSetHandwritingFlag",
6685         env, CreateAsyncTaskWithLastParam(env, lastParam, std::move(execute), std::move(complete), &result));
6686     return result;
6687 }
6688 
OnSetAspectRatio(napi_env env,napi_callback_info info)6689 napi_value JsWindow::OnSetAspectRatio(napi_env env, napi_callback_info info)
6690 {
6691     WMError errCode = WMError::WM_OK;
6692     size_t argc = 4;
6693     napi_value argv[4] = {nullptr};
6694     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6695     if (argc < 1 || argc > 2) { // 2: maximum params num
6696         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
6697         errCode = WMError::WM_ERROR_INVALID_PARAM;
6698     }
6699 
6700     if (windowToken_ == nullptr) {
6701         TLOGE(WmsLogTag::WMS_LAYOUT, "WindowToken is nullptr");
6702         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
6703     }
6704 
6705     if (!WindowHelper::IsMainWindow(windowToken_->GetType())) {
6706         TLOGE(WmsLogTag::WMS_LAYOUT, "SetAspectRatio is not allowed since window is main window");
6707         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
6708     }
6709 
6710     double aspectRatio = 0.0;
6711     if (errCode == WMError::WM_OK) {
6712         napi_value nativeVal = argv[0];
6713         if (nativeVal == nullptr) {
6714             errCode = WMError::WM_ERROR_INVALID_PARAM;
6715         } else {
6716             CHECK_NAPI_RETCODE(errCode, WMError::WM_ERROR_INVALID_PARAM,
6717                 napi_get_value_double(env, nativeVal, &aspectRatio));
6718         }
6719     }
6720 
6721     if (errCode == WMError::WM_ERROR_INVALID_PARAM || aspectRatio <= 0.0) {
6722         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6723     }
6724 
6725     napi_value lastParam = (argc == 1) ? nullptr : (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
6726     napi_value result = nullptr;
6727     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
6728     auto asyncTask =
6729         [weakToken = wptr<Window>(windowToken_), task = napiAsyncTask, aspectRatio, where = __func__, env] {
6730             auto window = weakToken.promote();
6731             if (window == nullptr) {
6732                 task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
6733                     "OnSetAspectRatio failed."));
6734                 return;
6735             }
6736             WMError ret = window->SetAspectRatio(aspectRatio);
6737             if (ret == WMError::WM_OK) {
6738                 task->Resolve(env, NapiGetUndefined(env));
6739             } else {
6740                 task->Reject(env, JsErrUtils::CreateJsError(env, WM_JS_TO_ERROR_CODE_MAP.at(ret),
6741                     "SetAspectRatio failed."));
6742             }
6743             TLOGNI(WmsLogTag::WMS_LAYOUT, "%{public}s: end, window [%{public}u, %{public}s] ret=%{public}d",
6744                 where, window->GetWindowId(), window->GetWindowName().c_str(), ret);
6745         };
6746     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetAspectRatio") != napi_status::napi_ok) {
6747         napiAsyncTask->Reject(env,
6748             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
6749     }
6750     return result;
6751 }
6752 
OnResetAspectRatio(napi_env env,napi_callback_info info)6753 napi_value JsWindow::OnResetAspectRatio(napi_env env, napi_callback_info info)
6754 {
6755     size_t argc = 4;
6756     napi_value argv[4] = {nullptr};
6757     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6758     if (argc > 1) {
6759         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
6760         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6761     }
6762 
6763     if (windowToken_ == nullptr) {
6764         TLOGE(WmsLogTag::WMS_LAYOUT, "WindowToken is nullptr");
6765         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
6766     }
6767 
6768     if (!WindowHelper::IsMainWindow(windowToken_->GetType())) {
6769         TLOGE(WmsLogTag::WMS_LAYOUT, "ResetAspectRatio is not allowed since window is main window");
6770         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
6771     }
6772 
6773     napi_value lastParam = (argc == 0) ? nullptr :
6774         (GetType(env, argv[0]) == napi_function ? argv[0] : nullptr);
6775     napi_value result = nullptr;
6776     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
6777     auto asyncTask = [weakToken = wptr<Window>(windowToken_), task = napiAsyncTask, where = __func__, env] {
6778         auto window = weakToken.promote();
6779         if (window == nullptr) {
6780             task->Reject(env, JsErrUtils::CreateJsError(env,
6781                 WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "OnResetAspectRatio failed."));
6782             return;
6783         }
6784         WMError ret = window->ResetAspectRatio();
6785         if (ret == WMError::WM_OK) {
6786             task->Resolve(env, NapiGetUndefined(env));
6787         } else {
6788             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "ResetAspectRatio failed."));
6789         }
6790         TLOGND(WmsLogTag::WMS_LAYOUT, "%{public}s end, window [%{public}u, %{public}s] ret=%{public}d",
6791             where, window->GetWindowId(), window->GetWindowName().c_str(), ret);
6792     };
6793     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnResetAspectRatio") != napi_status::napi_ok) {
6794         napiAsyncTask->Reject(env,
6795             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
6796     }
6797     return result;
6798 }
6799 
OnMinimize(napi_env env,napi_callback_info info)6800 napi_value JsWindow::OnMinimize(napi_env env, napi_callback_info info)
6801 {
6802     size_t argc = FOUR_PARAMS_SIZE;
6803     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
6804     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6805     if (argc > 1) {
6806         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
6807         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6808     }
6809 
6810     if (windowToken_ != nullptr && WindowHelper::IsFloatOrSubWindow(windowToken_->GetType())) {
6811         if (!windowToken_->IsSceneBoardEnabled()) {
6812             return NapiThrowError(env, WmErrorCode::WM_ERROR_DEVICE_NOT_SUPPORT);
6813         }
6814         TLOGI(WmsLogTag::WMS_LAYOUT, "subWindow or float window use hide");
6815         return HideWindowFunction(env, info, WmErrorCode::WM_OK);
6816     }
6817 
6818     napi_value lastParam = (argc == 0) ? nullptr :
6819         (GetType(env, argv[INDEX_ZERO]) == napi_function ? argv[INDEX_ZERO] : nullptr);
6820     napi_value result = nullptr;
6821     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
6822     const char* const where = __func__;
6823     auto asyncTask = [weakToken = wptr<Window>(windowToken_), env, task = napiAsyncTask, where] {
6824         auto window = weakToken.promote();
6825         if (window == nullptr) {
6826             TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s window is nullptr", where);
6827             task->Reject(env,
6828                 JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "window is nullptr"));
6829             return;
6830         }
6831         WMError ret = window->Minimize();
6832         if (ret == WMError::WM_OK) {
6833             task->Resolve(env, NapiGetUndefined(env));
6834         } else {
6835             WmErrorCode wmErrorCode = WM_JS_TO_ERROR_CODE_MAP.at(ret);
6836             task->Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode, "Minimize failed."));
6837         }
6838         TLOGNI(WmsLogTag::WMS_PC, "%{public}s Window [%{public}u, %{public}s] minimize end, ret=%{public}d",
6839             where, window->GetWindowId(), window->GetWindowName().c_str(), ret);
6840     };
6841     if (napi_send_event(env, asyncTask, napi_eprio_immediate, "OnMinimize") != napi_status::napi_ok) {
6842         napiAsyncTask->Reject(env, CreateJsError(env,
6843             static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
6844     }
6845     return result;
6846 }
6847 
OnMaximize(napi_env env,napi_callback_info info)6848 napi_value JsWindow::OnMaximize(napi_env env, napi_callback_info info)
6849 {
6850     if (windowToken_ == nullptr) {
6851         TLOGE(WmsLogTag::WMS_LAYOUT_PC, "WindowToken is nullptr");
6852         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
6853     }
6854     if (!(WindowHelper::IsMainWindow(windowToken_->GetType()) ||
6855           windowToken_->IsSubWindowMaximizeSupported())) {
6856         TLOGE(WmsLogTag::WMS_LAYOUT_PC, "only support main or sub Window");
6857         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
6858     }
6859     size_t argc = FOUR_PARAMS_SIZE;
6860     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
6861     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
6862     using T = std::underlying_type_t<MaximizePresentation>;
6863     T presentationValue = static_cast<T>(MaximizePresentation::ENTER_IMMERSIVE);
6864     if (argc == 1) {
6865         if (!ConvertFromJsValue(env, argv[INDEX_ZERO], presentationValue) ||
6866             presentationValue < static_cast<T>(MaximizePresentation::FOLLOW_APP_IMMERSIVE_SETTING) ||
6867             presentationValue > static_cast<T>(MaximizePresentation::ENTER_IMMERSIVE_DISABLE_TITLE_AND_DOCK_HOVER)) {
6868             TLOGE(WmsLogTag::WMS_LAYOUT_PC, "Failed to convert parameter to presentationValue");
6869             return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
6870         }
6871     }
6872     MaximizePresentation presentation = static_cast<MaximizePresentation>(presentationValue);
6873     // 1: params num; 1: index of callback
6874     napi_value lastParam = (argc <= 1) ? nullptr :
6875         (GetType(env, argv[INDEX_ONE]) == napi_function ? argv[INDEX_ONE] : nullptr);
6876     napi_value result = nullptr;
6877     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
6878     auto asyncTask = [windowToken = wptr<Window>(windowToken_), presentation, env, task = napiAsyncTask] {
6879         auto window = windowToken.promote();
6880         if (window == nullptr) {
6881             task->Reject(env,
6882                 JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "window is nullptr"));
6883             return;
6884         }
6885         WMError ret = window->Maximize(presentation);
6886         if (ret == WMError::WM_OK) {
6887             task->Resolve(env, NapiGetUndefined(env));
6888         } else {
6889             WmErrorCode wmErrorCode = WM_JS_TO_ERROR_CODE_MAP.at(ret);
6890             task->Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode, "Maximize failed."));
6891         }
6892     };
6893     if (napi_send_event(env, asyncTask, napi_eprio_immediate, "OnMaximize") != napi_status::napi_ok) {
6894         napiAsyncTask->Reject(env, CreateJsError(env,
6895             static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
6896     }
6897     return result;
6898 }
6899 
FindJsWindowObject(const std::string & windowName)6900 std::shared_ptr<NativeReference> FindJsWindowObject(const std::string& windowName)
6901 {
6902     WLOGFD("Try to find window %{public}s in g_jsWindowMap", windowName.c_str());
6903     std::lock_guard<std::mutex> lock(g_mutex);
6904     if (g_jsWindowMap.find(windowName) == g_jsWindowMap.end()) {
6905         WLOGFD("Can not find window %{public}s in g_jsWindowMap", windowName.c_str());
6906         return nullptr;
6907     }
6908     return g_jsWindowMap[windowName];
6909 }
6910 
CreateJsWindowObject(napi_env env,sptr<Window> & window)6911 napi_value CreateJsWindowObject(napi_env env, sptr<Window>& window)
6912 __attribute__((no_sanitize("cfi")))
6913 {
6914     std::string windowName = window->GetWindowName();
6915     // avoid repeatedly create js window when getWindow
6916     std::shared_ptr<NativeReference> jsWindowObj = FindJsWindowObject(windowName);
6917     if (jsWindowObj != nullptr && jsWindowObj->GetNapiValue() != nullptr) {
6918         WLOGD("FindJsWindowObject %{public}s", windowName.c_str());
6919         return jsWindowObj->GetNapiValue();
6920     }
6921     napi_value objValue = nullptr;
6922     napi_create_object(env, &objValue);
6923 
6924     WLOGI("CreateJsWindow %{public}s", windowName.c_str());
6925     std::unique_ptr<JsWindow> jsWindow = std::make_unique<JsWindow>(window);
6926     napi_wrap(env, objValue, jsWindow.release(), JsWindow::Finalizer, nullptr, nullptr);
6927 
6928     BindFunctions(env, objValue, "JsWindow");
6929 
6930     std::shared_ptr<NativeReference> jsWindowRef;
6931     napi_ref result = nullptr;
6932     napi_create_reference(env, objValue, 1, &result);
6933     jsWindowRef.reset(reinterpret_cast<NativeReference*>(result));
6934     std::lock_guard<std::mutex> lock(g_mutex);
6935     g_jsWindowMap[windowName] = jsWindowRef;
6936     TLOGI(WmsLogTag::WMS_LIFE, "Add window %{public}s", windowName.c_str());
6937     return objValue;
6938 }
6939 
CreateJsWindowArrayObject(napi_env env,const std::vector<sptr<Window>> & windows)6940 napi_value CreateJsWindowArrayObject(napi_env env, const std::vector<sptr<Window>>& windows)
6941 {
6942     napi_value arrayValue = nullptr;
6943     napi_create_array_with_length(env, windows.size(), &arrayValue);
6944     if (arrayValue == nullptr) {
6945         TLOGE(WmsLogTag::DEFAULT, "Failed to create napi array");
6946         return nullptr;
6947     }
6948     uint32_t index = 0;
6949     for (size_t i = 0; i < windows.size(); i++) {
6950         auto window = windows[i];
6951         if (window == nullptr) {
6952             TLOGW(WmsLogTag::DEFAULT, "window is null");
6953         } else {
6954             napi_set_element(env, arrayValue, index++, CreateJsWindowObject(env, window));
6955         }
6956     }
6957     return arrayValue;
6958 }
6959 
ParseWindowLimits(napi_env env,napi_value jsObject,WindowLimits & windowLimits)6960 bool JsWindow::ParseWindowLimits(napi_env env, napi_value jsObject, WindowLimits& windowLimits)
6961 {
6962     uint32_t data = 0;
6963     if (ParseJsValue(jsObject, env, "maxWidth", data)) {
6964         windowLimits.maxWidth_ = data;
6965     } else {
6966         WLOGFE("Failed to convert object to windowLimits");
6967         return false;
6968     }
6969     if (ParseJsValue(jsObject, env, "minWidth", data)) {
6970         windowLimits.minWidth_ = data;
6971     } else {
6972         WLOGFE("Failed to convert object to windowLimits");
6973         return false;
6974     }
6975     if (ParseJsValue(jsObject, env, "maxHeight", data)) {
6976         windowLimits.maxHeight_ = data;
6977     } else {
6978         WLOGFE("Failed to convert object to windowLimits");
6979         return false;
6980     }
6981     if (ParseJsValue(jsObject, env, "minHeight", data)) {
6982         windowLimits.minHeight_ = data;
6983     } else {
6984         WLOGFE("Failed to convert object to windowLimits");
6985         return false;
6986     }
6987     return true;
6988 }
6989 
GetEnableDragExecuteCallback(bool enableDrag,const wptr<Window> & weakToken,const std::shared_ptr<WmErrorCode> & errCodePtr)6990 static NapiAsyncTask::ExecuteCallback GetEnableDragExecuteCallback(bool enableDrag,
6991     const wptr<Window>& weakToken, const std::shared_ptr<WmErrorCode>& errCodePtr)
6992 {
6993     NapiAsyncTask::ExecuteCallback execute = [weakToken, enableDrag, errCodePtr] {
6994         if (errCodePtr == nullptr) {
6995             return;
6996         }
6997         auto window = weakToken.promote();
6998         if (window == nullptr) {
6999             *errCodePtr = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
7000             return;
7001         }
7002         if (WindowHelper::IsInputWindow(window->GetType())) {
7003             TLOGE(WmsLogTag::WMS_LAYOUT, "is not allowed since input window");
7004             *errCodePtr = WmErrorCode::WM_ERROR_INVALID_CALLING;
7005             return;
7006         }
7007         *errCodePtr = WM_JS_TO_ERROR_CODE_MAP.at(window->EnableDrag(enableDrag));
7008         TLOGNI(WmsLogTag::WMS_LAYOUT, "Window [%{public}u, %{public}s] set enable drag end",
7009             window->GetWindowId(), window->GetWindowName().c_str());
7010     };
7011     return execute;
7012 }
7013 
GetEnableDragCompleteCallback(const std::shared_ptr<WmErrorCode> & errCodePtr)7014 static NapiAsyncTask::CompleteCallback GetEnableDragCompleteCallback(
7015     const std::shared_ptr<WmErrorCode>& errCodePtr)
7016 {
7017     NapiAsyncTask::CompleteCallback complete = [errCodePtr](napi_env env, NapiAsyncTask& task, int32_t status) {
7018         if (errCodePtr == nullptr) {
7019             task.Reject(env,
7020                 JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "Set enable drag failed."));
7021             return;
7022         }
7023         TLOGNI(WmsLogTag::WMS_LAYOUT, "OnEnableDrag: ret: %{public}u", *errCodePtr);
7024         if (*errCodePtr == WmErrorCode::WM_OK) {
7025             task.Resolve(env, NapiGetUndefined(env));
7026         } else {
7027             task.Reject(env, JsErrUtils::CreateJsError(env, *errCodePtr, "Set enable drag failed."));
7028         }
7029     };
7030     return complete;
7031 }
7032 
OnEnableDrag(napi_env env,napi_callback_info info)7033 napi_value JsWindow::OnEnableDrag(napi_env env, napi_callback_info info)
7034 {
7035     size_t argc = FOUR_PARAMS_SIZE;
7036     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
7037     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7038     if (argc < 1 || argv[INDEX_ZERO] == nullptr) {
7039         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
7040         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7041     }
7042 
7043     bool enableDrag = false;
7044     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], enableDrag)) {
7045         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter from jsValue");
7046         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7047     }
7048     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
7049     NapiAsyncTask::ExecuteCallback execute =
7050         GetEnableDragExecuteCallback(enableDrag, wptr<Window>(windowToken_), errCodePtr);
7051     NapiAsyncTask::CompleteCallback complete = GetEnableDragCompleteCallback(errCodePtr);
7052 
7053     napi_value result = nullptr;
7054     NapiAsyncTask::Schedule("JsWindow::OnEnableDrag",
7055         env, CreateAsyncTaskWithLastParam(env, nullptr, std::move(execute), std::move(complete), &result));
7056     return result;
7057 }
7058 
7059 /** @note @window.layout */
OnSetWindowLimits(napi_env env,napi_callback_info info)7060 napi_value JsWindow::OnSetWindowLimits(napi_env env, napi_callback_info info)
7061 {
7062     size_t argc = FOUR_PARAMS_SIZE;
7063     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
7064     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7065     if (argc < 1 || argv[INDEX_ZERO] == nullptr) {
7066         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
7067         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7068     }
7069     WindowLimits windowLimits;
7070     if (!ParseWindowLimits(env, argv[INDEX_ZERO], windowLimits)) {
7071         TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert object to windowLimits");
7072         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7073     }
7074     if (windowLimits.maxWidth_ < 0 || windowLimits.maxHeight_ < 0 ||
7075         windowLimits.minWidth_ < 0 || windowLimits.minHeight_ < 0) {
7076         TLOGE(WmsLogTag::WMS_LAYOUT, "Width or height should be greater than or equal to 0");
7077         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7078     }
7079     size_t lastParamIndex = INDEX_ONE;
7080     bool isForcible = false;
7081     if (argc >= 2 && argv[INDEX_ONE] != nullptr && GetType(env, argv[INDEX_ONE]) == napi_boolean) { // 2:params num
7082         lastParamIndex = INDEX_TWO;
7083         if (windowToken_ == nullptr) {
7084             TLOGE(WmsLogTag::WMS_LAYOUT, "window is nullptr");
7085             return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
7086         }
7087         if (!windowToken_->IsPcOrFreeMultiWindowCapabilityEnabled()) {
7088             TLOGE(WmsLogTag::WMS_LAYOUT, "device not support");
7089             return NapiThrowError(env, WmErrorCode::WM_ERROR_DEVICE_NOT_SUPPORT);
7090         }
7091         if (!ConvertFromJsValue(env, argv[INDEX_ONE], isForcible)) {
7092             TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to isForcible");
7093             return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7094         }
7095     }
7096     napi_value lastParam = (argc <= lastParamIndex) ? nullptr :
7097                             (GetType(env, argv[lastParamIndex]) == napi_function ? argv[lastParamIndex] : nullptr);
7098     napi_value result = nullptr;
7099     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
7100     auto asyncTask = [windowToken = wptr<Window>(windowToken_), windowLimits, isForcible,
7101                       env, task = napiAsyncTask, where = __func__]() mutable {
7102         auto window = windowToken.promote();
7103         if (window == nullptr) {
7104             TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s: window is nullptr", where);
7105             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
7106             return;
7107         }
7108         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->SetWindowLimits(windowLimits, isForcible));
7109         if (ret == WmErrorCode::WM_OK) {
7110             auto objValue = GetWindowLimitsAndConvertToJsValue(env, windowLimits);
7111             if (objValue == nullptr) {
7112                 task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
7113                                                             "Window set window limits failed"));
7114             } else {
7115                 task->Resolve(env, objValue);
7116             }
7117         } else {
7118             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window set window limits failed"));
7119         }
7120     };
7121     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetWindowLimits") != napi_status::napi_ok) {
7122         napiAsyncTask->Reject(env,
7123             JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "failed to send event"));
7124     }
7125     return result;
7126 }
7127 
7128 /** @note @window.layout */
OnGetWindowLimits(napi_env env,napi_callback_info info)7129 napi_value JsWindow::OnGetWindowLimits(napi_env env, napi_callback_info info)
7130 {
7131     size_t argc = 4;
7132     napi_value argv[4] = {nullptr};
7133     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7134     if (argc > 1) {
7135         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
7136         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7137     }
7138 
7139     if (windowToken_ == nullptr) {
7140         TLOGE(WmsLogTag::WMS_LAYOUT, "window is nullptr");
7141         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
7142     }
7143     WindowLimits windowLimits;
7144     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->GetWindowLimits(windowLimits));
7145     if (ret != WmErrorCode::WM_OK) {
7146         return NapiThrowError(env, ret);
7147     }
7148     auto objValue = GetWindowLimitsAndConvertToJsValue(env, windowLimits);
7149     TLOGI(WmsLogTag::WMS_LAYOUT, "Window [%{public}u, %{public}s] get window limits end",
7150         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str());
7151     if (objValue != nullptr) {
7152         return objValue;
7153     } else {
7154         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
7155     }
7156 }
7157 
OnSetWindowDecorVisible(napi_env env,napi_callback_info info)7158 napi_value JsWindow::OnSetWindowDecorVisible(napi_env env, napi_callback_info info)
7159 {
7160     size_t argc = FOUR_PARAMS_SIZE;
7161     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
7162     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7163     if (argc < 1) {
7164         TLOGE(WmsLogTag::WMS_DECOR, "Argc is invalid: %{public}zu", argc);
7165         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7166     }
7167     if (windowToken_ == nullptr) {
7168         TLOGE(WmsLogTag::WMS_DECOR, "WindowToken is nullptr");
7169         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
7170             "[window][setWindowDecorVisible]msg: WindowToken is nullptr");
7171     }
7172     bool isVisible = true;
7173     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], isVisible)) {
7174         TLOGE(WmsLogTag::WMS_DECOR, "Failed to convert parameter to isVisible");
7175         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7176     }
7177     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetDecorVisible(isVisible));
7178     if (ret != WmErrorCode::WM_OK) {
7179         TLOGE(WmsLogTag::WMS_DECOR, "Window decor set visible failed");
7180         return NapiThrowError(env, ret);
7181     }
7182     TLOGI(WmsLogTag::WMS_DECOR, "Window [%{public}u, %{public}s] end",
7183         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str());
7184     return NapiGetUndefined(env);
7185 }
7186 
OnGetWindowDecorVisible(napi_env env,napi_callback_info info)7187 napi_value JsWindow::OnGetWindowDecorVisible(napi_env env, napi_callback_info info)
7188 {
7189     if (windowToken_ == nullptr) {
7190         TLOGE(WmsLogTag::WMS_DECOR, "window is nullptr");
7191         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
7192             "[window][getWindowDecorVisible]msg: WindowToken is nullptr");
7193     }
7194     bool isVisible = false;
7195     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->GetDecorVisible(isVisible));
7196     if (ret != WmErrorCode::WM_OK) {
7197         TLOGE(WmsLogTag::WMS_DECOR, "Get window decor visibility failed");
7198         return NapiThrowError(env, ret);
7199     }
7200     TLOGI(WmsLogTag::WMS_DECOR, "end, window [%{public}u, %{public}s] isVisible=%{public}d",
7201         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), isVisible);
7202     return CreateJsValue(env, isVisible);
7203 }
7204 
OnSetWindowTitleMoveEnabled(napi_env env,napi_callback_info info)7205 napi_value JsWindow::OnSetWindowTitleMoveEnabled(napi_env env, napi_callback_info info)
7206 {
7207     size_t argc = FOUR_PARAMS_SIZE;
7208     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
7209     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7210     if (argc != 1) {
7211         TLOGE(WmsLogTag::WMS_DECOR, "Argc is invalid: %{public}zu", argc);
7212         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7213     }
7214     bool enable = true;
7215     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], enable)) {
7216         TLOGE(WmsLogTag::WMS_DECOR, "Failed to convert parameter to enable");
7217         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7218     }
7219     if (windowToken_ == nullptr) {
7220         TLOGE(WmsLogTag::WMS_DECOR, "windowToken is nullptr");
7221         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
7222             "[window][setWindowTitleMoveEnabled]msg: windowToken is nullptr");
7223     }
7224     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetWindowTitleMoveEnabled(enable));
7225     if (ret != WmErrorCode::WM_OK) {
7226         TLOGE(WmsLogTag::WMS_DECOR, "Window set title move enable failed");
7227         return NapiThrowError(env, ret);
7228     }
7229     TLOGI(WmsLogTag::WMS_DECOR, "Window [%{public}u, %{public}s] end",
7230         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str());
7231     return NapiGetUndefined(env);
7232 }
7233 
OnSetSubWindowModal(napi_env env,napi_callback_info info)7234 napi_value JsWindow::OnSetSubWindowModal(napi_env env, napi_callback_info info)
7235 {
7236     size_t argc = FOUR_PARAMS_SIZE;
7237     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
7238     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7239     if (argc < 1 || argc > 2) { // 1: the minimum param num  2: the maximum param num
7240         TLOGE(WmsLogTag::WMS_SUB, "Argc is invalid: %{public}zu", argc);
7241         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7242     }
7243     bool isModal = false;
7244     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], isModal)) {
7245         TLOGE(WmsLogTag::WMS_SUB, "Failed to convert parameter to isModal");
7246         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7247     }
7248     ModalityType modalityType = ModalityType::WINDOW_MODALITY;
7249     ApiModalityType apiModalityType;
7250     if (argc == 2 && ConvertFromJsValue(env, argv[INDEX_ONE], apiModalityType)) { // 2: the param num
7251         if (!isModal) {
7252             TLOGE(WmsLogTag::WMS_SUB, "Normal subwindow not support modalityType");
7253             return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7254         }
7255         using T = std::underlying_type_t<ApiModalityType>;
7256         T type = static_cast<T>(apiModalityType);
7257         if (type >= static_cast<T>(ApiModalityType::BEGIN) &&
7258             type <= static_cast<T>(ApiModalityType::END)) {
7259             modalityType = JS_TO_NATIVE_MODALITY_TYPE_MAP.at(apiModalityType);
7260         } else {
7261             TLOGE(WmsLogTag::WMS_SUB, "Failed to convert parameter to modalityType");
7262             return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7263         }
7264     }
7265     napi_value result = nullptr;
7266     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
7267     const char* const where = __func__;
7268     auto asyncTask = [where, weakToken = wptr<Window>(windowToken_), isModal, modalityType, env, task = napiAsyncTask] {
7269         auto window = weakToken.promote();
7270         if (window == nullptr) {
7271             TLOGNE(WmsLogTag::WMS_SUB, "%{public}s window is nullptr", where);
7272             WmErrorCode wmErrorCode = WM_JS_TO_ERROR_CODE_MAP.at(WMError::WM_ERROR_NULLPTR);
7273             task->Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode, "window is nullptr."));
7274             return;
7275         }
7276         if (!WindowHelper::IsSubWindow(window->GetType())) {
7277             TLOGNE(WmsLogTag::WMS_SUB, "%{public}s invalid call, type:%{public}d",
7278                 where, window->GetType());
7279             task->Reject(env, JsErrUtils::CreateJsError(env,
7280                 WmErrorCode::WM_ERROR_INVALID_CALLING, "invalid window type."));
7281             return;
7282         }
7283         WMError ret = window->SetSubWindowModal(isModal, modalityType);
7284         if (ret == WMError::WM_OK) {
7285             task->Resolve(env, NapiGetUndefined(env));
7286         } else {
7287             WmErrorCode wmErrorCode = WM_JS_TO_ERROR_CODE_MAP.at(ret);
7288             TLOGNE(WmsLogTag::WMS_SUB, "%{public}s set failed, ret is %{public}d", where, wmErrorCode);
7289             task->Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode, "Set subwindow modal failed"));
7290             return;
7291         }
7292         TLOGNI(WmsLogTag::WMS_SUB,
7293             "%{public}s id:%{public}u, name:%{public}s, isModal:%{public}d, modalityType:%{public}hhu",
7294             where, window->GetWindowId(), window->GetWindowName().c_str(), isModal, modalityType);
7295     };
7296     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetSubWindowModal") != napi_status::napi_ok) {
7297         napiAsyncTask->Reject(env,
7298             CreateJsError(env, static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
7299     }
7300     return result;
7301 }
7302 
GetFollowParentMultiScreenPolicyTask(const wptr<Window> & weakToken,bool enabled,napi_env env,std::shared_ptr<NapiAsyncTask> & napiAsyncTask)7303 static std::function<void()> GetFollowParentMultiScreenPolicyTask(const wptr<Window>& weakToken, bool enabled,
7304     napi_env env, std::shared_ptr<NapiAsyncTask>& napiAsyncTask)
7305 {
7306     return [weakToken, enabled, env, task = napiAsyncTask] {
7307         auto window = weakToken.promote();
7308         if (window == nullptr) {
7309             TLOGNE(WmsLogTag::WMS_SUB, "OnSetFollowParentMultiScreenPolicy failed, window is null");
7310             task->Reject(env, JsErrUtils::CreateJsError(env,
7311                 WmErrorCode::WM_ERROR_STATE_ABNORMALLY, "window is null"));
7312             return;
7313         }
7314         if (!WindowHelper::IsSubWindow(window->GetType())) {
7315             TLOGNE(WmsLogTag::WMS_SUB, "OnSetFollowParentMultiScreenPolicy invalid call, type:%{public}d",
7316                 window->GetType());
7317             task->Reject(env, JsErrUtils::CreateJsError(env,
7318                 WmErrorCode::WM_ERROR_INVALID_CALLING, "invalid window type"));
7319             return;
7320         }
7321         WMError ret = window->SetFollowParentMultiScreenPolicy(enabled);
7322         if (ret != WMError::WM_OK) {
7323             WmErrorCode wmErrorCode = WM_JS_TO_ERROR_CODE_MAP.at(ret);
7324             TLOGNE(WmsLogTag::WMS_MAIN, "OnSetFollowParentMultiScreenPolicy failed, ret is %{public}d", wmErrorCode);
7325             task->Reject(env, JsErrUtils::CreateJsError(env,
7326                 wmErrorCode, "Set multi-screen simultaneous display failed"));
7327             return;
7328         }
7329         task->Resolve(env, NapiGetUndefined(env));
7330         TLOGNI(WmsLogTag::WMS_SUB, "OnSetFollowParentMultiScreenPolicy id:%{public}u, name:%{public}s, "
7331             "enabled:%{public}d", window->GetWindowId(), window->GetWindowName().c_str(), enabled);
7332     };
7333 }
7334 
OnSetFollowParentMultiScreenPolicy(napi_env env,napi_callback_info info)7335 napi_value JsWindow::OnSetFollowParentMultiScreenPolicy(napi_env env, napi_callback_info info)
7336 {
7337     size_t argc = ONE_PARAMS_SIZE;
7338     napi_value argv[ONE_PARAMS_SIZE] = { nullptr };
7339     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7340     if (argc != ARG_COUNT_ONE) {
7341         TLOGE(WmsLogTag::WMS_SUB, "Argc is invalid: %{public}zu", argc);
7342         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7343     }
7344     bool enabled = false;
7345     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], enabled)) {
7346         TLOGE(WmsLogTag::WMS_SUB, "Failed to convert parameter to enabled");
7347         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7348     }
7349     napi_value result = nullptr;
7350     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
7351     auto asyncTask = GetFollowParentMultiScreenPolicyTask(wptr<Window>(windowToken_), enabled, env, napiAsyncTask);
7352     napi_status status = napi_send_event(env, asyncTask, napi_eprio_high, "OnSetFollowParentMultiScreenPolicy");
7353     if (status != napi_status::napi_ok) {
7354         napiAsyncTask->Reject(env,
7355             CreateJsError(env, static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
7356     }
7357     return result;
7358 }
7359 
IsTransitionAnimationEnable(napi_env env,sptr<Window> windowToken,WmErrorCode & enableResult)7360 static bool IsTransitionAnimationEnable(napi_env env, sptr<Window> windowToken, WmErrorCode& enableResult)
7361 {
7362     if (!windowToken) {
7363         TLOGE(WmsLogTag::WMS_ANIMATION, "Window instance not exist");
7364         enableResult = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
7365         return false;
7366     }
7367     if (!windowToken->IsPcOrPadFreeMultiWindowMode()) {
7368         TLOGE(WmsLogTag::WMS_ANIMATION, "Device is invalid");
7369         enableResult = WmErrorCode::WM_ERROR_DEVICE_NOT_SUPPORT;
7370         return false;
7371     }
7372     if (!WindowHelper::IsMainWindow(windowToken->GetType())) {
7373         TLOGE(WmsLogTag::WMS_ANIMATION, "Window type is invalid");
7374         enableResult = WmErrorCode::WM_ERROR_INVALID_CALLING;
7375         return false;
7376     }
7377     return true;
7378 }
7379 
OnSetWindowTransitionAnimation(napi_env env,napi_callback_info info)7380 napi_value JsWindow::OnSetWindowTransitionAnimation(napi_env env, napi_callback_info info)
7381 {
7382     TLOGD(WmsLogTag::WMS_ANIMATION, "[NAPI]");
7383     WmErrorCode enableResult = WmErrorCode::WM_OK;
7384     if (!IsTransitionAnimationEnable(env, windowToken_, enableResult)) {
7385         return NapiThrowError(env, enableResult);
7386     }
7387     size_t argc = FOUR_PARAMS_SIZE;
7388     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
7389     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7390     if (argc != ARG_COUNT_TWO) {
7391         TLOGE(WmsLogTag::WMS_ANIMATION, "Argc is invalid: %{public}zu", argc);
7392         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7393     }
7394     uint32_t type = 0;
7395     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], type) || type >= static_cast<uint32_t>(WindowTransitionType::END)) {
7396         TLOGE(WmsLogTag::WMS_ANIMATION, "Failed to convert parameter to type");
7397         return NapiThrowError(env, WmErrorCode::WM_ERROR_ILLEGAL_PARAM);
7398     }
7399     TransitionAnimation animation;
7400     WmErrorCode convertResult = WmErrorCode::WM_OK;
7401     if (!ConvertTransitionAnimationFromJsValue(env, argv[INDEX_ONE], animation, convertResult)) {
7402         TLOGE(WmsLogTag::WMS_ANIMATION, "Failed to convert parameter to animation");
7403         return NapiThrowError(env, convertResult);
7404     }
7405     const char* const where = __func__;
7406     napi_value result = nullptr;
7407     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
7408     auto asyncTask = [weakToken = wptr<Window>(windowToken_), task = napiAsyncTask, env, type, animation, where] {
7409         auto window = weakToken.promote();
7410         if (window == nullptr) {
7411             TLOGNE(WmsLogTag::WMS_ANIMATION, "%{public}s window is nullptr", where);
7412             task->Reject(env, CreateJsError(env, static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY),
7413                 "[window][setWindowTransitionAnimation]msg:native window is nullptr"));
7414             return;
7415         }
7416         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->SetWindowTransitionAnimation(
7417             static_cast<WindowTransitionType>(type), animation));
7418         if (ret == WmErrorCode::WM_OK) {
7419             task->Resolve(env, NapiGetUndefined(env));
7420         } else {
7421             TLOGNE(WmsLogTag::WMS_ANIMATION, "%{public}s set failed, ret is %{public}d", where, ret);
7422             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Set window transition animation failed"));
7423         }
7424     };
7425     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetWindowTransitionAnimation") != napi_status::napi_ok) {
7426         napiAsyncTask->Reject(env, CreateJsError(env,
7427             static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY),
7428             "[window][setWindowTransitionAnimation]msg:send event failed"));
7429     }
7430     return result;
7431 }
7432 
OnGetWindowTransitionAnimation(napi_env env,napi_callback_info info)7433 napi_value JsWindow::OnGetWindowTransitionAnimation(napi_env env, napi_callback_info info)
7434 {
7435     TLOGD(WmsLogTag::WMS_ANIMATION, "[NAPI]");
7436     WmErrorCode enableResult = WmErrorCode::WM_OK;
7437     if (!IsTransitionAnimationEnable(env, windowToken_, enableResult)) {
7438         return NapiThrowError(env, enableResult,
7439             "[window][getWindowTransitionAnimation]msg:transition animation is not enable");
7440     }
7441     size_t argc = ONE_PARAMS_SIZE;
7442     napi_value argv[ONE_PARAMS_SIZE] = { nullptr };
7443     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7444     if (argc != ARG_COUNT_ONE) {
7445         TLOGE(WmsLogTag::WMS_ANIMATION, "Argc is invalid: %{public}zu", argc);
7446         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7447     }
7448     WindowTransitionType type = WindowTransitionType::DESTROY;
7449     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], type) || type >= WindowTransitionType::END) {
7450         TLOGE(WmsLogTag::WMS_ANIMATION, "Failed to convert parameter to type");
7451         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7452     }
7453     napi_value result = ConvertTransitionAnimationToJsValue(env, windowToken_->GetWindowTransitionAnimation(type));
7454     if (result != nullptr) {
7455         return result;
7456     }
7457     return NapiGetUndefined(env);
7458 }
7459 
OnSetWindowDecorHeight(napi_env env,napi_callback_info info)7460 napi_value JsWindow::OnSetWindowDecorHeight(napi_env env, napi_callback_info info)
7461 {
7462     size_t argc = FOUR_PARAMS_SIZE;
7463     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
7464     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7465     if (argc < 1) {
7466         TLOGE(WmsLogTag::WMS_DECOR, "Argc is invalid: %{public}zu", argc);
7467         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7468     }
7469     if (windowToken_ == nullptr) {
7470         TLOGE(WmsLogTag::WMS_DECOR, "WindowToken is nullptr");
7471         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
7472             "[window][setWindowDecorHeight]msg: WindowToken is nullptr");
7473     }
7474     int32_t height = 0;
7475     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], height)) {
7476         TLOGE(WmsLogTag::WMS_DECOR, "Failed to convert parameter to height");
7477         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7478     }
7479 
7480     if (height < MIN_DECOR_HEIGHT || height > MAX_DECOR_HEIGHT) {
7481         TLOGE(WmsLogTag::WMS_DECOR, "height should greater than 37 or smaller than 112");
7482         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7483     }
7484 
7485     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetDecorHeight(height));
7486     if (ret != WmErrorCode::WM_OK) {
7487         TLOGE(WmsLogTag::WMS_DECOR, "Set window decor height failed");
7488         return NapiThrowError(env, ret);
7489     }
7490     TLOGI(WmsLogTag::WMS_DECOR, "end, window [%{public}u, %{public}s] height=%{public}d",
7491         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), height);
7492     return NapiGetUndefined(env);
7493 }
7494 
OnGetWindowDecorHeight(napi_env env,napi_callback_info info)7495 napi_value JsWindow::OnGetWindowDecorHeight(napi_env env, napi_callback_info info)
7496 {
7497     if (windowToken_ == nullptr) {
7498         TLOGE(WmsLogTag::WMS_DECOR, "window is nullptr");
7499         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
7500             "[window][getWindowDecorHeight]msg: window is nullptr");
7501     }
7502     int32_t height = 0;
7503     WMError ret = windowToken_->GetDecorHeight(height);
7504     if (ret != WMError::WM_OK) {
7505         if (ret == WMError::WM_ERROR_DEVICE_NOT_SUPPORT) {
7506             return NapiThrowError(env, WmErrorCode::WM_ERROR_DEVICE_NOT_SUPPORT);
7507         }
7508         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
7509             "[window][getWindowDecorHeight]msg: Get window decor height failed");
7510     }
7511     TLOGI(WmsLogTag::WMS_DECOR, "end, window [%{public}u, %{public}s] height=%{public}d",
7512         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), height);
7513     return CreateJsValue(env, height);
7514 }
7515 
OnSetDecorButtonStyle(napi_env env,napi_callback_info info)7516 napi_value JsWindow::OnSetDecorButtonStyle(napi_env env, napi_callback_info info)
7517 {
7518     if (windowToken_ == nullptr) {
7519         TLOGE(WmsLogTag::WMS_DECOR, "window is nullptr");
7520         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
7521             "[window][setDecorButtonStyle]msg: window is nullptr");
7522     }
7523     if (windowToken_->IsPadAndNotFreeMutiWindowCompatibleMode()) {
7524         TLOGE(WmsLogTag::WMS_DECOR, "This is PcAppInPad, not support");
7525         return NapiGetUndefined(env);
7526     }
7527     if (!windowToken_->IsPcOrPadFreeMultiWindowMode()) {
7528         TLOGE(WmsLogTag::WMS_DECOR, "device not support");
7529         return NapiThrowError(env, WmErrorCode::WM_ERROR_DEVICE_NOT_SUPPORT);
7530     }
7531     size_t argc = FOUR_PARAMS_SIZE;
7532     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
7533     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7534     if (argc != 1) {
7535         TLOGE(WmsLogTag::WMS_DECOR, "Argc is invalid: %{public}zu", argc);
7536         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7537     }
7538     DecorButtonStyle decorButtonStyle;
7539     WMError res = windowToken_->GetDecorButtonStyle(decorButtonStyle);
7540     if (res != WMError::WM_OK) {
7541         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
7542     }
7543     if (argv[INDEX_ZERO] == nullptr || !ConvertDecorButtonStyleFromJs(env, argv[INDEX_ZERO], decorButtonStyle)) {
7544         TLOGE(WmsLogTag::WMS_DECOR, "Argc is invalid");
7545         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7546     }
7547     if (!WindowHelper::CheckButtonStyleValid(decorButtonStyle)) {
7548         TLOGE(WmsLogTag::WMS_DECOR, "out of range params");
7549         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7550     }
7551     WMError errCode = windowToken_->SetDecorButtonStyle(decorButtonStyle);
7552     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(errCode);
7553     if (ret != WmErrorCode::WM_OK) {
7554         return NapiThrowError(env, ret);
7555     }
7556     return NapiGetUndefined(env);
7557 }
7558 
OnGetDecorButtonStyle(napi_env env,napi_callback_info info)7559 napi_value JsWindow::OnGetDecorButtonStyle(napi_env env, napi_callback_info info)
7560 {
7561     if (windowToken_ == nullptr) {
7562         TLOGE(WmsLogTag::WMS_DECOR, "window is nullptr");
7563         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
7564             "[window][getDecorButtonStyle]msg: window is nullptr");
7565     }
7566     if (windowToken_->IsPadAndNotFreeMutiWindowCompatibleMode()) {
7567         TLOGE(WmsLogTag::WMS_DECOR, "This is PcAppInPad, not support");
7568         return NapiGetUndefined(env);
7569     }
7570     if (!windowToken_->IsPcOrPadFreeMultiWindowMode()) {
7571         TLOGE(WmsLogTag::WMS_DECOR, "device not support");
7572         return NapiThrowError(env, WmErrorCode::WM_ERROR_DEVICE_NOT_SUPPORT);
7573     }
7574     DecorButtonStyle decorButtonStyle;
7575     WMError errCode = windowToken_->GetDecorButtonStyle(decorButtonStyle);
7576     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(errCode);
7577     if (ret != WmErrorCode::WM_OK) {
7578         return NapiThrowError(env, ret);
7579     }
7580     auto jsDecorButtonStyle = CreateJsDecorButtonStyleObj(env, decorButtonStyle);
7581     if (jsDecorButtonStyle == nullptr) {
7582         TLOGE(WmsLogTag::WMS_DECOR, "decorButtonStyle format failed");
7583         return NapiThrowError(env, WmErrorCode::WM_ERROR_SYSTEM_ABNORMALLY,
7584             "[window][getDecorButtonStyle]msg: decorButtonStyle format failed");
7585     }
7586     return jsDecorButtonStyle;
7587 }
7588 
OnGetTitleButtonRect(napi_env env,napi_callback_info info)7589 napi_value JsWindow::OnGetTitleButtonRect(napi_env env, napi_callback_info info)
7590 {
7591     if (windowToken_ == nullptr) {
7592         TLOGE(WmsLogTag::WMS_DECOR, "window is nullptr");
7593         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
7594             "[window][getTitleButtonRect]msg: window is nullptr");
7595     }
7596     TitleButtonRect titleButtonRect;
7597     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->GetTitleButtonArea(titleButtonRect));
7598     if (ret != WmErrorCode::WM_OK) {
7599         return NapiThrowError(env, ret);
7600     }
7601     TLOGI(WmsLogTag::WMS_DECOR, "Window [%{public}u, %{public}s] end",
7602         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str());
7603     napi_value TitleButtonAreaObj = ConvertTitleButtonAreaToJsValue(env, titleButtonRect);
7604     if (TitleButtonAreaObj == nullptr) {
7605         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
7606             "[window][getTitleButtonRect]msg: titleButtonRect convert failed");
7607     }
7608     return TitleButtonAreaObj;
7609 }
7610 
OnSetWindowContainerColor(napi_env env,napi_callback_info info)7611 napi_value JsWindow::OnSetWindowContainerColor(napi_env env, napi_callback_info info)
7612 {
7613     size_t argc = FOUR_PARAMS_SIZE;
7614     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
7615     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7616     if (argc != 2) {  // 2: params num
7617         TLOGE(WmsLogTag::WMS_DECOR, "Argc is invalid: %{public}zu", argc);
7618         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7619     }
7620     if (windowToken_ == nullptr) {
7621         TLOGE(WmsLogTag::WMS_DECOR, "WindowToken_ is nullptr");
7622         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
7623     }
7624     std::string activeColor;
7625     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], activeColor)) {
7626         TLOGE(WmsLogTag::WMS_DECOR, "Failed to convert parameter to window container activeColor");
7627         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7628     }
7629     std::string inactiveColor;
7630     if (!ConvertFromJsValue(env, argv[INDEX_ONE], inactiveColor)) {
7631         TLOGE(WmsLogTag::WMS_DECOR, "Failed to convert parameter to window container inactiveColor");
7632         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7633     }
7634     WMError errCode = windowToken_->SetWindowContainerColor(activeColor, inactiveColor);
7635     TLOGI(WmsLogTag::WMS_DECOR, "winId: %{public}u set activeColor: %{public}s, inactiveColor: %{public}s"
7636         ", result: %{public}d", windowToken_->GetWindowId(), activeColor.c_str(), inactiveColor.c_str(), errCode);
7637     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(errCode);
7638     if (ret != WmErrorCode::WM_OK) {
7639         TLOGE(WmsLogTag::WMS_DECOR, "set window container color failed!");
7640         return NapiThrowError(env, ret);
7641     }
7642     return NapiGetUndefined(env);
7643 }
7644 
OnSetWindowContainerModalColor(napi_env env,napi_callback_info info)7645 napi_value JsWindow::OnSetWindowContainerModalColor(napi_env env, napi_callback_info info)
7646 {
7647     size_t argc = FOUR_PARAMS_SIZE;
7648     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
7649     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7650     if (argc != ARG_COUNT_TWO) {
7651         TLOGE(WmsLogTag::WMS_DECOR, "Argc is invalid: %{public}zu", argc);
7652         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7653     }
7654     if (windowToken_ == nullptr) {
7655         TLOGE(WmsLogTag::WMS_DECOR, "WindowToken_ is nullptr");
7656         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
7657     }
7658     std::string activeColor;
7659     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], activeColor)) {
7660         TLOGE(WmsLogTag::WMS_DECOR, "Failed to convert parameter to window container activeColor");
7661         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7662     }
7663     std::string inactiveColor;
7664     if (!ConvertFromJsValue(env, argv[INDEX_ONE], inactiveColor)) {
7665         TLOGE(WmsLogTag::WMS_DECOR, "Failed to convert parameter to window container inactiveColor");
7666         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7667     }
7668     WMError errCode = windowToken_->SetWindowContainerModalColor(activeColor, inactiveColor);
7669     TLOGI(WmsLogTag::WMS_DECOR, "Window [%{public}u, %{public}s] set activeColor: %{public}s,"
7670         " inactiveColor: %{public}s, result: %{public}d", windowToken_->GetWindowId(),
7671         windowToken_->GetWindowName().c_str(), activeColor.c_str(), inactiveColor.c_str(), errCode);
7672     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(errCode);
7673     if (ret != WmErrorCode::WM_OK) {
7674         TLOGE(WmsLogTag::WMS_DECOR, "set window container color failed!");
7675         return NapiThrowError(env, ret);
7676     }
7677     return NapiGetUndefined(env);
7678 }
7679 
OnSetTitleButtonVisible(napi_env env,napi_callback_info info)7680 napi_value JsWindow::OnSetTitleButtonVisible(napi_env env, napi_callback_info info)
7681 {
7682     if (!Permission::IsSystemCalling()) {
7683         TLOGE(WmsLogTag::WMS_DECOR, "set title button visible permission denied!");
7684         return NapiThrowError(env, WmErrorCode::WM_ERROR_NOT_SYSTEM_APP);
7685     }
7686     size_t argc = FOUR_PARAMS_SIZE;
7687     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
7688     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7689     if (argc < 3) { // 3: params num
7690         TLOGE(WmsLogTag::WMS_DECOR, "Argc is invalid: %{public}zu", argc);
7691         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7692     }
7693     bool isMaximizeVisible = true;
7694     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], isMaximizeVisible)) {
7695         TLOGE(WmsLogTag::WMS_DECOR, "Failed to convert parameter to isMaximizeVisible");
7696         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7697     }
7698     bool isMinimizeVisible = true;
7699     if (!ConvertFromJsValue(env, argv[INDEX_ONE], isMinimizeVisible)) {
7700         TLOGE(WmsLogTag::WMS_DECOR, "Failed to convert parameter to isMinimizeVisible");
7701         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7702     }
7703     bool isSplitVisible = true;
7704     if (!ConvertFromJsValue(env, argv[INDEX_TWO], isSplitVisible)) {
7705         TLOGE(WmsLogTag::WMS_DECOR, "Failed to convert parameter to isSplitVisible");
7706         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7707     }
7708     bool isCloseVisible = true;
7709     if (argc >= FOUR_PARAMS_SIZE && !ConvertFromJsValue(env, argv[INDEX_THREE], isCloseVisible)) {
7710         TLOGE(WmsLogTag::WMS_DECOR, "Failed to convert parameter to isCloseVisible");
7711         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7712     }
7713     if (windowToken_ == nullptr) {
7714         TLOGE(WmsLogTag::WMS_DECOR, "WindowToken is nullptr");
7715         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
7716             "[window][setTitleButtonVisible]msg: WindowToken is nullptr");
7717     }
7718     WMError errCode = windowToken_->SetTitleButtonVisible(isMaximizeVisible, isMinimizeVisible, isSplitVisible,
7719         isCloseVisible);
7720     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(errCode);
7721     if (ret != WmErrorCode::WM_OK) {
7722         TLOGE(WmsLogTag::WMS_DECOR, "set title button visible failed!");
7723         return NapiThrowError(env, ret);
7724     }
7725     TLOGI(WmsLogTag::WMS_DECOR,
7726         "Window [%{public}u, %{public}s] end [%{public}d, %{public}d, %{public}d, %{public}d]",
7727         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), isMaximizeVisible, isMinimizeVisible,
7728         isSplitVisible, isCloseVisible);
7729     return NapiGetUndefined(env);
7730 }
7731 
OnSetWindowTitleButtonVisible(napi_env env,napi_callback_info info)7732 napi_value JsWindow::OnSetWindowTitleButtonVisible(napi_env env, napi_callback_info info)
7733 {
7734     size_t argc = FOUR_PARAMS_SIZE;
7735     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
7736     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7737     if (argc < 2) { // 2: min params num
7738         TLOGE(WmsLogTag::WMS_DECOR, "Argc is invalid: %{public}zu", argc);
7739         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7740     }
7741     bool isMaximizeVisible = true;
7742     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], isMaximizeVisible)) {
7743         TLOGE(WmsLogTag::WMS_DECOR, "Failed to convert parameter to isMaximizeVisible");
7744         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7745     }
7746     bool isMinimizeVisible = true;
7747     if (!ConvertFromJsValue(env, argv[INDEX_ONE], isMinimizeVisible)) {
7748         TLOGE(WmsLogTag::WMS_DECOR, "Failed to convert parameter to isMinimizeVisible");
7749         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7750     }
7751     bool isCloseVisible = true;
7752     if (argc > 2 && !ConvertFromJsValue(env, argv[INDEX_TWO], isCloseVisible)) { // 2: min params num
7753         TLOGE(WmsLogTag::WMS_DECOR, "Failed to convert parameter to isCloseVisible");
7754         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7755     }
7756     if (windowToken_ == nullptr) {
7757         TLOGE(WmsLogTag::WMS_DECOR, "WindowToken is nullptr");
7758         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
7759     }
7760     WMError errCode = windowToken_->SetTitleButtonVisible(isMaximizeVisible, isMinimizeVisible, isMaximizeVisible,
7761         isCloseVisible);
7762     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(errCode);
7763     if (ret != WmErrorCode::WM_OK) {
7764         TLOGE(WmsLogTag::WMS_DECOR, "set title button visible failed!");
7765         return NapiThrowError(env, ret);
7766     }
7767     TLOGI(WmsLogTag::WMS_DECOR, "Window [%{public}u, %{public}s] [%{public}d, %{public}d, %{public}d]",
7768         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(),
7769         isMaximizeVisible, isMinimizeVisible, isCloseVisible);
7770     return NapiGetUndefined(env);
7771 }
7772 
OnSetWindowTitle(napi_env env,napi_callback_info info)7773 napi_value JsWindow::OnSetWindowTitle(napi_env env, napi_callback_info info)
7774 {
7775     size_t argc = FOUR_PARAMS_SIZE;
7776     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
7777     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7778     if (argc != 1) {
7779         TLOGW(WmsLogTag::WMS_DECOR, "Argc is invalid: %{public}zu", argc);
7780         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7781     }
7782     std::string title;
7783     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], title)) {
7784         TLOGE(WmsLogTag::WMS_DECOR, "Failed to convert parameter to title");
7785         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7786     }
7787     napi_value result = nullptr;
7788     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
7789     const char* const where = __func__;
7790     auto asyncTask = [windowToken = wptr<Window>(windowToken_), title, env, task = napiAsyncTask, where] {
7791         auto window = windowToken.promote();
7792         if (window == nullptr) {
7793             TLOGNE(WmsLogTag::WMS_DECOR, "%{public}s window is nullptr", where);
7794             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
7795                 "[window][setWindowTitle]msg: window is nullptr"));
7796             return;
7797         }
7798         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->SetWindowTitle(title));
7799         if (ret == WmErrorCode::WM_OK) {
7800             TLOGNI(WmsLogTag::WMS_DECOR, "%{public}s Window [%{public}u] end", where, window->GetWindowId());
7801             task->Resolve(env, NapiGetUndefined(env));
7802         } else {
7803             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Window set title failed"));
7804         }
7805     };
7806     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetWindowTitle") != napi_status::napi_ok) {
7807         napiAsyncTask->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
7808             "[window][setWindowTitle]msg: send event failed"));
7809     }
7810     return result;
7811 }
7812 
OnSetWindowMask(napi_env env,napi_callback_info info)7813 napi_value JsWindow::OnSetWindowMask(napi_env env, napi_callback_info info)
7814 {
7815     size_t argc = FOUR_PARAMS_SIZE;
7816     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
7817     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7818     if (argc < 1) {
7819         TLOGE(WmsLogTag::WMS_PC, "Argc is invalid: %{public}zu", argc);
7820         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7821     }
7822     if (!CheckWindowMaskParams(env, argv[INDEX_ZERO])) {
7823         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7824     }
7825     std::vector<std::vector<uint32_t>> windowMask;
7826     if (!GetWindowMaskFromJsValue(env, argv[INDEX_ZERO], windowMask)) {
7827         TLOGE(WmsLogTag::WMS_PC, "GetWindowMaskFromJsValue failed");
7828         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7829     }
7830     napi_value result = nullptr;
7831     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
7832     const char* const where = __func__;
7833     auto asyncTask = [weakToken = wptr<Window>(windowToken_), windowMask = std::move(windowMask), env,
7834         task = napiAsyncTask, where] {
7835         auto window = weakToken.promote();
7836         if (window == nullptr) {
7837             TLOGNE(WmsLogTag::WMS_PC, "%{public}s window is nullptr", where);
7838             WmErrorCode wmErrorCode = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
7839             task->Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode, "window is nullptr"));
7840             return;
7841         }
7842         if (!WindowHelper::IsSubWindow(window->GetType()) &&
7843             !WindowHelper::IsAppFloatingWindow(window->GetType())) {
7844             WmErrorCode wmErrorCode = WmErrorCode::WM_ERROR_INVALID_CALLING;
7845             task->Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode, "Invalidate window type"));
7846             return;
7847         }
7848         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->SetWindowMask(windowMask));
7849         if (ret != WmErrorCode::WM_OK) {
7850             task->Reject(env, JsErrUtils::CreateJsError(env, ret));
7851             TLOGNE(WmsLogTag::WMS_PC, "%{public}s Window [%{public}u, %{public}s] set window mask failed",
7852                 where, window->GetWindowId(), window->GetWindowName().c_str());
7853             return;
7854         }
7855         task->Resolve(env, NapiGetUndefined(env));
7856         TLOGNI(WmsLogTag::WMS_PC, "%{public}s Window [%{public}u, %{public}s] end",
7857             where, window->GetWindowId(), window->GetWindowName().c_str());
7858     };
7859     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetWindowMask") != napi_status::napi_ok) {
7860         napiAsyncTask->Reject(env,
7861             CreateJsError(env, static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
7862     }
7863     return result;
7864 }
7865 
CheckWindowMaskParams(napi_env env,napi_value jsObject)7866 bool JsWindow::CheckWindowMaskParams(napi_env env, napi_value jsObject)
7867 {
7868     if (env == nullptr || jsObject == nullptr) {
7869         TLOGE(WmsLogTag::WMS_PC, "Env is nullptr or jsObject is nullptr");
7870         return false;
7871     }
7872     if (windowToken_ == nullptr) {
7873         TLOGE(WmsLogTag::WMS_PC, "windowToken is nullptr");
7874         return false;
7875     }
7876     uint32_t size = 0;
7877     napi_get_array_length(env, jsObject, &size);
7878     WindowLimits windowLimits;
7879     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->GetWindowLimits(windowLimits));
7880     if (ret == WmErrorCode::WM_OK) {
7881         if (size == 0 || size > windowLimits.maxWidth_) {
7882             TLOGE(WmsLogTag::WMS_PC, "Invalid windowMask size:%{public}u, vpRatio:%{public}f, maxWidth:%{public}u",
7883                 size, windowLimits.vpRatio_, windowLimits.maxWidth_);
7884             return false;
7885         }
7886     } else {
7887         TLOGW(WmsLogTag::WMS_PC, "Get windowLimits failed, error code is %{public}d", ret);
7888         if (size == 0 || size > DEFAULT_WINDOW_MAX_WIDTH) {
7889             TLOGE(WmsLogTag::WMS_PC, "Invalid windowMask size:%{public}u", size);
7890             return false;
7891         }
7892     }
7893     return true;
7894 }
7895 
SetWindowGrayScaleTask(const wptr<Window> & weakToken,double grayScale,NapiAsyncTask::ExecuteCallback & execute,NapiAsyncTask::CompleteCallback & complete)7896 void SetWindowGrayScaleTask(const wptr<Window>& weakToken, double grayScale,
7897     NapiAsyncTask::ExecuteCallback& execute, NapiAsyncTask::CompleteCallback& complete)
7898 {
7899     std::shared_ptr<WmErrorCode> err = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
7900     execute = [weakToken, grayScale, err] {
7901         if (err == nullptr) {
7902             TLOGE(WmsLogTag::WMS_ATTRIBUTE, "wm error code is null");
7903             return;
7904         }
7905         auto window = weakToken.promote();
7906         if (window == nullptr) {
7907             TLOGE(WmsLogTag::WMS_ATTRIBUTE, "window is null");
7908             *err = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
7909             return;
7910         }
7911         *err = WM_JS_TO_ERROR_CODE_MAP.at(window->SetGrayScale(static_cast<float>(grayScale)));
7912         TLOGI(WmsLogTag::WMS_ATTRIBUTE, "end, window [%{public}u, %{public}s] grayScale=%{public}f",
7913             window->GetWindowId(), window->GetWindowName().c_str(), grayScale);
7914     };
7915 
7916     complete = [err](napi_env env, NapiAsyncTask& task, int32_t status) {
7917         if (err == nullptr) {
7918             task.Reject(env, CreateJsError(env, static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY)));
7919             return;
7920         }
7921         if (*err == WmErrorCode::WM_OK) {
7922             task.Resolve(env, NapiGetUndefined(env));
7923         } else {
7924             task.Reject(env, CreateJsError(env, static_cast<int32_t>(*err), "Set window gray scale failed"));
7925         }
7926     };
7927 }
7928 
OnSetWindowGrayScale(napi_env env,napi_callback_info info)7929 napi_value JsWindow::OnSetWindowGrayScale(napi_env env, napi_callback_info info)
7930 {
7931     size_t argc = 4;
7932     napi_value argv[4] = {nullptr};
7933     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7934     if (argc != 1) {    // 1: the param num
7935         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Argc is invalid: %{public}zu", argc);
7936         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7937     }
7938     napi_value nativeVal = argv[0];
7939     if (nativeVal == nullptr) {
7940         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Failed to convert parameter to grayScale");
7941         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7942     }
7943     double grayScale = 0.0;
7944     napi_get_value_double(env, nativeVal, &grayScale);
7945     constexpr double eps = 1e-6;
7946     if (grayScale < (MIN_GRAY_SCALE - eps) || grayScale > (MAX_GRAY_SCALE + eps)) {
7947         TLOGE(WmsLogTag::WMS_ATTRIBUTE,
7948             "grayScale should be greater than or equal to 0.0, and should be smaller than or equal to 1.0");
7949         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7950     }
7951 
7952     wptr<Window> weakToken(windowToken_);
7953     NapiAsyncTask::ExecuteCallback execute;
7954     NapiAsyncTask::CompleteCallback complete;
7955     SetWindowGrayScaleTask(weakToken, grayScale, execute, complete);
7956 
7957     napi_value result = nullptr;
7958     NapiAsyncTask::Schedule("JsWindow::OnSetWindowGrayScale",
7959         env, CreateAsyncTaskWithLastParam(env, nullptr, std::move(execute), std::move(complete), &result));
7960     return result;
7961 }
7962 
OnSetImmersiveModeEnabledState(napi_env env,napi_callback_info info)7963 napi_value JsWindow::OnSetImmersiveModeEnabledState(napi_env env, napi_callback_info info)
7964 {
7965     size_t argc = 4;
7966     napi_value argv[4] = {nullptr};
7967     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
7968     if (argc != 1) {
7969         TLOGW(WmsLogTag::WMS_IMMS, "Argc is invalid %{public}zu", argc);
7970         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
7971     }
7972     if (windowToken_ == nullptr) {
7973         TLOGE(WmsLogTag::WMS_IMMS, "windowToken_ is nullptr");
7974         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
7975     }
7976     if (!WindowHelper::IsMainWindow(windowToken_->GetType()) &&
7977         !WindowHelper::IsSubWindow(windowToken_->GetType())) {
7978         TLOGE(WmsLogTag::WMS_IMMS, "not allowed since invalid window type");
7979         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
7980     }
7981     WmErrorCode ret = WmErrorCode::WM_OK;
7982     napi_value nativeVal = argv[0];
7983     bool enable = true;
7984     if (nativeVal == nullptr) {
7985         TLOGE(WmsLogTag::WMS_IMMS, "Failed to convert parameter to enable");
7986         ret = WmErrorCode::WM_ERROR_INVALID_PARAM;
7987     } else {
7988         napi_get_value_bool(env, nativeVal, &enable);
7989     }
7990     TLOGI(WmsLogTag::WMS_IMMS, "enable %{public}d", static_cast<int32_t>(enable));
7991     if (windowToken_->IsPcOrPadFreeMultiWindowMode()) {
7992         TLOGE(WmsLogTag::WMS_IMMS, "id:%{public}u device not support", windowToken_->GetWindowId());
7993         windowToken_->SetIgnoreSafeArea(enable);
7994         return NapiGetUndefined(env);
7995     }
7996     if (ret != WmErrorCode::WM_OK) {
7997         return NapiThrowError(env, ret);
7998     }
7999     ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetImmersiveModeEnabledState(enable));
8000     if (ret != WmErrorCode::WM_OK) {
8001         TLOGE(WmsLogTag::WMS_IMMS, "set failed, ret %{public}d", ret);
8002         return NapiThrowError(env, WmErrorCode::WM_ERROR_SYSTEM_ABNORMALLY);
8003     }
8004     TLOGI(WmsLogTag::WMS_IMMS, "win %{public}u set end", windowToken_->GetWindowId());
8005     return NapiGetUndefined(env);
8006 }
8007 
OnGetImmersiveModeEnabledState(napi_env env,napi_callback_info info)8008 napi_value JsWindow::OnGetImmersiveModeEnabledState(napi_env env, napi_callback_info info)
8009 {
8010     if (windowToken_ == nullptr) {
8011         TLOGE(WmsLogTag::WMS_IMMS, "windowToken_ is nullptr");
8012         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8013     }
8014     if (!WindowHelper::IsMainWindow(windowToken_->GetType()) &&
8015         !WindowHelper::IsSubWindow(windowToken_->GetType())) {
8016         TLOGE(WmsLogTag::WMS_IMMS, "not allowed since invalid window type");
8017         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
8018     }
8019 
8020     bool isEnabled = windowToken_->GetImmersiveModeEnabledState();
8021     TLOGI(WmsLogTag::WMS_IMMS, "win %{public}u isEnabled %{public}u set end", windowToken_->GetWindowId(), isEnabled);
8022     return CreateJsValue(env, isEnabled);
8023 }
8024 
OnIsImmersiveLayout(napi_env env,napi_callback_info info)8025 napi_value JsWindow::OnIsImmersiveLayout(napi_env env, napi_callback_info info)
8026 {
8027     if (windowToken_ == nullptr) {
8028         TLOGE(WmsLogTag::WMS_IMMS, "windowToken_ is nullptr");
8029         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8030     }
8031     bool isImmersiveLayout = false;
8032     auto ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->IsImmersiveLayout(isImmersiveLayout));
8033     if (ret != WmErrorCode::WM_OK) {
8034         TLOGE(WmsLogTag::WMS_IMMS, "failed, ret %{public}d", ret);
8035         return NapiThrowError(env, ret);
8036     }
8037     TLOGI(WmsLogTag::WMS_IMMS, "win %{public}u isImmersiveLayout %{public}u end",
8038         windowToken_->GetWindowId(), isImmersiveLayout);
8039     return CreateJsValue(env, isImmersiveLayout);
8040 }
8041 
OnGetWindowStatus(napi_env env,napi_callback_info info)8042 napi_value JsWindow::OnGetWindowStatus(napi_env env, napi_callback_info info)
8043 {
8044     auto window = windowToken_;
8045     if (window == nullptr) {
8046         TLOGE(WmsLogTag::WMS_PC, "window is nullptr");
8047         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8048     }
8049     WindowStatus windowStatus;
8050     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->GetWindowStatus(windowStatus));
8051     if (ret != WmErrorCode::WM_OK) {
8052         TLOGE(WmsLogTag::WMS_PC, "failed, ret=%{public}d", ret);
8053         return NapiThrowError(env, ret);
8054     }
8055     auto objValue = CreateJsValue(env, windowStatus);
8056     if (objValue != nullptr) {
8057         TLOGI(WmsLogTag::WMS_PC, "id:[%{public}u] end", window->GetWindowId());
8058         return objValue;
8059     } else {
8060         TLOGE(WmsLogTag::WMS_PC, "create js value windowStatus failed");
8061         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8062     }
8063 }
8064 
OnIsFocused(napi_env env,napi_callback_info info)8065 napi_value JsWindow::OnIsFocused(napi_env env, napi_callback_info info)
8066 {
8067     auto window = windowToken_;
8068     if (window == nullptr) {
8069         TLOGE(WmsLogTag::WMS_FOCUS, "window is nullptr");
8070         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8071     }
8072 
8073     bool isFocused = window->IsFocused();
8074     TLOGI(WmsLogTag::WMS_FOCUS, "end, window [%{public}u, %{public}s] isFocused=%{public}u",
8075         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), isFocused);
8076     return CreateJsValue(env, isFocused);
8077 }
8078 
SetRequestFocusTask(NapiAsyncTask::ExecuteCallback & execute,NapiAsyncTask::CompleteCallback & complete,wptr<Window> weakToken,bool isFocused)8079 static void SetRequestFocusTask(NapiAsyncTask::ExecuteCallback& execute, NapiAsyncTask::CompleteCallback& complete,
8080     wptr<Window> weakToken, bool isFocused)
8081 {
8082     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
8083     const char* const where = __func__;
8084     execute = [weakToken, errCodePtr, isFocused, where] {
8085         if (errCodePtr == nullptr) {
8086             return;
8087         }
8088         if (*errCodePtr != WmErrorCode::WM_OK) {
8089             return;
8090         }
8091         auto window = weakToken.promote();
8092         if (window == nullptr) {
8093             *errCodePtr = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
8094             return;
8095         }
8096         *errCodePtr = WM_JS_TO_ERROR_CODE_MAP.at(window->RequestFocusByClient(isFocused));
8097         TLOGNI(WmsLogTag::WMS_FOCUS, "%{public}s end, window [%{public}u, %{public}s] err=%{public}d",
8098             where, window->GetWindowId(), window->GetWindowName().c_str(), *errCodePtr);
8099     };
8100     complete = [weakToken, errCodePtr](napi_env env, NapiAsyncTask& task, int32_t status) {
8101         if (errCodePtr == nullptr) {
8102             task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
8103                 "[window][requestFocus]msg: System abnormal"));
8104             return;
8105         }
8106         if (*errCodePtr == WmErrorCode::WM_OK) {
8107             task.Resolve(env, NapiGetUndefined(env));
8108         } else {
8109             task.Reject(env, JsErrUtils::CreateJsError(env, *errCodePtr,
8110                 "[window][requestFocus]msg: Request focus failed"));
8111         }
8112     };
8113 }
8114 
OnRequestFocus(napi_env env,napi_callback_info info)8115 napi_value JsWindow::OnRequestFocus(napi_env env, napi_callback_info info)
8116 {
8117     if (!Permission::IsSystemCalling()) {
8118         TLOGE(WmsLogTag::WMS_FOCUS, "permission denied!");
8119         return NapiThrowError(env, WmErrorCode::WM_ERROR_NOT_SYSTEM_APP);
8120     }
8121     if (windowToken_ == nullptr) {
8122         TLOGE(WmsLogTag::WMS_FOCUS, "window is nullptr");
8123         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8124     }
8125 
8126     size_t argc = 4; // number of arg
8127     napi_value argv[4] = {nullptr};
8128     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
8129     if (argc != 1 || argv[0] == nullptr) { // 1: maximum params num
8130         TLOGE(WmsLogTag::WMS_FOCUS, "Argc is invalid: %{public}zu", argc);
8131         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8132     }
8133 
8134     bool isFocused = false;
8135     napi_status retCode = napi_get_value_bool(env, argv[0], &isFocused);
8136     if (retCode != napi_ok) {
8137         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8138     }
8139     wptr<Window> weakToken(windowToken_);
8140     NapiAsyncTask::ExecuteCallback execute;
8141     NapiAsyncTask::CompleteCallback complete;
8142     SetRequestFocusTask(execute, complete, weakToken, isFocused);
8143     // only return promise<void>
8144     napi_value result = nullptr;
8145     NapiAsyncTask::Schedule("JsWindow::OnRequestFocus",
8146         env, CreateAsyncTaskWithLastParam(env, nullptr, std::move(execute), std::move(complete), &result));
8147     return result;
8148 }
8149 
OnStartMoving(napi_env env,napi_callback_info info)8150 napi_value JsWindow::OnStartMoving(napi_env env, napi_callback_info info)
8151 {
8152     if (windowToken_ == nullptr) {
8153         TLOGE(WmsLogTag::WMS_LAYOUT, "windowToken is nullptr.");
8154         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8155     }
8156     size_t argc = FOUR_PARAMS_SIZE;
8157     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
8158     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
8159     if (argc > ARG_COUNT_ZERO) {
8160         return OnStartMoveWindowWithCoordinate(env, argc, argv);
8161     }
8162     if (WindowHelper::IsInputWindow(windowToken_->GetType())) {
8163         TLOGE(WmsLogTag::WMS_LAYOUT, "is not allowed since input window");
8164         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
8165     }
8166     std::shared_ptr<WmErrorCode> err = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
8167     const char* const funcName = __func__;
8168     NapiAsyncTask::ExecuteCallback execute = [this, weakToken = wptr<Window>(windowToken_), err, funcName] {
8169         if (err == nullptr) {
8170             TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s: wm error code is null.", funcName);
8171             return;
8172         }
8173         auto window = weakToken.promote();
8174         if (window == nullptr) {
8175             TLOGNE(WmsLogTag::WMS_LAYOUT, "%{public}s: This window is nullptr.", funcName);
8176             *err = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
8177             return;
8178         }
8179         *err = window->StartMoveWindow();
8180     };
8181 
8182     NapiAsyncTask::CompleteCallback complete = [err](napi_env env, NapiAsyncTask& task, int32_t status) {
8183         if (err == nullptr) {
8184             task.Reject(env, CreateJsError(env, static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY),
8185                 "System abnormal."));
8186             return;
8187         }
8188         if (*err == WmErrorCode::WM_OK) {
8189             task.Resolve(env, NapiGetUndefined(env));
8190         } else {
8191             task.Reject(env, CreateJsError(env, static_cast<int32_t>(*err), "Move system window failed."));
8192         }
8193     };
8194     napi_value result = nullptr;
8195     NapiAsyncTask::Schedule("JsWindow::OnStartMoving",
8196         env, CreateAsyncTaskWithLastParam(env, nullptr, std::move(execute), std::move(complete), &result));
8197     return result;
8198 }
8199 
OnStartMoveWindowWithCoordinate(napi_env env,size_t argc,napi_value * argv)8200 napi_value JsWindow::OnStartMoveWindowWithCoordinate(napi_env env, size_t argc, napi_value* argv)
8201 {
8202     if (windowToken_ == nullptr) {
8203         TLOGE(WmsLogTag::WMS_LAYOUT_PC, "windowToken is nullptr.");
8204         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8205     }
8206     if (argc != ARG_COUNT_TWO) {
8207         TLOGE(WmsLogTag::WMS_LAYOUT_PC, "Argc is invalid: %{public}zu", argc);
8208         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8209     }
8210     int32_t offsetX;
8211     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], offsetX)) {
8212         TLOGE(WmsLogTag::WMS_LAYOUT_PC, "failed to convert parameter to offsetX");
8213         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8214     }
8215     int32_t offsetY;
8216     if (!ConvertFromJsValue(env, argv[INDEX_ONE], offsetY)) {
8217         TLOGE(WmsLogTag::WMS_LAYOUT_PC, "failed to convert parameter to offsetY");
8218         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8219     }
8220     napi_value result = nullptr;
8221     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
8222     auto asyncTask = [windowToken = wptr<Window>(windowToken_), offsetX, offsetY,
8223                       env, task = napiAsyncTask, where = __func__] {
8224         auto window = windowToken.promote();
8225         if (window == nullptr) {
8226             TLOGNE(WmsLogTag::WMS_LAYOUT_PC, "%{public}s window is nullptr.", where);
8227             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
8228             return;
8229         }
8230         WmErrorCode ret = window->StartMoveWindowWithCoordinate(offsetX, offsetY);
8231         if (ret == WmErrorCode::WM_OK) {
8232             task->Resolve(env, NapiGetUndefined(env));
8233         } else {
8234             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "move window failed"));
8235         }
8236     };
8237     napi_status status = napi_send_event(env, std::move(asyncTask),
8238                                          napi_eprio_high, "OnStartMoveWindowWithCoordinate");
8239     if (status != napi_status::napi_ok) {
8240         napiAsyncTask->Reject(env, CreateJsError(env,
8241             static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
8242     }
8243     return result;
8244 }
8245 
OnStopMoving(napi_env env,napi_callback_info info)8246 napi_value JsWindow::OnStopMoving(napi_env env, napi_callback_info info)
8247 {
8248     if (windowToken_ == nullptr) {
8249         TLOGE(WmsLogTag::WMS_LAYOUT_PC, "windowToken is nullptr.");
8250         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8251     }
8252     napi_value result = nullptr;
8253     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
8254     const char* const where = __func__;
8255     auto asyncTask = [windowToken = wptr<Window>(windowToken_), env, task = napiAsyncTask, where] {
8256         auto window = windowToken.promote();
8257         if (window == nullptr) {
8258             TLOGNE(WmsLogTag::WMS_LAYOUT_PC, "%{public}s window is nullptr.", where);
8259             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
8260             return;
8261         }
8262         WmErrorCode ret = window->StopMoveWindow();
8263         if (ret == WmErrorCode::WM_OK) {
8264             task->Resolve(env, NapiGetUndefined(env));
8265         } else {
8266             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "Stop moving window failed"));
8267         }
8268     };
8269     if (napi_send_event(env, std::move(asyncTask), napi_eprio_high, "OnStopMoving") != napi_status::napi_ok) {
8270         napiAsyncTask->Reject(env, CreateJsError(env,
8271             static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
8272     }
8273     return result;
8274 }
8275 
OnSetGestureBackEnabled(napi_env env,napi_callback_info info)8276 napi_value JsWindow::OnSetGestureBackEnabled(napi_env env, napi_callback_info info)
8277 {
8278     size_t argc = FOUR_PARAMS_SIZE;
8279     napi_value argv[FOUR_PARAMS_SIZE] = {nullptr};
8280     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
8281     if (argc < INDEX_ONE) {
8282         TLOGE(WmsLogTag::WMS_IMMS, "argc is invalid: %{public}zu", argc);
8283         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8284     }
8285     bool enabled = true;
8286     if (argv[INDEX_ZERO] == nullptr || napi_get_value_bool(env, argv[INDEX_ZERO], &enabled) != napi_ok) {
8287         TLOGE(WmsLogTag::WMS_IMMS, "failed to convert parameter to enabled");
8288         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8289     }
8290     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
8291     const char* const where = __func__;
8292     auto execute = [weakToken = wptr<Window>(windowToken_), errCodePtr, enabled, where] {
8293         auto window = weakToken.promote();
8294         if (window == nullptr) {
8295             TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s window is nullptr", where);
8296             *errCodePtr = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
8297             return;
8298         }
8299         if (!WindowHelper::IsMainWindow(window->GetType())) {
8300             TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s invalid window type", where);
8301             *errCodePtr = WmErrorCode::WM_ERROR_INVALID_CALLING;
8302             return;
8303         }
8304         *errCodePtr = WM_JS_TO_ERROR_CODE_MAP.at(window->SetGestureBackEnabled(enabled));
8305     };
8306     auto complete = [errCodePtr, where](napi_env env, NapiAsyncTask& task, int32_t status) {
8307         if (*errCodePtr == WmErrorCode::WM_OK) {
8308             task.Resolve(env, NapiGetUndefined(env));
8309         } else {
8310             TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s set failed, ret %{public}d", where, *errCodePtr);
8311             task.Reject(env, JsErrUtils::CreateJsError(env, *errCodePtr, "set failed."));
8312         }
8313     };
8314     napi_value result = nullptr;
8315     NapiAsyncTask::Schedule("JsWindow::OnSetGestureBackEnabled",
8316         env, CreateAsyncTaskWithLastParam(env, nullptr, std::move(execute), std::move(complete), &result));
8317     return result;
8318 }
8319 
OnGetGestureBackEnabled(napi_env env,napi_callback_info info)8320 napi_value JsWindow::OnGetGestureBackEnabled(napi_env env, napi_callback_info info)
8321 {
8322     if (windowToken_ == nullptr) {
8323         TLOGE(WmsLogTag::WMS_IMMS, "windowToken is nullptr");
8324         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8325     }
8326     if (!WindowHelper::IsMainWindow(windowToken_->GetType())) {
8327         TLOGE(WmsLogTag::WMS_IMMS, "get failed since invalid window type");
8328         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
8329     }
8330     bool enable = true;
8331     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->GetGestureBackEnabled(enable));
8332     if (ret == WmErrorCode::WM_ERROR_DEVICE_NOT_SUPPORT) {
8333         TLOGE(WmsLogTag::WMS_IMMS, "device is not support");
8334         return NapiThrowError(env, WmErrorCode::WM_ERROR_DEVICE_NOT_SUPPORT);
8335     } else if (ret != WmErrorCode::WM_OK) {
8336         TLOGE(WmsLogTag::WMS_IMMS, "get failed, ret %{public}d", ret);
8337         return NapiThrowError(env, WmErrorCode::WM_ERROR_SYSTEM_ABNORMALLY);
8338     }
8339     TLOGI(WmsLogTag::WMS_IMMS, "win [%{public}u, %{public}s] enable %{public}u",
8340         windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), enable);
8341     return CreateJsValue(env, enable);
8342 }
8343 
OnCreateSubWindowWithOptions(napi_env env,napi_callback_info info)8344 napi_value JsWindow::OnCreateSubWindowWithOptions(napi_env env, napi_callback_info info)
8345 {
8346     if (windowToken_ == nullptr) {
8347         TLOGE(WmsLogTag::WMS_SUB, "window is null");
8348         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
8349         return NapiGetUndefined(env);
8350     }
8351     if (!windowToken_->IsPcOrFreeMultiWindowCapabilityEnabled()) {
8352         TLOGE(WmsLogTag::WMS_SUB, "device not support");
8353         return NapiGetUndefined(env);
8354     }
8355     size_t argc = FOUR_PARAMS_SIZE;
8356     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
8357     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
8358     if (argc < 2) { // 2: minimum params num
8359         TLOGE(WmsLogTag::WMS_SUB, "Argc is invalid: %{public}zu", argc);
8360         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8361     }
8362     std::string windowName;
8363     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], windowName)) {
8364         TLOGE(WmsLogTag::WMS_SUB, "Failed to convert parameter to windowName");
8365         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
8366         return NapiGetUndefined(env);
8367     }
8368     sptr<WindowOption> windowOption = new WindowOption();
8369     if (!ParseSubWindowOptions(env, argv[INDEX_ONE], windowOption)) {
8370         TLOGE(WmsLogTag::WMS_SUB, "Failed to convert parameter to options");
8371         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
8372         return NapiGetUndefined(env);
8373     }
8374     if ((windowOption->GetWindowFlags() & static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_IS_APPLICATION_MODAL)) &&
8375         !windowToken_->IsPcOrPadFreeMultiWindowMode()) {
8376         TLOGE(WmsLogTag::WMS_SUB, "device not support");
8377         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_DEVICE_NOT_SUPPORT));
8378         return NapiGetUndefined(env);
8379     }
8380     if (windowOption->GetWindowTopmost() && !Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
8381         TLOGE(WmsLogTag::WMS_SUB, "Modal subwindow has topmost, but no system permission");
8382         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_NOT_SYSTEM_APP));
8383         return NapiGetUndefined(env);
8384     }
8385     napi_value callback = (argc > 2 && argv[2] != nullptr && GetType(env, argv[2]) == napi_function) ?
8386         argv[2] : nullptr;
8387     napi_value result = nullptr;
8388     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, callback, &result);
8389     const char* const where = __func__;
8390     auto asyncTask = [windowToken = wptr<Window>(windowToken_), windowName = std::move(windowName),
8391         windowOption, env, task = napiAsyncTask, where]() mutable {
8392         auto window = windowToken.promote();
8393         if (window == nullptr) {
8394             TLOGNE(WmsLogTag::WMS_SUB, "%{public}s window is nullptr", where);
8395             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
8396                 "window is nullptr"));
8397             return;
8398         }
8399         if (!WindowHelper::IsFloatOrSubWindow(window->GetType()) &&
8400             !WindowHelper::IsMainWindow(window->GetType())) {
8401             TLOGNE(WmsLogTag::WMS_SUB, "%{public}s invalid window type: %{public}d", where, window->GetType());
8402             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_CALLING,
8403                 "invalid window type"));
8404             return;
8405         }
8406         windowOption->SetWindowType(WindowType::WINDOW_TYPE_APP_SUB_WINDOW);
8407         windowOption->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
8408         windowOption->SetOnlySupportSceneBoard(true);
8409         windowOption->SetParentId(windowToken->GetWindowId());
8410         windowOption->SetWindowTag(WindowTag::SUB_WINDOW);
8411         auto subWindow = Window::Create(windowName, windowOption, window->GetContext());
8412         if (subWindow == nullptr) {
8413             TLOGNE(WmsLogTag::WMS_SUB, "%{public}s create sub window failed.", where);
8414             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
8415                 "create sub window failed"));
8416             return;
8417         }
8418         task->Resolve(env, CreateJsWindowObject(env, subWindow));
8419         TLOGNI(WmsLogTag::WMS_SUB, "%{public}s create sub window %{public}s end", where, windowName.c_str());
8420     };
8421     if (napi_send_event(env, asyncTask, napi_eprio_vip, "OnCreateSubWindowWithOptions") != napi_status::napi_ok) {
8422         napiAsyncTask->Reject(env, CreateJsError(env,
8423             static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
8424     }
8425     return result;
8426 }
8427 
OnSetParentWindow(napi_env env,napi_callback_info info)8428 napi_value JsWindow::OnSetParentWindow(napi_env env, napi_callback_info info)
8429 {
8430     size_t argc = FOUR_PARAMS_SIZE;
8431     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
8432     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
8433     if (argc != ARG_COUNT_ONE) {
8434         TLOGE(WmsLogTag::WMS_SUB, "Argc is invalid: %{public}zu", argc);
8435         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8436     }
8437     int32_t newParentWindowId = INVALID_WINDOW_ID;
8438     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], newParentWindowId)) {
8439         TLOGE(WmsLogTag::WMS_SUB, "Failed to convert parameter to newParentWindowId");
8440         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8441     }
8442     napi_value result = nullptr;
8443     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
8444     auto asyncTask = [weakToken = wptr<Window>(windowToken_), newParentWindowId, env,
8445                       task = napiAsyncTask, where = __func__] {
8446         auto window = weakToken.promote();
8447         if (window == nullptr) {
8448             TLOGNE(WmsLogTag::WMS_SUB, "%{public}s: window is nullptr", where);
8449             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
8450             return;
8451         }
8452         WMError ret = window->SetParentWindow(newParentWindowId);
8453         if (ret != WMError::WM_OK) {
8454             WmErrorCode wmErrorCode = WM_JS_TO_ERROR_CODE_MAP.at(ret);
8455             task->Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode, "Set parent window failed"));
8456             return;
8457         }
8458         task->Resolve(env, NapiGetUndefined(env));
8459         TLOGNI(WmsLogTag::WMS_SUB, "%{public}s window id: %{public}u set parent window id: %{public}u end",
8460             where, window->GetWindowId(), newParentWindowId);
8461     };
8462     if (napi_send_event(env, std::move(asyncTask), napi_eprio_high, "OnSetParentWindow") != napi_status::napi_ok) {
8463         napiAsyncTask->Reject(env, CreateJsError(env,
8464             static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
8465     }
8466     return result;
8467 }
8468 
OnGetParentWindow(napi_env env,napi_callback_info info)8469 napi_value JsWindow::OnGetParentWindow(napi_env env, napi_callback_info info)
8470 {
8471     if (windowToken_ == nullptr) {
8472         TLOGE(WmsLogTag::WMS_SUB, "windowToken is nullptr");
8473         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8474     }
8475     sptr<Window> parentWindow = nullptr;
8476     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->GetParentWindow(parentWindow));
8477     if (ret != WmErrorCode::WM_OK) {
8478         TLOGE(WmsLogTag::WMS_SUB, "get failed, result=%{public}d", ret);
8479         return NapiThrowError(env, ret);
8480     }
8481     if (parentWindow == nullptr) {
8482         TLOGE(WmsLogTag::WMS_SUB, "parentWindow is nullptr");
8483         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARENT);
8484     }
8485     auto objValue = CreateJsWindowObject(env, parentWindow);
8486     if (objValue == nullptr) {
8487         TLOGE(WmsLogTag::WMS_SUB, "create js window failed");
8488         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8489     }
8490     TLOGI(WmsLogTag::WMS_SUB, "window id: %{public}u set parent window id: %{public}u end",
8491         windowToken_->GetWindowId(), parentWindow->GetWindowId());
8492     return objValue;
8493 }
8494 
OnGetWindowDensityInfo(napi_env env,napi_callback_info info)8495 napi_value JsWindow::OnGetWindowDensityInfo(napi_env env, napi_callback_info info)
8496 {
8497     if (windowToken_ == nullptr) {
8498         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "windowToken is null");
8499         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8500     }
8501     WindowDensityInfo densityInfo;
8502     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->GetWindowDensityInfo(densityInfo));
8503     if (ret != WmErrorCode::WM_OK) {
8504         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "get failed, result=%{public}d", ret);
8505         return NapiThrowError(env, ret);
8506     }
8507     auto objValue = ConvertWindowDensityInfoToJsValue(env, densityInfo);
8508     if (objValue != nullptr) {
8509         TLOGD(WmsLogTag::WMS_ATTRIBUTE, "win [%{public}u, %{public}s] get density: %{public}s",
8510             windowToken_->GetWindowId(), windowToken_->GetWindowName().c_str(), densityInfo.ToString().c_str());
8511         return objValue;
8512     } else {
8513         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "create js windowDensityInfo failed");
8514         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8515     }
8516 }
8517 
OnSetDefaultDensityEnabled(napi_env env,napi_callback_info info)8518 napi_value JsWindow::OnSetDefaultDensityEnabled(napi_env env, napi_callback_info info)
8519 {
8520     size_t argc = FOUR_PARAMS_SIZE;
8521     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
8522     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
8523     if (argc != INDEX_ONE) {
8524         TLOGW(WmsLogTag::WMS_ATTRIBUTE, "Argc is invalid %{public}zu", argc);
8525         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8526     }
8527     bool enabled = false;
8528     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], enabled)) {
8529         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Failed to convert parameter to enable");
8530         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8531     }
8532     if (windowToken_ == nullptr) {
8533         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "windowToken is null");
8534         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8535     }
8536     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->SetWindowDefaultDensityEnabled(enabled));
8537     TLOGI(WmsLogTag::WMS_ATTRIBUTE, "winId: %{public}u set enabled=%{public}u result=%{public}d",
8538         windowToken_->GetWindowId(), enabled, ret);
8539     if (ret != WmErrorCode::WM_OK) {
8540         return NapiThrowError(env, ret);
8541     }
8542     return NapiGetUndefined(env);
8543 }
8544 
OnIsMainWindowFullScreenAcrossDisplays(napi_env env,napi_callback_info info)8545 napi_value JsWindow::OnIsMainWindowFullScreenAcrossDisplays(napi_env env, napi_callback_info info)
8546 {
8547     if (windowToken_ == nullptr) {
8548         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "windowToken is null");
8549         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8550     }
8551     std::shared_ptr<bool> isAcrossDisplaysPtr = std::make_shared<bool>(false);
8552     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
8553     const char* const where = __func__;
8554     auto execute = [weakToken = wptr<Window>(windowToken_), isAcrossDisplaysPtr, errCodePtr, where] {
8555         auto window = weakToken.promote();
8556         if (window == nullptr) {
8557             TLOGNE(WmsLogTag::WMS_ATTRIBUTE, "%{public}s window is null", where);
8558             *errCodePtr = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
8559             return;
8560         }
8561         *errCodePtr =
8562             WM_JS_TO_ERROR_CODE_MAP.at(window->IsMainWindowFullScreenAcrossDisplays(*isAcrossDisplaysPtr));
8563         TLOGNI(WmsLogTag::WMS_ATTRIBUTE, "%{public}s winId: %{public}u, isAcrossDisplays: %{public}u, "
8564             "result: %{public}d", where, window->GetWindowId(), *isAcrossDisplaysPtr, *errCodePtr);
8565     };
8566     auto complete = [isAcrossDisplaysPtr, errCodePtr, where](napi_env env, NapiAsyncTask& task, int32_t status) {
8567         if (*errCodePtr == WmErrorCode::WM_OK) {
8568             auto objValue = CreateJsValue(env, *isAcrossDisplaysPtr);
8569             if (objValue != nullptr) {
8570                 task.Resolve(env, objValue);
8571             } else {
8572                 TLOGNE(WmsLogTag::WMS_ATTRIBUTE, "%{public}s convert to js value failed", where);
8573                 task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
8574             }
8575         } else {
8576             task.Reject(env, JsErrUtils::CreateJsError(env, *errCodePtr));
8577         }
8578     };
8579     napi_value result = nullptr;
8580     NapiAsyncTask::Schedule("JsWindow::OnIsMainWindowFullScreenAcrossDisplays",
8581         env, CreateAsyncTaskWithLastParam(env, nullptr, std::move(execute), std::move(complete), &result));
8582     return result;
8583 }
8584 
OnSetSystemAvoidAreaEnabled(napi_env env,napi_callback_info info)8585 napi_value JsWindow::OnSetSystemAvoidAreaEnabled(napi_env env, napi_callback_info info)
8586 {
8587     size_t argc = FOUR_PARAMS_SIZE;
8588     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
8589     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
8590     if (argc < INDEX_ONE) {
8591         TLOGE(WmsLogTag::WMS_IMMS, "argc is invalid: %{public}zu", argc);
8592         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8593     }
8594     bool enable = false;
8595     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], enable)) {
8596         TLOGE(WmsLogTag::WMS_IMMS, "Failed to convert parameter to enable");
8597         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8598     }
8599     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
8600     const char* const where = __func__;
8601     auto execute = [weakToken = wptr<Window>(windowToken_), errCodePtr, enable, where] {
8602         auto window = weakToken.promote();
8603         if (window == nullptr) {
8604             TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s window is nullptr", where);
8605             *errCodePtr = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
8606             return;
8607         }
8608         if (!WindowHelper::IsSystemWindow(window->GetType())) {
8609             TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s only system window is valid", where);
8610             *errCodePtr = WmErrorCode::WM_ERROR_INVALID_CALLING;
8611             return;
8612         }
8613         uint32_t option = 0;
8614         *errCodePtr = WM_JS_TO_ERROR_CODE_MAP.at(window->GetAvoidAreaOption(option));
8615         if (*errCodePtr != WmErrorCode::WM_OK) {
8616             return;
8617         }
8618         if (enable) {
8619             option |= static_cast<uint32_t>(AvoidAreaOption::ENABLE_SYSTEM_WINDOW);
8620         } else {
8621             option &= ~static_cast<uint32_t>(AvoidAreaOption::ENABLE_SYSTEM_WINDOW);
8622         }
8623         *errCodePtr = WM_JS_TO_ERROR_CODE_MAP.at(window->SetAvoidAreaOption(option));
8624     };
8625     auto complete = [errCodePtr, where](napi_env env, NapiAsyncTask& task, int32_t status) {
8626         if (*errCodePtr == WmErrorCode::WM_OK) {
8627             task.Resolve(env, NapiGetUndefined(env));
8628         } else {
8629             TLOGNE(WmsLogTag::WMS_IMMS, "%{public}s failed, ret %{public}d", where, *errCodePtr);
8630             task.Reject(env, JsErrUtils::CreateJsError(env, *errCodePtr, "set system avoid area enabled failed."));
8631         }
8632     };
8633     napi_value result = nullptr;
8634     NapiAsyncTask::Schedule("JsWindow::OnSetSystemAvoidAreaEnabled",
8635         env, CreateAsyncTaskWithLastParam(env, nullptr, std::move(execute), std::move(complete), &result));
8636     return result;
8637 }
8638 
OnIsSystemAvoidAreaEnabled(napi_env env,napi_callback_info info)8639 napi_value JsWindow::OnIsSystemAvoidAreaEnabled(napi_env env, napi_callback_info info)
8640 {
8641     if (windowToken_ == nullptr) {
8642         TLOGE(WmsLogTag::WMS_IMMS, "windowToken is nullptr");
8643         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8644     }
8645     if (!WindowHelper::IsSystemWindow(windowToken_->GetType())) {
8646         TLOGE(WmsLogTag::WMS_IMMS, "only system window is valid");
8647         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_CALLING);
8648     }
8649     uint32_t avoidAreaOption = 0;
8650     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->GetAvoidAreaOption(avoidAreaOption));
8651     if (ret != WmErrorCode::WM_OK) {
8652         TLOGE(WmsLogTag::WMS_IMMS, "get failed, ret %{public}d", ret);
8653         return NapiThrowError(env, ret);
8654     }
8655     bool enabled = avoidAreaOption & static_cast<uint32_t>(AvoidAreaOption::ENABLE_SYSTEM_WINDOW);
8656     if (auto objValue = CreateJsValue(env, enabled)) {
8657         TLOGI(WmsLogTag::WMS_IMMS, "win %{public}u enabled %{public}u", windowToken_->GetWindowId(), enabled);
8658         return objValue;
8659     } else {
8660         TLOGE(WmsLogTag::WMS_IMMS, "create js object failed");
8661         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8662     }
8663 }
8664 
OnSetExclusivelyHighlighted(napi_env env,napi_callback_info info)8665 napi_value JsWindow::OnSetExclusivelyHighlighted(napi_env env, napi_callback_info info)
8666 {
8667     size_t argc = FOUR_PARAMS_SIZE;
8668     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
8669     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
8670     if (argc != ARG_COUNT_ONE) {
8671         TLOGE(WmsLogTag::WMS_FOCUS, "argc is invalid: %{public}zu", argc);
8672         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8673     }
8674     bool exclusivelyHighlighted = true;
8675     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], exclusivelyHighlighted)) {
8676         TLOGE(WmsLogTag::WMS_FOCUS, "Failed to convert parameter to exclusivelyHighlighted");
8677         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8678     }
8679     napi_value result = nullptr;
8680     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
8681     auto asyncTask = [weakToken = wptr<Window>(windowToken_), exclusivelyHighlighted, env,
8682                       task = napiAsyncTask, where = __func__] {
8683         auto window = weakToken.promote();
8684         if (window == nullptr) {
8685             TLOGNE(WmsLogTag::WMS_FOCUS, "%{public}s: window is nullptr", where);
8686             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
8687                 "[window][setExclusivelyHighlighted]msg: Window is nullptr"));
8688             return;
8689         }
8690         WMError ret = window->SetExclusivelyHighlighted(exclusivelyHighlighted);
8691         if (ret == WMError::WM_OK) {
8692             task->Resolve(env, NapiGetUndefined(env));
8693         } else {
8694             WmErrorCode wmErrorCode = WM_JS_TO_ERROR_CODE_MAP.at(ret);
8695             task->Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode,
8696                 "[window][setExclusivelyHighlighted]msg: Set exclusively highlighted failed"));
8697         }
8698         TLOGNI(WmsLogTag::WMS_FOCUS, "%{public}s: end, window: [%{public}u, %{public}s]",
8699             where, window->GetWindowId(), window->GetWindowName().c_str());
8700     };
8701     if (napi_send_event(env, asyncTask, napi_eprio_high, "OnSetExclusivelyHighlighted") != napi_status::napi_ok) {
8702         napiAsyncTask->Reject(env, CreateJsError(env,
8703             static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY),
8704                 "[window][setExclusivelyHighlighted]msg: Failed to send event"));
8705     }
8706     return result;
8707 }
8708 
OnIsWindowHighlighted(napi_env env,napi_callback_info info)8709 napi_value JsWindow::OnIsWindowHighlighted(napi_env env, napi_callback_info info)
8710 {
8711     if (windowToken_ == nullptr) {
8712         TLOGE(WmsLogTag::WMS_FOCUS, "windowToken is nullptr");
8713         return NapiThrowError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY);
8714     }
8715     bool isHighlighted = false;
8716     WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(windowToken_->IsWindowHighlighted(isHighlighted));
8717     if (ret != WmErrorCode::WM_OK) {
8718         TLOGE(WmsLogTag::WMS_FOCUS, "get window highlight failed, ret: %{public}d", ret);
8719         return NapiThrowError(env, ret);
8720     }
8721     TLOGI(WmsLogTag::WMS_FOCUS, "get window highlight end, isHighlighted: %{public}u", isHighlighted);
8722     return CreateJsValue(env, isHighlighted);
8723 }
8724 
SetDragKeyFramePolicyTask(NapiAsyncTask::ExecuteCallback & execute,NapiAsyncTask::CompleteCallback & complete,const wptr<Window> & weakToken,const KeyFramePolicy & keyFramePolicy)8725 static void SetDragKeyFramePolicyTask(NapiAsyncTask::ExecuteCallback& execute,
8726     NapiAsyncTask::CompleteCallback& complete, const wptr<Window>& weakToken, const KeyFramePolicy& keyFramePolicy)
8727 {
8728     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
8729     const char* const where = __func__;
8730     execute = [weakToken, keyFramePolicy, errCodePtr, where] {
8731         if (errCodePtr == nullptr) {
8732             TLOGNE(WmsLogTag::WMS_LAYOUT_PC, "%{public}s errCodePtr is nullptr", where);
8733             return;
8734         }
8735         auto window = weakToken.promote();
8736         if (window == nullptr) {
8737             TLOGNE(WmsLogTag::WMS_LAYOUT_PC, "%{public}s window is nullptr", where);
8738             *errCodePtr = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
8739             return;
8740         }
8741         if (!window->IsPcWindow()) {
8742             TLOGNE(WmsLogTag::WMS_LAYOUT_PC, "%{public}s device not support", where);
8743             *errCodePtr = WmErrorCode::WM_ERROR_DEVICE_NOT_SUPPORT;
8744             return;
8745         }
8746         if (!WindowHelper::IsMainWindow(window->GetType())) {
8747             TLOGNE(WmsLogTag::WMS_LAYOUT_PC, "%{public}s only main window is valid", where);
8748             *errCodePtr = WmErrorCode::WM_ERROR_INVALID_CALLING;
8749             return;
8750         }
8751         *errCodePtr = WM_JS_TO_ERROR_CODE_MAP.at(window->SetDragKeyFramePolicy(keyFramePolicy));
8752     };
8753     complete = [keyFramePolicy, errCodePtr, where](napi_env env, NapiAsyncTask& task, int32_t status) {
8754         if (errCodePtr == nullptr) {
8755             task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
8756             return;
8757         }
8758         if (*errCodePtr == WmErrorCode::WM_OK) {
8759             auto objValue = ConvertKeyFramePolicyToJsValue(env, keyFramePolicy);
8760             if (objValue != nullptr) {
8761                 task.Resolve(env, objValue);
8762             } else {
8763                 TLOGNE(WmsLogTag::WMS_LAYOUT_PC, "%{public}s convert to js value failed", where);
8764                 task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
8765             }
8766         } else {
8767             TLOGNE(WmsLogTag::WMS_LAYOUT_PC, "%{public}s failed, ret %{public}d", where, *errCodePtr);
8768             task.Reject(env, JsErrUtils::CreateJsError(env, *errCodePtr, "set key frame policy failed"));
8769         }
8770     };
8771 }
8772 
OnSetDragKeyFramePolicy(napi_env env,napi_callback_info info)8773 napi_value JsWindow::OnSetDragKeyFramePolicy(napi_env env, napi_callback_info info)
8774 {
8775     size_t argc = FOUR_PARAMS_SIZE;
8776     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
8777     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
8778     if (argc != INDEX_ONE || argv[INDEX_ZERO] == nullptr) {
8779         TLOGE(WmsLogTag::WMS_LAYOUT_PC, "argc is invalid: %{public}zu", argc);
8780         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8781     }
8782     KeyFramePolicy keyFramePolicy;
8783     if (!ParseKeyFramePolicy(env, argv[INDEX_ZERO], keyFramePolicy)) {
8784         TLOGE(WmsLogTag::WMS_LAYOUT_PC, "Failed to convert parameter to keyFramePolicy");
8785         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8786     }
8787     wptr<Window> weakToken(windowToken_);
8788     NapiAsyncTask::ExecuteCallback execute;
8789     NapiAsyncTask::CompleteCallback complete;
8790     SetDragKeyFramePolicyTask(execute, complete, weakToken, keyFramePolicy);
8791     napi_value result = nullptr;
8792     NapiAsyncTask::Schedule("JsWindow::OnSetDragKeyFramePolicy",
8793         env, CreateAsyncTaskWithLastParam(env, nullptr, std::move(execute), std::move(complete), &result));
8794     return result;
8795 }
8796 
OnSetRelativePositionToParentWindowEnabled(napi_env env,napi_callback_info info)8797 napi_value JsWindow::OnSetRelativePositionToParentWindowEnabled(napi_env env, napi_callback_info info)
8798 {
8799     size_t argc = FOUR_PARAMS_SIZE;
8800     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
8801     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
8802     if (argc < INDEX_ONE) {
8803         TLOGE(WmsLogTag::WMS_SUB, "argc is invalid: %{public}zu", argc);
8804         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8805     }
8806     bool enabled = false;
8807     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], enabled)) {
8808         TLOGE(WmsLogTag::WMS_SUB, "Failed to convert parameter to enable");
8809         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8810     }
8811     WindowAnchor anchor = WindowAnchor::TOP_START;
8812     if (argc > INDEX_ONE && !ConvertFromJsValue(env, argv[INDEX_ONE], anchor)) {
8813         TLOGE(WmsLogTag::WMS_SUB, "Failed to convert parameter to anchor");
8814         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8815     }
8816     int32_t offsetX = 0;
8817     if (argc > INDEX_TWO && !ConvertFromJsValue(env, argv[INDEX_TWO], offsetX)) {
8818         TLOGE(WmsLogTag::WMS_SUB, "Failed to convert parameter to offsetX");
8819         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8820     }
8821     int32_t offsetY = 0;
8822     if (argc > INDEX_THREE && !ConvertFromJsValue(env, argv[INDEX_THREE], offsetY)) {
8823         TLOGE(WmsLogTag::WMS_SUB, "Failed to convert parameter to offsetY");
8824         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8825     }
8826     const char* const where = __func__;
8827     napi_value result = nullptr;
8828     std::shared_ptr napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
8829     WindowAnchorInfo windowAnchorInfo = { enabled, anchor, offsetX, offsetY };
8830     auto asyncTask = [weakToken = wptr(windowToken_), task = napiAsyncTask, env, windowAnchorInfo, where] {
8831         auto window = weakToken.promote();
8832         if (window == nullptr) {
8833             TLOGNE(WmsLogTag::WMS_SUB, "%{public}s window is nullptr", where);
8834             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
8835                 "[window][setRelativePositionToParentWindowEnabled]msg: window is nullptr"));
8836             return;
8837         }
8838         if (!WindowHelper::IsSubWindow(window->GetType())) {
8839             TLOGNE(WmsLogTag::WMS_SUB, "%{public}s only sub window is valid", where);
8840             task->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_CALLING,
8841                 "[window][setRelativePositionToParentWindowEnabled]msg: only sub window is valid"));
8842             return;
8843         }
8844         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->SetWindowAnchorInfo(windowAnchorInfo));
8845         if (ret == WmErrorCode::WM_OK) {
8846             task->Resolve(env, NapiGetUndefined(env));
8847         } else {
8848             TLOGNE(WmsLogTag::WMS_SUB, "%{public}s failed, ret %{public}d", where, ret);
8849             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "set window anchor info failed."));
8850         }
8851     };
8852     if (napi_status::napi_ok != napi_send_event(env, asyncTask, napi_eprio_high)) {
8853         napiAsyncTask->Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
8854             "[window][setRelativePositionToParentWindowEnabled]msg: send event failed"));
8855     }
8856     return result;
8857 }
8858 
OnSetFollowParentWindowLayoutEnabled(napi_env env,napi_callback_info info)8859 napi_value JsWindow::OnSetFollowParentWindowLayoutEnabled(napi_env env, napi_callback_info info)
8860 {
8861     size_t argc = FOUR_PARAMS_SIZE;
8862     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
8863     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
8864     if (argc != INDEX_ONE) {
8865         TLOGE(WmsLogTag::WMS_SUB, "argc is invalid: %{public}zu", argc);
8866         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8867     }
8868     bool isFollow = false;
8869     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], isFollow)) {
8870         TLOGE(WmsLogTag::WMS_SUB, "Failed to convert parameter to enable");
8871         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8872     }
8873     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
8874     const char* const where = __func__;
8875     napi_value result = nullptr;
8876     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
8877     auto asyncTask = [weakToken = wptr<Window>(windowToken_), task = napiAsyncTask, env, isFollow, where] {
8878         auto window = weakToken.promote();
8879         if (window == nullptr) {
8880             TLOGNE(WmsLogTag::WMS_SUB, "%{public}s window is nullptr", where);
8881             task->Reject(env, CreateJsError(env, static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY)));
8882             return;
8883         }
8884         if (!WindowHelper::IsSubWindow(window->GetType()) && !WindowHelper::IsDialogWindow(window->GetType())) {
8885             TLOGNE(WmsLogTag::WMS_SUB, "%{public}s only sub window and dialog is valid", where);
8886             task->Reject(env, CreateJsError(env, static_cast<int32_t>(WmErrorCode::WM_ERROR_INVALID_CALLING)));
8887             return;
8888         }
8889         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(window->SetFollowParentWindowLayoutEnabled(isFollow));
8890         if (ret == WmErrorCode::WM_OK) {
8891             task->Resolve(env, NapiGetUndefined(env));
8892         } else {
8893             TLOGNE(WmsLogTag::WMS_SUB, "%{public}s failed, ret %{public}d", where, ret);
8894             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "set follow parent layout failed."));
8895         }
8896     };
8897     napi_status status = napi_send_event(env, asyncTask, napi_eprio_high, "SetFollowParentWindowLayoutEnabled");
8898     if (status != napi_status::napi_ok) {
8899         napiAsyncTask->Reject(env, CreateJsError(env,
8900             static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
8901     }
8902     return result;
8903 }
8904 
OnSetWindowShadowEnabled(napi_env env,napi_callback_info info)8905 napi_value JsWindow::OnSetWindowShadowEnabled(napi_env env, napi_callback_info info)
8906 {
8907     size_t argc = FOUR_PARAMS_SIZE;
8908     napi_value argv[FOUR_PARAMS_SIZE] = { nullptr };
8909     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
8910     if (argc != INDEX_ONE) {
8911         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "argc is invalid: %{public}zu", argc);
8912         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8913     }
8914     bool enabled = true;
8915     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], enabled)) {
8916         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Failed to convert parameter to enable");
8917         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
8918     }
8919     std::shared_ptr<WmErrorCode> errCodePtr = std::make_shared<WmErrorCode>(WmErrorCode::WM_OK);
8920     const char* const where = __func__;
8921     auto execute = [weakToken = wptr<Window>(windowToken_), errCodePtr, enabled, where] {
8922         auto window = weakToken.promote();
8923         if (window == nullptr) {
8924             TLOGNE(WmsLogTag::WMS_ATTRIBUTE, "%{public}s window is null", where);
8925             *errCodePtr = WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
8926             return;
8927         }
8928         *errCodePtr = WM_JS_TO_ERROR_CODE_MAP.at(window->SetWindowShadowEnabled(enabled));
8929         TLOGNI(WmsLogTag::WMS_ATTRIBUTE, "%{public}s winId: %{public}u, set enable: %{public}u",
8930             where, window->GetWindowId(), enabled);
8931     };
8932     auto complete = [errCodePtr, where](napi_env env, NapiAsyncTask& task, int32_t status) {
8933         if (*errCodePtr == WmErrorCode::WM_OK) {
8934             task.Resolve(env, NapiGetUndefined(env));
8935         } else {
8936             TLOGNE(WmsLogTag::WMS_ATTRIBUTE, "%{public}s set failed, result: %{public}d", where, *errCodePtr);
8937             task.Reject(env, JsErrUtils::CreateJsError(env, *errCodePtr, "set window shadow failed."));
8938         }
8939     };
8940     napi_value result = nullptr;
8941     NapiAsyncTask::Schedule("JsWindow::OnSetWindowShadowEnabled",
8942         env, CreateAsyncTaskWithLastParam(env, nullptr, std::move(execute), std::move(complete), &result));
8943     return result;
8944 }
8945 
BindFunctions(napi_env env,napi_value object,const char * moduleName)8946 void BindFunctions(napi_env env, napi_value object, const char* moduleName)
8947 {
8948     BindNativeFunction(env, object, "startMoving", moduleName, JsWindow::StartMoving);
8949     BindNativeFunction(env, object, "stopMoving", moduleName, JsWindow::StopMoving);
8950     BindNativeFunction(env, object, "show", moduleName, JsWindow::Show);
8951     BindNativeFunction(env, object, "showWindow", moduleName, JsWindow::ShowWindow);
8952     BindNativeFunction(env, object, "showWithAnimation", moduleName, JsWindow::ShowWithAnimation);
8953     BindNativeFunction(env, object, "destroy", moduleName, JsWindow::Destroy);
8954     BindNativeFunction(env, object, "destroyWindow", moduleName, JsWindow::DestroyWindow);
8955     BindNativeFunction(env, object, "hide", moduleName, JsWindow::Hide);
8956     BindNativeFunction(env, object, "hideWithAnimation", moduleName, JsWindow::HideWithAnimation);
8957     BindNativeFunction(env, object, "recover", moduleName, JsWindow::Recover);
8958     BindNativeFunction(env, object, "restore", moduleName, JsWindow::Restore);
8959     BindNativeFunction(env, object, "moveTo", moduleName, JsWindow::MoveTo);
8960     BindNativeFunction(env, object, "moveWindowTo", moduleName, JsWindow::MoveWindowTo);
8961     BindNativeFunction(env, object, "moveWindowToAsync", moduleName, JsWindow::MoveWindowToAsync);
8962     BindNativeFunction(env, object, "moveWindowToGlobal", moduleName, JsWindow::MoveWindowToGlobal);
8963     BindNativeFunction(env, object, "moveWindowToGlobalDisplay", moduleName, JsWindow::MoveWindowToGlobalDisplay);
8964     BindNativeFunction(env, object, "getGlobalRect", moduleName, JsWindow::GetGlobalScaledRect);
8965     BindNativeFunction(env, object, "resetSize", moduleName, JsWindow::Resize);
8966     BindNativeFunction(env, object, "resize", moduleName, JsWindow::ResizeWindow);
8967     BindNativeFunction(env, object, "resizeAsync", moduleName, JsWindow::ResizeWindowAsync);
8968     BindNativeFunction(env, object, "resizeWindowWithAnimation",
8969         moduleName, JsWindow::ResizeWindowWithAnimation);
8970     BindNativeFunction(env, object, "clientToGlobalDisplay", moduleName, JsWindow::ClientToGlobalDisplay);
8971     BindNativeFunction(env, object, "globalDisplayToClient", moduleName, JsWindow::GlobalDisplayToClient);
8972     BindNativeFunction(env, object, "setWindowType", moduleName, JsWindow::SetWindowType);
8973     BindNativeFunction(env, object, "setWindowMode", moduleName, JsWindow::SetWindowMode);
8974     BindNativeFunction(env, object, "getProperties", moduleName, JsWindow::GetProperties);
8975     BindNativeFunction(env, object, "getWindowProperties", moduleName, JsWindow::GetWindowPropertiesSync);
8976     BindNativeFunction(env, object, "on", moduleName, JsWindow::RegisterWindowCallback);
8977     BindNativeFunction(env, object, "off", moduleName, JsWindow::UnregisterWindowCallback);
8978     BindNativeFunction(env, object, "bindDialogTarget", moduleName, JsWindow::BindDialogTarget);
8979     BindNativeFunction(env, object, "setDialogBackGestureEnabled", moduleName, JsWindow::SetDialogBackGestureEnabled);
8980     BindNativeFunction(env, object, "loadContent", moduleName, JsWindow::LoadContent);
8981     BindNativeFunction(env, object, "loadContentByName", moduleName, JsWindow::LoadContentByName);
8982     BindNativeFunction(env, object, "getUIContext", moduleName, JsWindow::GetUIContext);
8983     BindNativeFunction(env, object, "setUIContent", moduleName, JsWindow::SetUIContent);
8984     BindNativeFunction(env, object, "setFullScreen", moduleName, JsWindow::SetFullScreen);
8985     BindNativeFunction(env, object, "setLayoutFullScreen", moduleName, JsWindow::SetLayoutFullScreen);
8986     BindNativeFunction(env, object, "setTitleAndDockHoverShown",
8987         moduleName, JsWindow::SetTitleAndDockHoverShown);
8988     BindNativeFunction(env, object, "setWindowLayoutFullScreen", moduleName, JsWindow::SetWindowLayoutFullScreen);
8989     BindNativeFunction(env, object, "setSystemBarEnable", moduleName, JsWindow::SetSystemBarEnable);
8990     BindNativeFunction(env, object, "setWindowSystemBarEnable", moduleName, JsWindow::SetWindowSystemBarEnable);
8991     BindNativeFunction(env, object, "setSystemBarProperties", moduleName, JsWindow::SetSystemBarProperties);
8992     BindNativeFunction(env, object, "getWindowSystemBarProperties",
8993         moduleName, JsWindow::GetWindowSystemBarPropertiesSync);
8994     BindNativeFunction(env, object, "setWindowSystemBarProperties",
8995         moduleName, JsWindow::SetWindowSystemBarProperties);
8996     BindNativeFunction(env, object, "setStatusBarColor", moduleName, JsWindow::SetStatusBarColor);
8997     BindNativeFunction(env, object, "getStatusBarProperty", moduleName, JsWindow::GetStatusBarProperty);
8998     BindNativeFunction(env, object, "getAvoidArea", moduleName, JsWindow::GetAvoidArea);
8999     BindNativeFunction(env, object, "getWindowAvoidArea", moduleName, JsWindow::GetWindowAvoidAreaSync);
9000     BindNativeFunction(env, object, "isShowing", moduleName, JsWindow::IsShowing);
9001     BindNativeFunction(env, object, "isWindowShowing", moduleName, JsWindow::IsWindowShowingSync);
9002     BindNativeFunction(env, object, "isSupportWideGamut", moduleName, JsWindow::IsSupportWideGamut);
9003     BindNativeFunction(env, object, "isWindowSupportWideGamut", moduleName, JsWindow::IsWindowSupportWideGamut);
9004     BindNativeFunction(env, object, "setColorSpace", moduleName, JsWindow::SetColorSpace);
9005     BindNativeFunction(env, object, "setWindowColorSpace", moduleName, JsWindow::SetWindowColorSpace);
9006     BindNativeFunction(env, object, "getColorSpace", moduleName, JsWindow::GetColorSpace);
9007     BindNativeFunction(env, object, "getWindowColorSpace", moduleName, JsWindow::GetWindowColorSpaceSync);
9008     BindNativeFunction(env, object, "setBackgroundColor", moduleName, JsWindow::SetBackgroundColor);
9009     BindNativeFunction(env, object, "setWindowBackgroundColor", moduleName, JsWindow::SetWindowBackgroundColorSync);
9010     BindNativeFunction(env, object, "setBrightness", moduleName, JsWindow::SetBrightness);
9011     BindNativeFunction(env, object, "setWindowBrightness", moduleName, JsWindow::SetWindowBrightness);
9012     BindNativeFunction(env, object, "setTopmost", moduleName, JsWindow::SetTopmost);
9013     BindNativeFunction(env, object, "setSubWindowZLevel", moduleName, JsWindow::SetSubWindowZLevel);
9014     BindNativeFunction(env, object, "getSubWindowZLevel", moduleName, JsWindow::GetSubWindowZLevel);
9015     BindNativeFunction(env, object, "setWindowTopmost", moduleName, JsWindow::SetWindowTopmost);
9016     BindNativeFunction(env, object, "setWindowDelayRaiseOnDrag", moduleName, JsWindow::SetWindowDelayRaiseOnDrag);
9017     BindNativeFunction(env, object, "setDimBehind", moduleName, JsWindow::SetDimBehind);
9018     BindNativeFunction(env, object, "setFocusable", moduleName, JsWindow::SetFocusable);
9019     BindNativeFunction(env, object, "setWindowFocusable", moduleName, JsWindow::SetWindowFocusable);
9020     BindNativeFunction(env, object, "setKeepScreenOn", moduleName, JsWindow::SetKeepScreenOn);
9021     BindNativeFunction(env, object, "setWindowKeepScreenOn", moduleName, JsWindow::SetWindowKeepScreenOn);
9022     BindNativeFunction(env, object, "setWakeUpScreen", moduleName, JsWindow::SetWakeUpScreen);
9023     BindNativeFunction(env, object, "setOutsideTouchable", moduleName, JsWindow::SetOutsideTouchable);
9024     BindNativeFunction(env, object, "setPrivacyMode", moduleName, JsWindow::SetPrivacyMode);
9025     BindNativeFunction(env, object, "setWindowPrivacyMode", moduleName, JsWindow::SetWindowPrivacyMode);
9026     BindNativeFunction(env, object, "setTouchable", moduleName, JsWindow::SetTouchable);
9027     BindNativeFunction(env, object, "setTouchableAreas", moduleName, JsWindow::SetTouchableAreas);
9028     BindNativeFunction(env, object, "setWindowTouchable", moduleName, JsWindow::SetWindowTouchable);
9029     BindNativeFunction(env, object, "setTransparent", moduleName, JsWindow::SetTransparent);
9030     BindNativeFunction(env, object, "setCallingWindow", moduleName, JsWindow::SetCallingWindow);
9031     BindNativeFunction(env, object, "setSnapshotSkip", moduleName, JsWindow::SetSnapshotSkip);
9032     BindNativeFunction(env, object, "raiseToAppTop", moduleName, JsWindow::RaiseToAppTop);
9033     BindNativeFunction(env, object, "disableWindowDecor", moduleName, JsWindow::DisableWindowDecor);
9034     BindNativeFunction(env, object, "dump", moduleName, JsWindow::Dump);
9035     BindNativeFunction(env, object, "setForbidSplitMove", moduleName, JsWindow::SetForbidSplitMove);
9036     BindNativeFunction(env, object, "setPreferredOrientation", moduleName, JsWindow::SetPreferredOrientation);
9037     BindNativeFunction(env, object, "getPreferredOrientation", moduleName, JsWindow::GetPreferredOrientation);
9038     BindNativeFunction(env, object, "opacity", moduleName, JsWindow::Opacity);
9039     BindNativeFunction(env, object, "scale", moduleName, JsWindow::Scale);
9040     BindNativeFunction(env, object, "rotate", moduleName, JsWindow::Rotate);
9041     BindNativeFunction(env, object, "translate", moduleName, JsWindow::Translate);
9042     BindNativeFunction(env, object, "getTransitionController", moduleName, JsWindow::GetTransitionController);
9043     BindNativeFunction(env, object, "snapshot", moduleName, JsWindow::Snapshot);
9044     BindNativeFunction(env, object, "snapshotSync", moduleName, JsWindow::SnapshotSync);
9045     BindNativeFunction(env, object, "snapshotIgnorePrivacy", moduleName, JsWindow::SnapshotIgnorePrivacy);
9046     BindNativeFunction(env, object, "setCornerRadius", moduleName, JsWindow::SetCornerRadius);
9047     BindNativeFunction(env, object, "setWindowCornerRadius", moduleName, JsWindow::SetWindowCornerRadius);
9048     BindNativeFunction(env, object, "getWindowCornerRadius", moduleName, JsWindow::GetWindowCornerRadius);
9049     BindNativeFunction(env, object, "setShadow", moduleName, JsWindow::SetShadow);
9050     BindNativeFunction(env, object, "setWindowShadowRadius", moduleName, JsWindow::SetWindowShadowRadius);
9051     BindNativeFunction(env, object, "setBlur", moduleName, JsWindow::SetBlur);
9052     BindNativeFunction(env, object, "setBackdropBlur", moduleName, JsWindow::SetBackdropBlur);
9053     BindNativeFunction(env, object, "setBackdropBlurStyle", moduleName, JsWindow::SetBackdropBlurStyle);
9054     BindNativeFunction(env, object, "setAspectRatio", moduleName, JsWindow::SetAspectRatio);
9055     BindNativeFunction(env, object, "resetAspectRatio", moduleName, JsWindow::ResetAspectRatio);
9056     BindNativeFunction(env, object, "setWaterMarkFlag", moduleName, JsWindow::SetWaterMarkFlag);
9057     BindNativeFunction(env, object, "setHandwritingFlag", moduleName, JsWindow::SetHandwritingFlag);
9058     BindNativeFunction(env, object, "minimize", moduleName, JsWindow::Minimize);
9059     BindNativeFunction(env, object, "maximize", moduleName, JsWindow::Maximize);
9060     BindNativeFunction(env, object, "setResizeByDragEnabled", moduleName, JsWindow::SetResizeByDragEnabled);
9061     BindNativeFunction(env, object, "setRaiseByClickEnabled", moduleName, JsWindow::SetRaiseByClickEnabled);
9062     BindNativeFunction(env, object, "raiseAboveTarget", moduleName, JsWindow::RaiseAboveTarget);
9063     BindNativeFunction(env, object, "raiseMainWindowAboveTarget", moduleName, JsWindow::RaiseMainWindowAboveTarget);
9064     BindNativeFunction(env, object, "hideNonSystemFloatingWindows", moduleName,
9065         JsWindow::HideNonSystemFloatingWindows);
9066     BindNativeFunction(env, object, "keepKeyboardOnFocus", moduleName, JsWindow::KeepKeyboardOnFocus);
9067     BindNativeFunction(env, object, "setWindowLimits", moduleName, JsWindow::SetWindowLimits);
9068     BindNativeFunction(env, object, "getWindowLimits", moduleName, JsWindow::GetWindowLimits);
9069     BindNativeFunction(env, object, "setSpecificSystemBarEnabled", moduleName, JsWindow::SetSpecificSystemBarEnabled);
9070     BindNativeFunction(env, object, "setSingleFrameComposerEnabled", moduleName,
9071         JsWindow::SetSingleFrameComposerEnabled);
9072     BindNativeFunction(env, object, "enableLandscapeMultiWindow", moduleName, JsWindow::EnableLandscapeMultiWindow);
9073     BindNativeFunction(env, object, "disableLandscapeMultiWindow", moduleName, JsWindow::DisableLandscapeMultiWindow);
9074     BindNativeFunction(env, object, "setWindowTitle", moduleName, JsWindow::SetWindowTitle);
9075     BindNativeFunction(env, object, "setWindowDecorVisible", moduleName, JsWindow::SetWindowDecorVisible);
9076     BindNativeFunction(env, object, "getWindowDecorVisible", moduleName, JsWindow::GetWindowDecorVisible);
9077     BindNativeFunction(env, object, "setWindowTitleMoveEnabled", moduleName, JsWindow::SetWindowTitleMoveEnabled);
9078     BindNativeFunction(env, object, "setSubWindowModal", moduleName, JsWindow::SetSubWindowModal);
9079     BindNativeFunction(env, object, "setFollowParentMultiScreenPolicy",
9080         moduleName, JsWindow::SetFollowParentMultiScreenPolicy);
9081     BindNativeFunction(env, object, "setWindowTransitionAnimation",
9082         moduleName, JsWindow::SetWindowTransitionAnimation);
9083     BindNativeFunction(env, object, "getWindowTransitionAnimation",
9084         moduleName, JsWindow::GetWindowTransitionAnimation);
9085     BindNativeFunction(env, object, "enableDrag", moduleName, JsWindow::EnableDrag);
9086     BindNativeFunction(env, object, "setWindowDecorHeight", moduleName, JsWindow::SetWindowDecorHeight);
9087     BindNativeFunction(env, object, "getWindowDecorHeight", moduleName, JsWindow::GetWindowDecorHeight);
9088     BindNativeFunction(env, object, "setDecorButtonStyle", moduleName, JsWindow::SetDecorButtonStyle);
9089     BindNativeFunction(env, object, "getDecorButtonStyle", moduleName, JsWindow::GetDecorButtonStyle);
9090     BindNativeFunction(env, object, "getTitleButtonRect", moduleName, JsWindow::GetTitleButtonRect);
9091     BindNativeFunction(env, object, "setTitleButtonVisible", moduleName, JsWindow::SetTitleButtonVisible);
9092     BindNativeFunction(env, object, "setWindowTitleButtonVisible", moduleName, JsWindow::SetWindowTitleButtonVisible);
9093     BindNativeFunction(env, object, "setWindowContainerColor", moduleName, JsWindow::SetWindowContainerColor);
9094     BindNativeFunction(env, object, "setWindowContainerModalColor", moduleName, JsWindow::SetWindowContainerModalColor);
9095     BindNativeFunction(env, object, "setWindowMask", moduleName, JsWindow::SetWindowMask);
9096     BindNativeFunction(env, object, "setWindowGrayScale", moduleName, JsWindow::SetWindowGrayScale);
9097     BindNativeFunction(env, object, "setImmersiveModeEnabledState", moduleName, JsWindow::SetImmersiveModeEnabledState);
9098     BindNativeFunction(env, object, "getImmersiveModeEnabledState", moduleName, JsWindow::GetImmersiveModeEnabledState);
9099     BindNativeFunction(env, object, "getWindowStatus", moduleName, JsWindow::GetWindowStatus);
9100     BindNativeFunction(env, object, "isFocused", moduleName, JsWindow::IsFocused);
9101     BindNativeFunction(env, object, "requestFocus", moduleName, JsWindow::RequestFocus);
9102     BindNativeFunction(env, object, "createSubWindowWithOptions", moduleName, JsWindow::CreateSubWindowWithOptions);
9103     BindNativeFunction(env, object, "setParentWindow", moduleName, JsWindow::SetParentWindow);
9104     BindNativeFunction(env, object, "getParentWindow", moduleName, JsWindow::GetParentWindow);
9105     BindNativeFunction(env, object, "setGestureBackEnabled", moduleName, JsWindow::SetGestureBackEnabled);
9106     BindNativeFunction(env, object, "isGestureBackEnabled", moduleName, JsWindow::GetGestureBackEnabled);
9107     BindNativeFunction(env, object, "getWindowDensityInfo", moduleName, JsWindow::GetWindowDensityInfo);
9108     BindNativeFunction(env, object, "setDefaultDensityEnabled", moduleName, JsWindow::SetDefaultDensityEnabled);
9109     BindNativeFunction(env, object, "isMainWindowFullScreenAcrossDisplays", moduleName,
9110         JsWindow::IsMainWindowFullScreenAcrossDisplays);
9111     BindNativeFunction(env, object, "setSystemAvoidAreaEnabled", moduleName, JsWindow::SetSystemAvoidAreaEnabled);
9112     BindNativeFunction(env, object, "isSystemAvoidAreaEnabled", moduleName, JsWindow::IsSystemAvoidAreaEnabled);
9113     BindNativeFunction(env, object, "setExclusivelyHighlighted", moduleName, JsWindow::SetExclusivelyHighlighted);
9114     BindNativeFunction(env, object, "isWindowHighlighted", moduleName, JsWindow::IsWindowHighlighted);
9115     BindNativeFunction(env, object, "setDragKeyFramePolicy", moduleName, JsWindow::SetDragKeyFramePolicy);
9116     BindNativeFunction(env, object, "setRelativePositionToParentWindowEnabled", moduleName,
9117         JsWindow::SetRelativePositionToParentWindowEnabled);
9118     BindNativeFunction(env, object, "setFollowParentWindowLayoutEnabled", moduleName,
9119         JsWindow::SetFollowParentWindowLayoutEnabled);
9120     BindNativeFunction(env, object, "setWindowShadowEnabled", moduleName, JsWindow::SetWindowShadowEnabled);
9121     BindNativeFunction(env, object, "isImmersiveLayout", moduleName, JsWindow::IsImmersiveLayout);
9122 }
9123 }  // namespace Rosen
9124 }  // namespace OHOS
9125