• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "js_err_utils.h"
16 #include "js_window_manager.h"
17 #include <ability.h>
18 #include <cinttypes>
19 #include <hitrace_meter.h>
20 #include <new>
21 #include <transaction/rs_interfaces.h>
22 #include "ability_context.h"
23 #include "display_manager.h"
24 #include "dm_common.h"
25 #include "wm_common.h"
26 #include "js_window.h"
27 #include "js_window_utils.h"
28 #include "window_helper.h"
29 #include "window_manager_hilog.h"
30 #include "window_option.h"
31 #include "pixel_map_napi.h"
32 #include "permission.h"
33 #include "singleton_container.h"
34 
35 namespace OHOS {
36 namespace Rosen {
37 using namespace AbilityRuntime;
38 namespace {
39 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "JsWindowManager"};
40 const std::string PIP_WINDOW = "pip_window";
41 constexpr size_t INDEX_ZERO = 0;
42 constexpr size_t INDEX_ONE = 1;
43 constexpr size_t ARGC_ONE = 1;
44 constexpr size_t ARGC_TWO = 2;
45 constexpr size_t ARGC_THREE = 3;
46 constexpr size_t ARGC_FOUR = 4;
47 constexpr int32_t INVALID_COORDINATE = -1;
48 }
49 
JsWindowManager()50 JsWindowManager::JsWindowManager() : registerManager_(std::make_unique<JsWindowRegisterManager>())
51 {
52 }
53 
~JsWindowManager()54 JsWindowManager::~JsWindowManager()
55 {
56 }
57 
Finalizer(napi_env env,void * data,void * hint)58 void JsWindowManager::Finalizer(napi_env env, void* data, void* hint)
59 {
60     WLOGI("Finalizer");
61     std::unique_ptr<JsWindowManager>(static_cast<JsWindowManager*>(data));
62 }
63 
Create(napi_env env,napi_callback_info info)64 napi_value JsWindowManager::Create(napi_env env, napi_callback_info info)
65 {
66     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
67     return (me != nullptr) ? me->OnCreate(env, info) : nullptr;
68 }
69 
CreateWindow(napi_env env,napi_callback_info info)70 napi_value JsWindowManager::CreateWindow(napi_env env, napi_callback_info info)
71 {
72     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
73     return (me != nullptr) ? me->OnCreateWindow(env, info) : nullptr;
74 }
75 
FindWindow(napi_env env,napi_callback_info info)76 napi_value JsWindowManager::FindWindow(napi_env env, napi_callback_info info)
77 {
78     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
79     return (me != nullptr) ? me->OnFindWindow(env, info) : nullptr;
80 }
81 
FindWindowSync(napi_env env,napi_callback_info info)82 napi_value JsWindowManager::FindWindowSync(napi_env env, napi_callback_info info)
83 {
84     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
85     return (me != nullptr) ? me->OnFindWindowSync(env, info) : nullptr;
86 }
87 
MinimizeAll(napi_env env,napi_callback_info info)88 napi_value JsWindowManager::MinimizeAll(napi_env env, napi_callback_info info)
89 {
90     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
91     return (me != nullptr) ? me->OnMinimizeAll(env, info) : nullptr;
92 }
93 
ToggleShownStateForAllAppWindows(napi_env env,napi_callback_info info)94 napi_value JsWindowManager::ToggleShownStateForAllAppWindows(napi_env env, napi_callback_info info)
95 {
96     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
97     return (me != nullptr) ? me->OnToggleShownStateForAllAppWindows(env, info) : nullptr;
98 }
99 
RegisterWindowManagerCallback(napi_env env,napi_callback_info info)100 napi_value JsWindowManager::RegisterWindowManagerCallback(napi_env env, napi_callback_info info)
101 {
102     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
103     return (me != nullptr) ? me->OnRegisterWindowManagerCallback(env, info) : nullptr;
104 }
105 
UnregisterWindowMangerCallback(napi_env env,napi_callback_info info)106 napi_value JsWindowManager::UnregisterWindowMangerCallback(napi_env env, napi_callback_info info)
107 {
108     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
109     return (me != nullptr) ? me->OnUnregisterWindowManagerCallback(env, info) : nullptr;
110 }
111 
GetTopWindow(napi_env env,napi_callback_info info)112 napi_value JsWindowManager::GetTopWindow(napi_env env, napi_callback_info info)
113 {
114     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
115     return (me != nullptr) ? me->OnGetTopWindow(env, info) : nullptr;
116 }
117 
118 /** @note @window.hierarchy */
GetLastWindow(napi_env env,napi_callback_info info)119 napi_value JsWindowManager::GetLastWindow(napi_env env, napi_callback_info info)
120 {
121     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
122     return (me != nullptr) ? me->OnGetLastWindow(env, info) : nullptr;
123 }
124 
GetSnapshot(napi_env env,napi_callback_info info)125 napi_value JsWindowManager::GetSnapshot(napi_env env, napi_callback_info info)
126 {
127     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
128     return (me != nullptr) ? me->OnGetSnapshot(env, info) : nullptr;
129 }
130 
SetWindowLayoutMode(napi_env env,napi_callback_info info)131 napi_value JsWindowManager::SetWindowLayoutMode(napi_env env, napi_callback_info info)
132 {
133     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
134     return (me != nullptr) ? me->OnSetWindowLayoutMode(env, info) : nullptr;
135 }
136 
SetGestureNavigationEnabled(napi_env env,napi_callback_info info)137 napi_value JsWindowManager::SetGestureNavigationEnabled(napi_env env, napi_callback_info info)
138 {
139     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
140     return (me != nullptr) ? me->OnSetGestureNavigationEnabled(env, info) : nullptr;
141 }
142 
SetWaterMarkImage(napi_env env,napi_callback_info info)143 napi_value JsWindowManager::SetWaterMarkImage(napi_env env, napi_callback_info info)
144 {
145     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
146     return (me != nullptr) ? me->OnSetWaterMarkImage(env, info) : nullptr;
147 }
148 
ShiftAppWindowFocus(napi_env env,napi_callback_info info)149 napi_value JsWindowManager::ShiftAppWindowFocus(napi_env env, napi_callback_info info)
150 {
151     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
152     return (me != nullptr) ? me->OnShiftAppWindowFocus(env, info) : nullptr;
153 }
154 
GetAllWindowLayoutInfo(napi_env env,napi_callback_info info)155 napi_value JsWindowManager::GetAllWindowLayoutInfo(napi_env env, napi_callback_info info)
156 {
157     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
158     return (me != nullptr) ? me->OnGetAllWindowLayoutInfo(env, info) : nullptr;
159 }
160 
GetVisibleWindowInfo(napi_env env,napi_callback_info info)161 napi_value JsWindowManager::GetVisibleWindowInfo(napi_env env, napi_callback_info info)
162 {
163     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
164     return (me != nullptr) ? me->OnGetVisibleWindowInfo(env, info) : nullptr;
165 }
166 
GetWindowsByCoordinate(napi_env env,napi_callback_info info)167 napi_value JsWindowManager::GetWindowsByCoordinate(napi_env env, napi_callback_info info)
168 {
169     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
170     return (me != nullptr) ? me->OnGetWindowsByCoordinate(env, info) : nullptr;
171 }
172 
ShiftAppWindowPointerEvent(napi_env env,napi_callback_info info)173 napi_value JsWindowManager::ShiftAppWindowPointerEvent(napi_env env, napi_callback_info info)
174 {
175     JsWindowManager* me = CheckParamsAndGetThis<JsWindowManager>(env, info);
176     return (me != nullptr) ? me->OnShiftAppWindowPointerEvent(env, info) : nullptr;
177 }
178 
GetNativeContext(napi_env env,napi_value nativeContext,void * & contextPtr,WMError & errCode)179 static void GetNativeContext(napi_env env, napi_value nativeContext, void*& contextPtr, WMError& errCode)
180 {
181     AppExecFwk::Ability* ability = nullptr;
182     bool isOldApi = GetAPI7Ability(env, ability);
183     WLOGFD("FA mode:%{public}u", isOldApi);
184     if (isOldApi) {
185         return;
186     }
187     if (nativeContext != nullptr) {
188         napi_unwrap(env, nativeContext, &contextPtr);
189     }
190 }
191 
GetParentId(napi_env env)192 static uint32_t GetParentId(napi_env env)
193 {
194     AppExecFwk::Ability* ability = nullptr;
195     uint32_t parentId = 0;
196     bool isOldApi = GetAPI7Ability(env, ability);
197     if (isOldApi) {
198         if (ability == nullptr) {
199             WLOGE("FA mode GetAPI7Ability failed");
200             return parentId;
201         }
202         auto window = ability->GetWindow();
203         if (window == nullptr) {
204             WLOGE("Get mainWindow failed");
205             return parentId;
206         }
207         parentId = window->GetWindowId();
208     }
209     return parentId;
210 }
211 
GetWindowTypeAndParentId(napi_env env,uint32_t & parentId,WindowType & winType,napi_value nativeString,napi_value nativeType)212 static bool GetWindowTypeAndParentId(napi_env env, uint32_t& parentId, WindowType& winType,
213     napi_value nativeString, napi_value nativeType)
214 {
215     napi_value type = nativeType;
216     if (type == nullptr) {
217         WLOGFE("Failed to convert parameter to windowType");
218         return false;
219     }
220     uint32_t resultValue = 0;
221     napi_get_value_uint32(env, type, &resultValue);
222     if (resultValue >= static_cast<uint32_t>(ApiWindowType::TYPE_BASE) &&
223         resultValue < static_cast<uint32_t>(ApiWindowType::TYPE_END)) {
224         winType = JS_TO_NATIVE_WINDOW_TYPE_MAP.at(static_cast<ApiWindowType>(resultValue));
225     } else {
226         WLOGFE("Type %{public}u is not supported", resultValue);
227         return false;
228     }
229 
230     AppExecFwk::Ability* ability = nullptr;
231     bool isOldApi = GetAPI7Ability(env, ability);
232     if (isOldApi) {
233         if (ability == nullptr || !WindowHelper::IsSubWindow(winType)) {
234             WLOGE("FA mode GetAPI7Ability failed or type %{public}u is not subWinodw", winType);
235             return false;
236         }
237         auto window = ability->GetWindow();
238         if (window == nullptr) {
239             WLOGE("Get mainWindow failed");
240             return false;
241         }
242         parentId = window->GetWindowId();
243     } else {
244         if (!WindowHelper::IsSystemWindow(winType)) {
245             WLOGFE("Only SystemWindow support create in stage mode, type is %{public}u", winType);
246             return false;
247         }
248     }
249     return true;
250 }
251 
CreateNewSystemWindowTask(void * contextPtr,sptr<WindowOption> windowOption,napi_env env,NapiAsyncTask & task)252 static void CreateNewSystemWindowTask(void* contextPtr, sptr<WindowOption> windowOption,
253     napi_env env, NapiAsyncTask& task)
254 {
255     WLOGI("CreateSystemWindowTask");
256     if (windowOption == nullptr) {
257         task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_SYSTEM_ABNORMALLY,
258             "New window option failed"));
259         WLOGFE("New window option failed");
260         return;
261     }
262     auto context = static_cast<std::weak_ptr<AbilityRuntime::Context>*>(contextPtr);
263     if (contextPtr == nullptr || context == nullptr) {
264         task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_CONTEXT_ABNORMALLY,
265             "Context is nullptr"));
266         WLOGFE("Context is nullptr");
267         return;
268     }
269     if (windowOption->GetWindowType() == WindowType::WINDOW_TYPE_FLOAT ||
270         windowOption->GetWindowType() == WindowType::WINDOW_TYPE_FLOAT_CAMERA) {
271         auto abilityContext = Context::ConvertTo<AbilityRuntime::AbilityContext>(context->lock());
272         if (abilityContext != nullptr) {
273             if (!CheckCallingPermission("ohos.permission.SYSTEM_FLOAT_WINDOW")) {
274                 task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_NO_PERMISSION,
275                     "TYPE_FLOAT CheckCallingPermission failed"));
276                 return;
277             }
278         }
279     }
280     WMError wmError = WMError::WM_OK;
281     sptr<Window> window = Window::Create(windowOption->GetWindowName(), windowOption, context->lock(), wmError);
282     WmErrorCode wmErrorCode = WM_JS_TO_ERROR_CODE_MAP.at(wmError);
283     if (window != nullptr && wmErrorCode == WmErrorCode::WM_OK) {
284         task.Resolve(env, CreateJsWindowObject(env, window));
285     } else {
286         WLOGFE("Create window failed");
287         task.Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode, "Create window failed"));
288     }
289 }
290 
CreateSystemWindowTask(void * contextPtr,std::string windowName,WindowType winType,napi_env env,NapiAsyncTask & task)291 static void CreateSystemWindowTask(void* contextPtr, std::string windowName, WindowType winType,
292     napi_env env, NapiAsyncTask& task)
293 {
294     WLOGFD("CreateSystemWindowTask");
295     auto context = static_cast<std::weak_ptr<AbilityRuntime::Context>*>(contextPtr);
296     if (contextPtr == nullptr || context == nullptr) {
297         task.Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR, "Context is nullptr"));
298         WLOGFE("Context is nullptr");
299         return;
300     }
301     if (winType == WindowType::WINDOW_TYPE_FLOAT || winType == WindowType::WINDOW_TYPE_FLOAT_CAMERA) {
302         auto abilityContext = Context::ConvertTo<AbilityRuntime::AbilityContext>(context->lock());
303         if (abilityContext != nullptr) {
304             if (!CheckCallingPermission("ohos.permission.SYSTEM_FLOAT_WINDOW")) {
305                 task.Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_INVALID_PERMISSION,
306                     "TYPE_FLOAT CheckCallingPermission failed"));
307                 return;
308             }
309         }
310     }
311     sptr<WindowOption> windowOption = new(std::nothrow) WindowOption();
312     if (windowOption == nullptr) {
313         task.Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR, "New window option failed"));
314         WLOGFE("New window option failed");
315         return;
316     }
317     windowOption->SetWindowType(winType);
318     WMError wmError = WMError::WM_OK;
319     sptr<Window> window = Window::Create(windowName, windowOption, context->lock(), wmError);
320     WmErrorCode wmErrorCode = WM_JS_TO_ERROR_CODE_MAP.at(wmError);
321     if (window != nullptr && wmErrorCode == WmErrorCode::WM_OK) {
322         task.Resolve(env, CreateJsWindowObject(env, window));
323     } else {
324         WLOGFE("Create window failed");
325         task.Reject(env, JsErrUtils::CreateJsError(env, wmErrorCode, "Create window failed"));
326     }
327 }
328 
CreateNewSubWindowTask(sptr<WindowOption> windowOption,napi_env env,NapiAsyncTask & task)329 static void CreateNewSubWindowTask(sptr<WindowOption> windowOption, napi_env env, NapiAsyncTask& task)
330 {
331     if (windowOption == nullptr) {
332         task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_SYSTEM_ABNORMALLY,
333             "New window option failed"));
334         WLOGFE("New window option failed");
335         return;
336     }
337     windowOption->SetWindowMode(Rosen::WindowMode::WINDOW_MODE_FLOATING);
338     if (windowOption->GetParentId() == INVALID_WINDOW_ID) {
339         uint32_t parentId = GetParentId(env);
340         if (!parentId) {
341             task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
342                 "parent window missed"));
343             WLOGFE("can not find parent window");
344             return;
345         }
346         windowOption->SetParentId(parentId);
347     }
348     sptr<Window> window = Window::Create(windowOption->GetWindowName(), windowOption);
349     if (window != nullptr) {
350         task.Resolve(env, CreateJsWindowObject(env, window));
351     } else {
352         WLOGFE("Create window failed");
353         task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
354             "Create window failed"));
355     }
356 }
357 
CreateSubWindowTask(uint32_t parentWinId,std::string windowName,WindowType winType,napi_env env,NapiAsyncTask & task,bool newErrorCode=false)358 static void CreateSubWindowTask(uint32_t parentWinId, std::string windowName, WindowType winType,
359     napi_env env, NapiAsyncTask& task, bool newErrorCode = false)
360 {
361     WLOGI("CreateSubWindowTask, parent id = %{public}u", parentWinId);
362     sptr<WindowOption> windowOption = new(std::nothrow) WindowOption();
363     if (windowOption == nullptr) {
364         if (newErrorCode) {
365             task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_SYSTEM_ABNORMALLY,
366                 "New window option failed"));
367         } else {
368             task.Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR, "New window option failed"));
369         }
370         WLOGFE("New window option failed");
371         return;
372     }
373     windowOption->SetWindowType(winType);
374     windowOption->SetWindowMode(Rosen::WindowMode::WINDOW_MODE_FLOATING);
375     windowOption->SetParentId(parentWinId);
376     sptr<Window> window = Window::Create(windowName, windowOption);
377     if (window != nullptr) {
378         task.Resolve(env, CreateJsWindowObject(env, window));
379     } else {
380         WLOGFE("Create window failed");
381         if (newErrorCode) {
382             task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
383                 "Create window failed"));
384         } else {
385             task.Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR, "Create window failed"));
386         }
387     }
388 }
389 
isConfigOptionWindowTypeValid(napi_env env,WindowOption & option)390 static bool isConfigOptionWindowTypeValid(napi_env env, WindowOption& option)
391 {
392     WindowType type = option.GetWindowType();
393     AppExecFwk::Ability* ability = nullptr;
394     bool isOldApi = GetAPI7Ability(env, ability);
395     if (isOldApi) {
396         if (ability == nullptr || !WindowHelper::IsSubWindow(type)) {
397             WLOGE("FA mode GetAPI7Ability failed or convert parameter to invalid winType %{public}u", type);
398             return false;
399         }
400     } else {
401         if (!WindowHelper::IsSystemWindow(type)) {
402             WLOGFE("Stage mode convert parameter to invalid winType %{public}u", type);
403             return false;
404         }
405     }
406 
407     return true;
408 }
409 
OnCreate(napi_env env,napi_callback_info info)410 napi_value JsWindowManager::OnCreate(napi_env env, napi_callback_info info)
411 {
412     WLOGFD("OnCreate");
413     napi_value nativeString = nullptr, nativeContext = nullptr, nativeType = nullptr, callback = nullptr;
414     size_t argc = 4;
415     napi_value argv[4] = {nullptr};
416     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
417     if (argc >= 2 && GetType(env, argv[0]) == napi_string) { // 2: minimum params num
418         nativeString = argv[0];
419         nativeType = argv[1];
420         callback = (argc == 2) ? nullptr : (GetType(env, argv[2]) == napi_function ? argv[2] : nullptr); // 2: index
421     } else if (argc >= 3) { // 3: minimum params num
422         nativeContext = GetType(env, argv[0]) == napi_object ? argv[0] : nullptr;
423         nativeString = argv[1];
424         nativeType = argv[2]; // 2: index of type
425         callback = (argc == 3) ? nullptr : (GetType(env, argv[3]) == napi_function ? argv[3] : nullptr); // 3: index
426     }
427     std::string windowName;
428     WMError errCode = WMError::WM_OK;
429     if (!ConvertFromJsValue(env, nativeString, windowName)) {
430         WLOGFE("Failed to convert parameter to windowName");
431         errCode = WMError::WM_ERROR_INVALID_PARAM;
432     }
433     uint32_t parentId = INVALID_WINDOW_ID;
434     WindowType winType = WindowType::SYSTEM_WINDOW_BASE;
435     if (errCode == WMError::WM_OK &&
436         !GetWindowTypeAndParentId(env, parentId, winType, nativeString, nativeType)) {
437         errCode = WMError::WM_ERROR_INVALID_PARAM;
438     }
439     void* contextPtr = nullptr;
440     GetNativeContext(env, nativeContext, contextPtr, errCode);
441 
442     WLOGFD("Window name = %{public}s, type = %{public}u, err = %{public}d", windowName.c_str(), winType, errCode);
443     NapiAsyncTask::CompleteCallback complete =
444         [=](napi_env env, NapiAsyncTask& task, int32_t status) {
445             if (errCode != WMError::WM_OK) {
446                 task.Reject(env, JsErrUtils::CreateJsError(env, errCode, "Invalidate params"));
447                 return;
448             }
449             if (parentId == INVALID_WINDOW_ID) {
450                 return CreateSystemWindowTask(contextPtr, windowName, winType, env, task);
451             } else {
452                 return CreateSubWindowTask(parentId, windowName, winType, env, task);
453             }
454         };
455     napi_value result = nullptr;
456     NapiAsyncTask::Schedule("JsWindowManager::OnCreate", env,
457         CreateAsyncTaskWithLastParam(env, callback, nullptr, std::move(complete), &result));
458     return result;
459 }
460 
ParseRequiredConfigOption(napi_env env,napi_value jsObject,WindowOption & option)461 bool JsWindowManager::ParseRequiredConfigOption(napi_env env, napi_value jsObject,
462     WindowOption& option)
463 {
464     std::string windowName;
465     if (ParseJsValue(jsObject, env, "name", windowName)) {
466         option.SetWindowName(windowName);
467     } else {
468         WLOGFE("Failed to convert parameter to windowName");
469         return false;
470     }
471 
472     uint32_t winType;
473     if (ParseJsValue(jsObject, env, "windowType", winType)) {
474         if (winType >= static_cast<uint32_t>(ApiWindowType::TYPE_BASE) &&
475             winType < static_cast<uint32_t>(ApiWindowType::TYPE_END)) {
476             option.SetWindowType(JS_TO_NATIVE_WINDOW_TYPE_MAP.at(static_cast<ApiWindowType>(winType)));
477         } else {
478             TLOGE(WmsLogTag::DEFAULT, "Invalid winType");
479             return false;
480         }
481     } else {
482         WLOGFE("Failed to convert parameter to winType");
483         return false;
484     }
485     return true;
486 }
487 
ParseConfigOption(napi_env env,napi_value jsObject,WindowOption & option,void * & contextPtr)488 bool JsWindowManager::ParseConfigOption(napi_env env, napi_value jsObject,
489     WindowOption& option, void*& contextPtr)
490 {
491     if (!ParseRequiredConfigOption(env, jsObject, option)) {
492         return false;
493     }
494     if (!isConfigOptionWindowTypeValid(env, option)) {
495         return false;
496     }
497     napi_value value = nullptr;
498     napi_get_named_property(env, jsObject, "ctx", &value);
499     if (GetType(env, value) == napi_undefined) {
500         return true;
501     }
502     WMError errCode = WMError::WM_OK;
503     GetNativeContext(env, value, contextPtr, errCode);
504     if (errCode != WMError::WM_OK) {
505         return false;
506     }
507 
508     bool dialogDecorEnable = false;
509     if (ParseJsValue(jsObject, env, "decorEnabled", dialogDecorEnable)) {
510         option.SetDialogDecorEnable(dialogDecorEnable);
511     }
512 
513     std::string dialogTitle;
514     if (ParseJsValue(jsObject, env, "title", dialogTitle)) {
515         option.SetDialogTitle(dialogTitle);
516     }
517 
518     int64_t displayId = static_cast<int64_t>(DISPLAY_ID_INVALID);
519     if (ParseJsValue(jsObject, env, "displayId", displayId)) {
520         if (displayId < 0 ||
521             SingletonContainer::Get<DisplayManager>().GetDisplayById(static_cast<uint64_t>(displayId)) == nullptr) {
522             return false;
523         }
524         option.SetDisplayId(displayId);
525     } else {
526         return true;
527     }
528 
529     int64_t parentId = -1;
530     if (ParseJsValue(jsObject, env, "parentId", parentId)) {
531         option.SetParentId(parentId);
532     }
533 
534     return true;
535 }
536 
OnCreateWindow(napi_env env,napi_callback_info info)537 napi_value JsWindowManager::OnCreateWindow(napi_env env, napi_callback_info info)
538 {
539     WLOGFD("Called");
540     size_t argc = 4;
541     napi_value argv[4] = {nullptr};
542     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
543     if (argc < 1) {
544         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
545         return NapiGetUndefined(env);
546     }
547     napi_value nativeObj = argv[0];
548     if (nativeObj == nullptr) {
549         WLOGFE("Failed to convert object to CreateWindow");
550         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
551         return NapiGetUndefined(env);
552     }
553     WindowOption option;
554     void* contextPtr = nullptr;
555     if (!ParseConfigOption(env, nativeObj, option, contextPtr)) {
556         WLOGFE("Failed to parse config");
557         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
558         return NapiGetUndefined(env);
559     }
560     napi_value callback = nullptr;
561     if (argc > 1) {
562         callback = GetType(env, argv[1]) == napi_function ? argv[1] : nullptr; // 1: index of callback
563     }
564     NapiAsyncTask::CompleteCallback complete =
565         [=](napi_env env, NapiAsyncTask& task, int32_t status) {
566             sptr<WindowOption> windowOption = new WindowOption(option);
567             if (WindowHelper::IsSystemWindow(option.GetWindowType())) {
568                 return CreateNewSystemWindowTask(contextPtr, windowOption, env, task);
569             }
570             if (WindowHelper::IsSubWindow(option.GetWindowType())) {
571                 return CreateNewSubWindowTask(windowOption, env, task);
572             }
573         };
574 
575     napi_value result = nullptr;
576     NapiAsyncTask::Schedule("JsWindowManager::OnCreateWindow", env,
577         CreateAsyncTaskWithLastParam(env, callback, nullptr, std::move(complete), &result));
578     return result;
579 }
580 
OnGetSnapshot(napi_env env,napi_callback_info info)581 napi_value JsWindowManager::OnGetSnapshot(napi_env env, napi_callback_info info)
582 {
583     constexpr int maxArgumentsNum = 4;
584     size_t argc = maxArgumentsNum;
585     napi_value argv[maxArgumentsNum] = {nullptr};
586     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
587     if (argc != 1) {
588         TLOGE(WmsLogTag::WMS_SYSTEM, "[NAPI]Argc is invalid:%{public}zu", argc);
589         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
590         return NapiGetUndefined(env);
591     }
592     int32_t windowId = 0;
593     if (!ConvertFromJsValue(env, argv[0], windowId)) {
594         TLOGE(WmsLogTag::WMS_SYSTEM, "[NAPI]Failed to convert parameter to integer");
595         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
596         return NapiGetUndefined(env);
597     }
598     std::shared_ptr<WindowSnapshotDataPack> dataPack = std::make_shared<WindowSnapshotDataPack>();
599     NapiAsyncTask::ExecuteCallback execute = [dataPack, windowId]() {
600         dataPack->result = SingletonContainer::Get<WindowManager>()
601             .GetSnapshotByWindowId(windowId, dataPack->pixelMap);
602     };
603     NapiAsyncTask::CompleteCallback complete =
604         [=](napi_env env, NapiAsyncTask& task, int32_t status) {
605             if (dataPack->result != WMError::WM_OK) {
606                 task.Reject(env, JsErrUtils::CreateJsError(env, WM_JS_TO_ERROR_CODE_MAP.at(dataPack->result)));
607                 TLOGW(WmsLogTag::WMS_SYSTEM, "[NAPI]Get snapshot not ok!");
608                 return;
609             }
610             if (dataPack->pixelMap == nullptr) {
611                 task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
612                 TLOGE(WmsLogTag::WMS_SYSTEM, "[NAPI]Get snapshot is nullptr!");
613                 return;
614             }
615             auto nativePixelMap = Media::PixelMapNapi::CreatePixelMap(env, dataPack->pixelMap);
616             if (nativePixelMap == nullptr) {
617                 task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
618                 TLOGE(WmsLogTag::WMS_SYSTEM, "[NAPI]Create native pixelmap is nullptr!");
619                 return;
620             }
621             task.Resolve(env, nativePixelMap);
622         };
623     napi_value lastParam = (argc <= 1) ? nullptr : argv[0];
624     napi_value result = nullptr;
625     NapiAsyncTask::Schedule("JsWindowManager::OnGetSnapshot",
626         env, CreateAsyncTaskWithLastParam(env, lastParam, std::move(execute), std::move(complete), &result));
627     return result;
628 }
629 
OnFindWindow(napi_env env,napi_callback_info info)630 napi_value JsWindowManager::OnFindWindow(napi_env env, napi_callback_info info)
631 {
632     WLOGFD("OnFindWindow");
633     std::string windowName;
634     WMError errCode = WMError::WM_OK;
635     size_t argc = 4;
636     napi_value argv[4] = {nullptr};
637     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
638     if (argc < 1 || argc > 2) { // 2: maximum params num
639         WLOGFE("Argc is invalid: %{public}zu", argc);
640         errCode = WMError::WM_ERROR_INVALID_PARAM;
641     } else {
642         if (!ConvertFromJsValue(env, argv[0], windowName)) {
643             WLOGFE("Failed to convert parameter to windowName");
644             errCode = WMError::WM_ERROR_INVALID_PARAM;
645         }
646     }
647     if (windowName.compare(PIP_WINDOW) == 0) {
648         errCode = WMError::WM_ERROR_INVALID_PARAM;
649     }
650     WLOGI("Window name = %{public}s, err = %{public}d", windowName.c_str(), errCode);
651     NapiAsyncTask::CompleteCallback complete =
652         [=](napi_env env, NapiAsyncTask& task, int32_t status) {
653             if (errCode != WMError::WM_OK) {
654                 task.Reject(env, JsErrUtils::CreateJsError(env, errCode, "Invalidate params"));
655                 return;
656             }
657             HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "WM:Find %s", windowName.c_str());
658             std::shared_ptr<NativeReference> jsWindowObj = FindJsWindowObject(windowName);
659             if (jsWindowObj != nullptr && jsWindowObj->GetNapiValue() != nullptr) {
660                 WLOGI("Find window: %{public}s, use exist js window", windowName.c_str());
661                 task.Resolve(env, jsWindowObj->GetNapiValue());
662             } else {
663                 sptr<Window> window = Window::Find(windowName);
664                 if (window == nullptr) {
665                     WLOGFE("Cannot find window: %{public}s", windowName.c_str());
666                     task.Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR, "Cannot find window"));
667                 } else {
668                     task.Resolve(env, CreateJsWindowObject(env, window));
669                     WLOGI("Find window: %{public}s, create js window", windowName.c_str());
670                 }
671             }
672         };
673 
674     napi_value lastParam = (argc <= 1) ? nullptr :
675         (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
676     napi_value result = nullptr;
677     NapiAsyncTask::Schedule("JsWindowManager::OnFindWindow",
678         env, CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result));
679     return result;
680 }
681 
OnFindWindowSync(napi_env env,napi_callback_info info)682 napi_value JsWindowManager::OnFindWindowSync(napi_env env, napi_callback_info info)
683 {
684     WLOGFD("OnFindWindowSync");
685     std::string windowName;
686     WmErrorCode errCode = WmErrorCode::WM_OK;
687     size_t argc = 4;
688     napi_value argv[4] = {nullptr};
689     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
690     if (argc < 1) { // 1: params num
691         WLOGFE("Argc is invalid: %{public}zu", argc);
692         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
693     } else {
694         if (!ConvertFromJsValue(env, argv[0], windowName)) {
695             WLOGFE("Failed to convert parameter to windowName");
696             errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
697         }
698     }
699     if (windowName.compare(PIP_WINDOW) == 0) {
700         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
701     }
702     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
703         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
704         return NapiGetUndefined(env);
705     }
706 
707     WLOGD("Window name = %{public}s, err = %{public}d", windowName.c_str(), errCode);
708     std::shared_ptr<NativeReference> jsWindowObj = FindJsWindowObject(windowName);
709     if (jsWindowObj != nullptr && jsWindowObj->GetNapiValue() != nullptr) {
710         WLOGD("Find window: %{public}s, use exist js window", windowName.c_str());
711         return jsWindowObj->GetNapiValue();
712     } else {
713         sptr<Window> window = Window::Find(windowName);
714         if (window == nullptr) {
715             napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY));
716             return NapiGetUndefined(env);
717         } else {
718             return CreateJsWindowObject(env, window);
719         }
720     }
721 }
722 
OnMinimizeAll(napi_env env,napi_callback_info info)723 napi_value JsWindowManager::OnMinimizeAll(napi_env env, napi_callback_info info)
724 {
725     WLOGI("OnMinimizeAll");
726     WmErrorCode errCode = WmErrorCode::WM_OK;
727     size_t argc = 4;
728     napi_value argv[4] = {nullptr};
729     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
730     if (argc < 1) {
731         WLOGFE("Argc is invalid: %{public}zu", argc);
732         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
733     }
734     int64_t displayId = static_cast<int64_t>(DISPLAY_ID_INVALID);
735     if (errCode == WmErrorCode::WM_OK && !ConvertFromJsValue(env, argv[0], displayId)) {
736         WLOGFE("Failed to convert parameter to displayId");
737         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
738     }
739     if (displayId < 0 ||
740         SingletonContainer::Get<DisplayManager>().GetDisplayById(static_cast<uint64_t>(displayId)) == nullptr) {
741         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
742     }
743     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
744         WLOGFE("JsWindowManager::OnMinimizeAll failed, Invalidate params.");
745         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
746         return NapiGetUndefined(env);
747     }
748 
749     WLOGI("Display id = %{public}" PRIu64", err = %{public}d", static_cast<uint64_t>(displayId), errCode);
750     NapiAsyncTask::CompleteCallback complete =
751         [=](napi_env env, NapiAsyncTask& task, int32_t status) {
752             HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "WM:MinimizeAll: " PRIu64"",
753                 static_cast<uint64_t>(displayId));
754             WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(
755                 SingletonContainer::Get<WindowManager>().MinimizeAllAppWindows(static_cast<uint64_t>(displayId)));
756             if (ret == WmErrorCode::WM_OK) {
757                 task.Resolve(env, NapiGetUndefined(env));
758                 WLOGFI("OnMinimizeAll success");
759             } else {
760                 task.Reject(env, JsErrUtils::CreateJsError(env, ret, "OnMinimizeAll failed"));
761             }
762         };
763     napi_value lastParam = (argc <= 1) ? nullptr :
764         ((argv[1] != nullptr && GetType(env, argv[1]) == napi_function) ? argv[1] : nullptr);
765     napi_value result = nullptr;
766     NapiAsyncTask::Schedule("JsWindowManager::OnMinimizeAll",
767         env, CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result));
768     return result;
769 }
770 
OnToggleShownStateForAllAppWindows(napi_env env,napi_callback_info info)771 napi_value JsWindowManager::OnToggleShownStateForAllAppWindows(napi_env env, napi_callback_info info)
772 {
773     WLOGI("OnToggleShownStateForAllAppWindows");
774     NapiAsyncTask::CompleteCallback complete =
775         [=](napi_env env, NapiAsyncTask& task, int32_t status) {
776             WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(
777                 SingletonContainer::Get<WindowManager>().ToggleShownStateForAllAppWindows());
778             if (ret == WmErrorCode::WM_OK) {
779                 task.Resolve(env, NapiGetUndefined(env));
780                 WLOGI("OnToggleShownStateForAllAppWindows success");
781             } else {
782                 task.Reject(env, JsErrUtils::CreateJsError(env, ret, "OnToggleShownStateForAllAppWindows failed"));
783             }
784         };
785     size_t argc = 4;
786     napi_value argv[4] = {nullptr};
787     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
788     napi_value lastParam = (argc == 0) ? nullptr :
789         (GetType(env, argv[0]) == napi_function ? argv[0] : nullptr);
790     napi_value result = nullptr;
791     NapiAsyncTask::Schedule("JsWindowManager::OnToggleShownStateForAllAppWindows",
792         env, CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result));
793     return result;
794 }
795 
OnRegisterWindowManagerCallback(napi_env env,napi_callback_info info)796 napi_value JsWindowManager::OnRegisterWindowManagerCallback(napi_env env, napi_callback_info info)
797 {
798     WLOGFD("OnRegisterWindowManagerCallback");
799     size_t argc = 4;
800     napi_value argv[4] = {nullptr};
801     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
802     if (argc < 2) { // 2: params num
803         WLOGFE("Argc is invalid: %{public}zu", argc);
804         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
805         return NapiGetUndefined(env);
806     }
807     std::string cbType;
808     if (!ConvertFromJsValue(env, argv[0], cbType)) {
809         WLOGFE("Failed to convert parameter to callbackType");
810         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
811         return NapiGetUndefined(env);
812     }
813     napi_value value = argv[1];
814     if (!NapiIsCallable(env, value)) {
815         WLOGI("Callback(argv[1]) is not callable");
816         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
817         return NapiGetUndefined(env);
818     }
819 
820     WmErrorCode ret = registerManager_->RegisterListener(nullptr, cbType, CaseType::CASE_WINDOW_MANAGER, env, value);
821     if (ret != WmErrorCode::WM_OK) {
822         napi_throw(env, JsErrUtils::CreateJsError(env, ret));
823         return NapiGetUndefined(env);
824     }
825     WLOGI("Register end, type = %{public}s", cbType.c_str());
826     return NapiGetUndefined(env);
827 }
828 
OnUnregisterWindowManagerCallback(napi_env env,napi_callback_info info)829 napi_value JsWindowManager::OnUnregisterWindowManagerCallback(napi_env env, napi_callback_info info)
830 {
831     WLOGFD("OnUnregisterWindowManagerCallback");
832     size_t argc = 4;
833     napi_value argv[4] = {nullptr};
834     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
835     if (argc < 1) {
836         WLOGFE("Argc is invalid: %{public}zu", argc);
837         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
838         return NapiGetUndefined(env);
839     }
840     std::string cbType;
841     if (!ConvertFromJsValue(env, argv[0], cbType)) {
842         WLOGFE("Failed to convert parameter to callbackType");
843         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
844         return NapiGetUndefined(env);
845     }
846 
847     napi_value value = nullptr;
848     WmErrorCode ret = WmErrorCode::WM_OK;
849     if (argc == 1) {
850         ret = registerManager_->UnregisterListener(nullptr, cbType, CaseType::CASE_WINDOW_MANAGER, env, value);
851     } else {
852         value = argv[1];
853         if ((value == nullptr) || (!NapiIsCallable(env, value))) {
854             ret = registerManager_->UnregisterListener(nullptr, cbType, CaseType::CASE_WINDOW_MANAGER, env, nullptr);
855         } else {
856             ret = registerManager_->UnregisterListener(nullptr, cbType, CaseType::CASE_WINDOW_MANAGER, env, value);
857         }
858     }
859     if (ret != WmErrorCode::WM_OK) {
860         napi_throw(env, JsErrUtils::CreateJsError(env, ret));
861         return NapiGetUndefined(env);
862     }
863     WLOGI("Unregister end, type = %{public}s", cbType.c_str());
864     return NapiGetUndefined(env);
865 }
866 
GetTopWindowTask(void * contextPtr,napi_env env,napi_value callback,bool newApi)867 static napi_value GetTopWindowTask(void* contextPtr, napi_env env, napi_value callback, bool newApi)
868 {
869     struct TopWindowInfoList {
870         sptr<Window> window = nullptr;
871         AppExecFwk::Ability* ability = nullptr;
872         int32_t errorCode = 0;
873         std::string errMsg = "";
874     };
875     std::shared_ptr<TopWindowInfoList> lists = std::make_shared<TopWindowInfoList>();
876     bool isOldApi = GetAPI7Ability(env, lists->ability);
877     NapiAsyncTask::ExecuteCallback execute = [lists, isOldApi, newApi, contextPtr]() {
878         if (lists == nullptr) {
879             return;
880         }
881         if (isOldApi) {
882             if (lists->ability->GetWindow() == nullptr) {
883                 lists->errorCode = newApi ? static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY) :
884                     static_cast<int32_t>(WMError::WM_ERROR_NULLPTR);
885                 lists->errMsg = "FA mode can not get ability window";
886                 return;
887             }
888             lists->window = Window::GetTopWindowWithId(lists->ability->GetWindow()->GetWindowId());
889         } else {
890             auto context = static_cast<std::weak_ptr<AbilityRuntime::Context>*>(contextPtr);
891             if (contextPtr == nullptr || context == nullptr) {
892                 lists->errorCode = newApi ? static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY) :
893                     static_cast<int32_t>(WMError::WM_ERROR_NULLPTR);
894                 lists->errMsg = "Stage mode without context";
895                 return;
896             }
897             lists->window = Window::GetTopWindowWithContext(context->lock());
898         }
899     };
900     NapiAsyncTask::CompleteCallback complete = [lists, newApi](napi_env env, NapiAsyncTask& task, int32_t status) {
901         if (lists == nullptr) {
902             if (newApi) {
903                 task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
904                     "napi abnormal"));
905             } else {
906                 task.Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR, "napi abnormal"));
907             }
908             return;
909         }
910         if (lists->errorCode != 0) {
911             if (newApi) {
912                 task.Reject(env, JsErrUtils::CreateJsError(env, static_cast<WmErrorCode>(lists->errorCode),
913                     lists->errMsg));
914             } else {
915                 task.Reject(env, JsErrUtils::CreateJsError(env, static_cast<WMError>(lists->errorCode),
916                     lists->errMsg));
917             }
918             WLOGFE("%{public}s", lists->errMsg.c_str());
919             return;
920         }
921         if (lists->window == nullptr || lists->window->GetWindowState() == WindowState::STATE_DESTROYED) {
922             if (newApi) {
923                 task.Reject(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_STATE_ABNORMALLY,
924                     "Get top window failed"));
925             } else {
926                 task.Reject(env, JsErrUtils::CreateJsError(env, WMError::WM_ERROR_NULLPTR,
927                     "Get top window failed"));
928             }
929             return;
930         }
931         task.Resolve(env, CreateJsWindowObject(env, lists->window));
932         WLOGD("Get top window success");
933     };
934     napi_value result = nullptr;
935     NapiAsyncTask::Schedule("JsWindowManager::OnGetTopWindow",
936         env, CreateAsyncTaskWithLastParam(env, callback, std::move(execute), std::move(complete), &result));
937     return result;
938 }
939 
OnGetTopWindow(napi_env env,napi_callback_info info)940 napi_value JsWindowManager::OnGetTopWindow(napi_env env, napi_callback_info info)
941 {
942     WLOGFD("OnGetTopWindow");
943     WMError errCode = WMError::WM_OK;
944     napi_value nativeContext = nullptr;
945     napi_value nativeCallback = nullptr;
946     void* contextPtr = nullptr;
947     size_t argc = 4;
948     napi_value argv[4] = {nullptr};
949     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
950     if (argc > 2) { // 2: maximum params num
951         WLOGFE("Argc is invalid: %{public}zu", argc);
952         errCode = WMError::WM_ERROR_INVALID_PARAM;
953     } else {
954         if (argc > 0 && GetType(env, argv[0]) == napi_object) { // (context, callback?)
955             nativeContext = argv[0];
956             nativeCallback = (argc == 1) ? nullptr :
957                 (GetType(env, argv[1]) == napi_function ? argv[1] : nullptr);
958         } else { // (callback?)
959             nativeCallback = (argc == 0) ? nullptr :
960                 (GetType(env, argv[0]) == napi_function ? argv[0] : nullptr);
961         }
962         GetNativeContext(env, nativeContext, contextPtr, errCode);
963     }
964     return GetTopWindowTask(contextPtr, env, nativeCallback, false);
965 }
966 
OnGetLastWindow(napi_env env,napi_callback_info info)967 napi_value JsWindowManager::OnGetLastWindow(napi_env env, napi_callback_info info)
968 {
969     WLOGFD("OnGetLastWindow");
970     WMError errCode = WMError::WM_OK;
971     napi_value nativeContext = nullptr;
972     napi_value nativeCallback = nullptr;
973     void* contextPtr = nullptr;
974     size_t argc = 4;
975     napi_value argv[4] = {nullptr};
976     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
977     if (argc < 1) {
978         WLOGFE("Argc is invalid: %{public}zu", argc);
979         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
980         return NapiGetUndefined(env);
981     } else {
982         nativeContext = argv[0];
983         nativeCallback = (argc == 1) ? nullptr : argv[1];
984         GetNativeContext(env, nativeContext, contextPtr, errCode);
985     }
986     if (errCode != WMError::WM_OK) {
987         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
988         return NapiGetUndefined(env);
989     }
990 
991     return GetTopWindowTask(contextPtr, env, nativeCallback, true);
992 }
993 
OnSetWindowLayoutMode(napi_env env,napi_callback_info info)994 napi_value JsWindowManager::OnSetWindowLayoutMode(napi_env env, napi_callback_info info)
995 {
996     WLOGFD("OnSetWindowLayoutMode");
997     WmErrorCode errCode = WmErrorCode::WM_OK;
998     size_t argc = 4;
999     napi_value argv[4] = {nullptr};
1000     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1001     if (argc < 1) { // 1: minimum params num
1002         TLOGE(WmsLogTag::WMS_LAYOUT, "Argc is invalid: %{public}zu", argc);
1003         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
1004     }
1005     WindowLayoutMode winLayoutMode = WindowLayoutMode::CASCADE;
1006     if (!Permission::IsSystemCalling() && !Permission::IsStartByHdcd()) {
1007         TLOGE(WmsLogTag::WMS_LAYOUT, "set window layout mode permission denied!");
1008         return NapiThrowError(env, WmErrorCode::WM_ERROR_NOT_SYSTEM_APP);
1009     }
1010     if (errCode == WmErrorCode::WM_OK) {
1011         napi_value nativeMode = argv[0];
1012         if (nativeMode == nullptr) {
1013             TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to convert parameter to windowLayoutMode");
1014             errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
1015         } else {
1016             uint32_t resultValue = 0;
1017             napi_get_value_uint32(env, nativeMode, &resultValue);
1018             winLayoutMode = static_cast<WindowLayoutMode>(resultValue);
1019         }
1020     }
1021     if (winLayoutMode != WindowLayoutMode::CASCADE && winLayoutMode != WindowLayoutMode::TILE) {
1022         errCode = WmErrorCode::WM_ERROR_INVALID_PARAM;
1023     }
1024     if (errCode == WmErrorCode::WM_ERROR_INVALID_PARAM) {
1025         TLOGE(WmsLogTag::WMS_LAYOUT, "JsWindowManager::OnSetWindowLayoutMode failed, Invalidate params.");
1026         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
1027         return NapiGetUndefined(env);
1028     }
1029 
1030     WLOGI("LayoutMode = %{public}u, err = %{public}d", winLayoutMode, errCode);
1031     NapiAsyncTask::CompleteCallback complete =
1032         [=](napi_env env, NapiAsyncTask& task, int32_t status) {
1033             WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(
1034                 SingletonContainer::Get<WindowManager>().SetWindowLayoutMode(winLayoutMode));
1035             if (ret == WmErrorCode::WM_OK) {
1036                 task.Resolve(env, NapiGetUndefined(env));
1037                 WLOGD("SetWindowLayoutMode success");
1038             } else {
1039                 task.Reject(env, JsErrUtils::CreateJsError(env, ret, "SetWindowLayoutMode failed"));
1040             }
1041         };
1042     // 1: maximum params num; 1: index of callback
1043     napi_value lastParam = (argc <= 1) ? nullptr :
1044         ((argv[1] != nullptr && GetType(env, argv[1]) == napi_function) ? argv[1] : nullptr);
1045     napi_value result = nullptr;
1046     NapiAsyncTask::Schedule("JsWindowManager::OnSetWindowLayoutMode",
1047         env, CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result));
1048     return result;
1049 }
1050 
OnSetGestureNavigationEnabled(napi_env env,napi_callback_info info)1051 napi_value JsWindowManager::OnSetGestureNavigationEnabled(napi_env env, napi_callback_info info)
1052 {
1053     WLOGFD("OnSetGestureNavigationEnabled");
1054     size_t argc = 4;
1055     napi_value argv[4] = {nullptr};
1056     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1057     if (argc < 1) { // 1: minimum params num
1058         WLOGFE("Argc is invalid: %{public}zu", argc);
1059         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
1060         return NapiGetUndefined(env);
1061     }
1062 
1063     napi_value nativeBool = argv[0];
1064     if (nativeBool == nullptr) {
1065         WLOGFE("Failed to convert parameter to bool");
1066         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
1067         return NapiGetUndefined(env);
1068     }
1069     bool gestureNavigationEnable = false;
1070     napi_get_value_bool(env, nativeBool, &gestureNavigationEnable);
1071 
1072     WLOGI("Set gesture navigation enable as %{public}d", gestureNavigationEnable);
1073     NapiAsyncTask::CompleteCallback complete =
1074         [gestureNavigationEnable](napi_env env, NapiAsyncTask& task, int32_t status) {
1075             WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(
1076                 SingletonContainer::Get<WindowManager>().SetGestureNavigaionEnabled(gestureNavigationEnable));
1077             if (ret == WmErrorCode::WM_OK) {
1078                 task.Resolve(env, NapiGetUndefined(env));
1079                 WLOGD("SetGestureNavigationEnabled success");
1080             } else {
1081                 task.Reject(env, JsErrUtils::CreateJsError(env, ret, "SetGestureNavigationEnabled failed"));
1082             }
1083         };
1084     // 1: maximum params num; 1: index of callback
1085     napi_value lastParam = (argc <= 1) ? nullptr :
1086         ((argv[1] != nullptr && GetType(env, argv[1]) == napi_function) ? argv[1] : nullptr);
1087     napi_value result = nullptr;
1088     NapiAsyncTask::Schedule("JsWindowManager::OnSetGestureNavigationEnabled",
1089         env, CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result));
1090     return result;
1091 }
1092 
OnSetWaterMarkImage(napi_env env,napi_callback_info info)1093 napi_value JsWindowManager::OnSetWaterMarkImage(napi_env env, napi_callback_info info)
1094 {
1095     WLOGFD("OnSetWaterMarkImage");
1096     napi_value nativeObject = nullptr;
1097     napi_value nativeBoolean = nullptr;
1098     size_t argc = 4;
1099     napi_value argv[4] = {nullptr};
1100     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1101     if (argc < 2) { // 2: params num
1102         WLOGFE("Argc is invalid: %{public}zu", argc);
1103         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
1104         return NapiGetUndefined(env);
1105     } else {
1106         if (argc > 0 && GetType(env, argv[0]) == napi_object) {
1107             nativeObject = argv[0];
1108             nativeBoolean = (GetType(env, argv[1]) == napi_boolean ? argv[1] : nullptr);
1109         }
1110     }
1111 
1112     std::shared_ptr<Media::PixelMap> pixelMap;
1113     pixelMap = OHOS::Media::PixelMapNapi::GetPixelMap(env, nativeObject);
1114     if (pixelMap == nullptr) {
1115         WLOGFE("Failed to convert parameter to PixelMap");
1116         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
1117         return NapiGetUndefined(env);
1118     }
1119 
1120     if (nativeBoolean == nullptr) {
1121         WLOGFE("Failed to convert parameter to bool");
1122         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
1123         return NapiGetUndefined(env);
1124     }
1125     bool isShow = false;
1126     napi_get_value_bool(env, nativeBoolean, &isShow);
1127     if (!Permission::IsSystemCalling()) {
1128         WLOGFE("set watermark image permission denied!");
1129         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_NOT_SYSTEM_APP));
1130         return NapiGetUndefined(env);
1131     }
1132 
1133     NapiAsyncTask::CompleteCallback complete =
1134         [=](napi_env env, NapiAsyncTask& task, int32_t status) {
1135             RSInterfaces::GetInstance().ShowWatermark(pixelMap, isShow);
1136             task.Resolve(env, NapiGetUndefined(env));
1137             WLOGD("OnSetWaterMarkImage success");
1138         };
1139     // 2: maximum params num; 2: index of callback
1140     napi_value lastParam = (argc <= 2) ? nullptr :
1141         (GetType(env, argv[2]) == napi_function ? argv[2] : nullptr);
1142     napi_value result = nullptr;
1143     NapiAsyncTask::Schedule("JsWindowManager::OnSetWaterMarkImage",
1144         env, CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result));
1145     return result;
1146 }
1147 
OnShiftAppWindowFocus(napi_env env,napi_callback_info info)1148 napi_value JsWindowManager::OnShiftAppWindowFocus(napi_env env, napi_callback_info info)
1149 {
1150     WLOGFD("OnShiftAppWindowFocus");
1151     WMError errCode = WMError::WM_OK;
1152     size_t argc = 4;
1153     napi_value argv[4] = {nullptr};
1154     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1155     if (argc != 2) { // 2: params num
1156         WLOGFE("Argc is invalid: %{public}zu", argc);
1157         errCode = WMError::WM_ERROR_INVALID_PARAM;
1158     }
1159     int32_t sourcePersistentId = static_cast<int32_t>(INVALID_WINDOW_ID);
1160     int32_t targetPersistentId = static_cast<int32_t>(INVALID_WINDOW_ID);
1161     if (errCode == WMError::WM_OK && !ConvertFromJsValue(env, argv[0], sourcePersistentId)) {
1162         WLOGFE("Failed to convert parameter to source window Id");
1163         errCode = WMError::WM_ERROR_INVALID_PARAM;
1164     }
1165     if (errCode == WMError::WM_OK && !ConvertFromJsValue(env, argv[1], targetPersistentId)) {
1166         WLOGFE("Failed to convert parameter to target window Id");
1167         errCode = WMError::WM_ERROR_INVALID_PARAM;
1168     }
1169     if (errCode == WMError::WM_ERROR_INVALID_PARAM) {
1170         napi_throw(env, JsErrUtils::CreateJsError(env, WmErrorCode::WM_ERROR_INVALID_PARAM));
1171         return NapiGetUndefined(env);
1172     }
1173     NapiAsyncTask::CompleteCallback complete =
1174         [=](napi_env env, NapiAsyncTask& task, int32_t status) {
1175             WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(
1176                 SingletonContainer::Get<WindowManager>().ShiftAppWindowFocus(sourcePersistentId, targetPersistentId));
1177             if (ret == WmErrorCode::WM_OK) {
1178                 task.Resolve(env, NapiGetUndefined(env));
1179                 WLOGD("OnShiftAppWindowFocus success");
1180             } else {
1181                 task.Reject(env, JsErrUtils::CreateJsError(env, ret, "ShiftAppWindowFocus failed"));
1182             }
1183         };
1184     // only return promiss<void>
1185     napi_value lastParam = nullptr;
1186     napi_value result = nullptr;
1187     NapiAsyncTask::Schedule("JsWindowManager::OnShiftAppWindowFocus",
1188         env, CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result));
1189     return result;
1190 }
1191 
OnGetAllWindowLayoutInfo(napi_env env,napi_callback_info info)1192 napi_value JsWindowManager::OnGetAllWindowLayoutInfo(napi_env env, napi_callback_info info)
1193 {
1194     size_t argc = ARGC_FOUR;
1195     napi_value argv[ARGC_FOUR] = { nullptr };
1196     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1197     if (argc != ARGC_ONE) {
1198         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Argc is invalid: %{public}zu", argc);
1199         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1200     }
1201     int64_t displayId = static_cast<int64_t>(DISPLAY_ID_INVALID);
1202     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], displayId)) {
1203         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Failed to convert parameter to displayId");
1204         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1205     }
1206     if (displayId < 0 ||
1207         SingletonContainer::Get<DisplayManager>().GetDisplayById(static_cast<uint64_t>(displayId)) == nullptr) {
1208         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "invalid displayId");
1209         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1210     }
1211     napi_value result = nullptr;
1212     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
1213     auto asyncTask = [env, task = napiAsyncTask, displayId, where = __func__] {
1214         std::vector<sptr<WindowLayoutInfo>> infos;
1215         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(
1216             SingletonContainer::Get<WindowManager>().GetAllWindowLayoutInfo(static_cast<uint64_t>(displayId), infos));
1217         if (ret == WmErrorCode::WM_OK) {
1218             task->Resolve(env, CreateJsWindowLayoutInfoArrayObject(env, infos));
1219             TLOGNI(WmsLogTag::WMS_ATTRIBUTE, "%{public}s success", where);
1220         } else {
1221             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "failed"));
1222             TLOGNE(WmsLogTag::WMS_ATTRIBUTE, "%{public}s failed", where);
1223         }
1224     };
1225     if (napi_status::napi_ok != napi_send_event(env, asyncTask, napi_eprio_high)) {
1226         napiAsyncTask->Reject(env,
1227             CreateJsError(env, static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
1228     }
1229     return result;
1230 }
1231 
OnGetVisibleWindowInfo(napi_env env,napi_callback_info info)1232 napi_value JsWindowManager::OnGetVisibleWindowInfo(napi_env env, napi_callback_info info)
1233 {
1234     size_t argc = 4;
1235     napi_value argv[4] = {nullptr};
1236     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1237     napi_value lastParam = argc <= 0 || GetType(env, argv[0]) != napi_function ? nullptr : argv[0];
1238     napi_value result = nullptr;
1239     NapiAsyncTask::CompleteCallback complete =
1240         [](napi_env env, NapiAsyncTask& task, int32_t status) {
1241             std::vector<sptr<WindowVisibilityInfo>> infos;
1242             WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(
1243                 SingletonContainer::Get<WindowManager>().GetVisibilityWindowInfo(infos));
1244             if (ret == WmErrorCode::WM_OK) {
1245                 task.Resolve(env, CreateJsWindowInfoArrayObject(env, infos));
1246                 TLOGD(WmsLogTag::DEFAULT, "OnGetVisibleWindowInfo success");
1247             } else {
1248                 TLOGE(WmsLogTag::DEFAULT, "OnGetVisibleWindowInfo failed");
1249                 task.Reject(env, JsErrUtils::CreateJsError(env, ret, "OnGetVisibleWindowInfo failed"));
1250             }
1251         };
1252     NapiAsyncTask::Schedule("JsWindowManager::OnGetVisibleWindowInfo",
1253                             env, CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result));
1254     return result;
1255 }
1256 
OnGetWindowsByCoordinate(napi_env env,napi_callback_info info)1257 napi_value JsWindowManager::OnGetWindowsByCoordinate(napi_env env, napi_callback_info info)
1258 {
1259     size_t argc = ARGC_FOUR;
1260     napi_value argv[ARGC_FOUR] = {nullptr};
1261     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1262     if (argc < ARGC_ONE || argc > ARGC_FOUR) { // min param num 1, max param num 4
1263         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1264     }
1265     int64_t displayId = static_cast<int64_t>(DISPLAY_ID_INVALID);
1266     if (!ConvertFromJsValue(env, argv[0], displayId)) {
1267         TLOGE(WmsLogTag::DEFAULT, "Failed to convert parameter to displayId");
1268         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1269     }
1270     if (displayId < 0 ||
1271         SingletonContainer::Get<DisplayManager>().GetDisplayById(static_cast<uint64_t>(displayId)) == nullptr) {
1272         TLOGE(WmsLogTag::DEFAULT, "invalid displayId");
1273         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1274     }
1275     int32_t windowNumber = 0;
1276     if (argc > ARGC_ONE && !ConvertFromJsValue(env, argv[ARGC_ONE], windowNumber)) {
1277         windowNumber = 0;
1278     }
1279     int32_t x = INVALID_COORDINATE;
1280     if (argc > ARGC_TWO && !ConvertFromJsValue(env, argv[ARGC_TWO], x)) {
1281         x = INVALID_COORDINATE;
1282     }
1283     int32_t y = INVALID_COORDINATE;
1284     if (argc > ARGC_THREE && !ConvertFromJsValue(env, argv[ARGC_THREE], y)) {
1285         y = INVALID_COORDINATE;
1286     }
1287     napi_value result = nullptr;
1288     NapiAsyncTask::CompleteCallback complete =
1289         [displayId, windowNumber, x, y](napi_env env, NapiAsyncTask& task, int32_t status) {
1290             std::vector<int32_t> windowIds;
1291             WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(SingletonContainer::Get<WindowManager>().
1292                 GetWindowIdsByCoordinate(static_cast<uint64_t>(displayId), windowNumber, x, y, windowIds));
1293             if (ret == WmErrorCode::WM_OK) {
1294                 std::vector<sptr<Window>> windows(windowIds.size());
1295                 for (size_t i = 0; i < windowIds.size(); i++) {
1296                     sptr<Window> window = Window::GetWindowWithId(windowIds[i]);
1297                     windows[i] = window;
1298                 }
1299                 task.Resolve(env, CreateJsWindowArrayObject(env, windows));
1300             } else {
1301                 task.Reject(env, JsErrUtils::CreateJsError(env, ret, "OnGetWindowsByCoordinate failed"));
1302             }
1303         };
1304     NapiAsyncTask::Schedule("JsWindowManager::OnGetWindowsByCoordinate",
1305         env, CreateAsyncTaskWithLastParam(env, nullptr, nullptr, std::move(complete), &result));
1306     return result;
1307 }
1308 
OnShiftAppWindowPointerEvent(napi_env env,napi_callback_info info)1309 napi_value JsWindowManager::OnShiftAppWindowPointerEvent(napi_env env, napi_callback_info info)
1310 {
1311     size_t argc = ARGC_FOUR;
1312     napi_value argv[ARGC_FOUR] = { nullptr };
1313     napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1314     if (argc != ARGC_TWO) {
1315         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1316     }
1317     int32_t sourceWindowId;
1318     if (!ConvertFromJsValue(env, argv[INDEX_ZERO], sourceWindowId)) {
1319         TLOGE(WmsLogTag::WMS_PC, "Failed to convert parameter to sourceWindowId");
1320         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1321     }
1322     int32_t targetWindowId;
1323     if (!ConvertFromJsValue(env, argv[INDEX_ONE], targetWindowId)) {
1324         TLOGE(WmsLogTag::WMS_PC, "Failed to convert parameter to targetWindowId");
1325         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1326     }
1327     if (sourceWindowId == static_cast<int32_t>(INVALID_WINDOW_ID) ||
1328         targetWindowId == static_cast<int32_t>(INVALID_WINDOW_ID)) {
1329         TLOGE(WmsLogTag::WMS_PC, "invalid sourceWindowId or targetWindowId");
1330         return NapiThrowError(env, WmErrorCode::WM_ERROR_INVALID_PARAM);
1331     }
1332     napi_value result = nullptr;
1333     std::shared_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, nullptr, &result);
1334     auto asyncTask = [sourceWindowId, targetWindowId, env, task = napiAsyncTask] {
1335         WmErrorCode ret = WM_JS_TO_ERROR_CODE_MAP.at(SingletonContainer::Get<WindowManager>().
1336                 ShiftAppWindowPointerEvent(sourceWindowId, targetWindowId));
1337         if (ret == WmErrorCode::WM_OK) {
1338             task->Resolve(env, NapiGetUndefined(env));
1339         } else {
1340             task->Reject(env, JsErrUtils::CreateJsError(env, ret, "shiftAppWindowPointerEvent failed"));
1341         }
1342     };
1343     if (napi_status::napi_ok != napi_send_event(env, std::move(asyncTask), napi_eprio_high)) {
1344         napiAsyncTask->Reject(env,
1345             CreateJsError(env, static_cast<int32_t>(WmErrorCode::WM_ERROR_STATE_ABNORMALLY), "send event failed"));
1346     }
1347     return result;
1348 }
1349 
JsWindowManagerInit(napi_env env,napi_value exportObj)1350 napi_value JsWindowManagerInit(napi_env env, napi_value exportObj)
1351 {
1352     WLOGFD("JsWindowManagerInit");
1353 
1354     if (env == nullptr || exportObj == nullptr) {
1355         WLOGFE("JsWindowManagerInit env or exportObj is nullptr");
1356         return nullptr;
1357     }
1358 
1359     std::unique_ptr<JsWindowManager> jsWinManager = std::make_unique<JsWindowManager>();
1360     napi_wrap(env, exportObj, jsWinManager.release(), JsWindowManager::Finalizer, nullptr, nullptr);
1361     napi_set_named_property(env, exportObj, "WindowType", WindowTypeInit(env));
1362     napi_set_named_property(env, exportObj, "AvoidAreaType", AvoidAreaTypeInit(env));
1363     napi_set_named_property(env, exportObj, "WindowMode", WindowModeInit(env));
1364     napi_set_named_property(env, exportObj, "ColorSpace", ColorSpaceInit(env));
1365     napi_set_named_property(env, exportObj, "WindowStageEventType", WindowStageEventTypeInit(env));
1366     napi_set_named_property(env, exportObj, "WindowEventType", WindowEventTypeInit(env));
1367     napi_set_named_property(env, exportObj, "WindowLayoutMode", WindowLayoutModeInit(env));
1368     napi_set_named_property(env, exportObj, "Orientation", OrientationInit(env));
1369     napi_set_named_property(env, exportObj, "BlurStyle", BlurStyleInit(env));
1370     napi_set_named_property(env, exportObj, "WmErrorCode", WindowErrorCodeInit(env));
1371     napi_set_named_property(env, exportObj, "WMError", WindowErrorInit(env));
1372     napi_set_named_property(env, exportObj, "WindowStatusType", WindowStatusTypeInit(env));
1373     napi_set_named_property(env, exportObj, "RectChangeReason", RectChangeReasonInit(env));
1374     napi_set_named_property(env, exportObj, "MaximizePresentation", MaximizePresentationInit(env));
1375     napi_set_named_property(env, exportObj, "ModalityType", ModalityTypeInit(env));
1376     napi_set_named_property(env, exportObj, "ExtensionWindowAttribute", ExtensionWindowAttributeInit(env));
1377     const char *moduleName = "JsWindowManager";
1378     BindNativeFunction(env, exportObj, "create", moduleName, JsWindowManager::Create);
1379     BindNativeFunction(env, exportObj, "createWindow", moduleName, JsWindowManager::CreateWindow);
1380     BindNativeFunction(env, exportObj, "find", moduleName, JsWindowManager::FindWindow);
1381     BindNativeFunction(env, exportObj, "findWindow", moduleName, JsWindowManager::FindWindowSync);
1382     BindNativeFunction(env, exportObj, "on", moduleName, JsWindowManager::RegisterWindowManagerCallback);
1383     BindNativeFunction(env, exportObj, "off", moduleName, JsWindowManager::UnregisterWindowMangerCallback);
1384     BindNativeFunction(env, exportObj, "getTopWindow", moduleName, JsWindowManager::GetTopWindow);
1385     BindNativeFunction(env, exportObj, "getLastWindow", moduleName, JsWindowManager::GetLastWindow);
1386     BindNativeFunction(env, exportObj, "getSnapshot", moduleName, JsWindowManager::GetSnapshot);
1387     BindNativeFunction(env, exportObj, "minimizeAll", moduleName, JsWindowManager::MinimizeAll);
1388     BindNativeFunction(env, exportObj, "toggleShownStateForAllAppWindows", moduleName,
1389         JsWindowManager::ToggleShownStateForAllAppWindows);
1390     BindNativeFunction(env, exportObj, "setWindowLayoutMode", moduleName, JsWindowManager::SetWindowLayoutMode);
1391     BindNativeFunction(env, exportObj, "setGestureNavigationEnabled", moduleName,
1392         JsWindowManager::SetGestureNavigationEnabled);
1393     BindNativeFunction(env, exportObj, "setWaterMarkImage", moduleName, JsWindowManager::SetWaterMarkImage);
1394     BindNativeFunction(env, exportObj, "shiftAppWindowFocus", moduleName, JsWindowManager::ShiftAppWindowFocus);
1395     BindNativeFunction(env, exportObj, "getAllWindowLayoutInfo", moduleName, JsWindowManager::GetAllWindowLayoutInfo);
1396     BindNativeFunction(env, exportObj, "getVisibleWindowInfo", moduleName, JsWindowManager::GetVisibleWindowInfo);
1397     BindNativeFunction(env, exportObj, "getWindowsByCoordinate", moduleName, JsWindowManager::GetWindowsByCoordinate);
1398     BindNativeFunction(env, exportObj, "shiftAppWindowPointerEvent", moduleName,
1399         JsWindowManager::ShiftAppWindowPointerEvent);
1400     return NapiGetUndefined(env);
1401 }
1402 }  // namespace Rosen
1403 }  // namespace OHOS
1404