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