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