1 /* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef OHOS_JS_WINDOW_UTILS_H 17 #define OHOS_JS_WINDOW_UTILS_H 18 #include <array> 19 #include <map> 20 #include "js_runtime_utils.h" 21 #include "native_engine/native_engine.h" 22 #include "native_engine/native_value.h" 23 #include "window.h" 24 25 #ifndef WINDOW_PREVIEW 26 #include "window_manager.h" 27 #else 28 #include "mock/window_manager.h" 29 #endif 30 31 #include "window_option.h" 32 #include "window_visibility_info.h" 33 #include "wm_common.h" 34 #include "window_helper.h" 35 namespace OHOS { 36 namespace Rosen { 37 constexpr int32_t RGB_LENGTH = 6; 38 constexpr int32_t RGBA_LENGTH = 8; 39 40 #define CHECK_NAPI_RETCODE(errCode, code, call) \ 41 do { \ 42 napi_status retCode = (call); \ 43 if (retCode != napi_ok) { \ 44 WLOGFE("napi call failed, return %{public}d", static_cast<int32_t>(retCode)); \ 45 errCode = code; \ 46 } \ 47 } while (0) 48 49 #define CHECK_NAPI_ENV_RETURN_IF_NULL(env) \ 50 do { \ 51 if ((env) == nullptr) { \ 52 TLOGE(WmsLogTag::DEFAULT, "env is invalid"); \ 53 return nullptr; \ 54 } \ 55 } while (0) 56 57 #define CHECK_NAPI_CREATE_OBJECT_RETURN_IF_NULL(env, objValue) \ 58 do { \ 59 napi_create_object((env), &(objValue)); \ 60 if ((objValue) == nullptr) { \ 61 TLOGE(WmsLogTag::DEFAULT, "Failed to get object"); \ 62 return nullptr; \ 63 } \ 64 } while (0) 65 66 enum class ApiWindowType : uint32_t { 67 TYPE_BASE, 68 TYPE_APP = TYPE_BASE, 69 TYPE_SYSTEM_ALERT, 70 TYPE_INPUT_METHOD, 71 TYPE_STATUS_BAR, 72 TYPE_PANEL, 73 TYPE_KEYGUARD, 74 TYPE_VOLUME_OVERLAY, 75 TYPE_NAVIGATION_BAR, 76 TYPE_FLOAT, 77 TYPE_WALLPAPER, 78 TYPE_DESKTOP, 79 TYPE_LAUNCHER_RECENT, 80 TYPE_LAUNCHER_DOCK, 81 TYPE_VOICE_INTERACTION, 82 TYPE_POINTER, 83 TYPE_FLOAT_CAMERA, 84 TYPE_DIALOG, 85 TYPE_SCREENSHOT, 86 TYPE_SYSTEM_TOAST, 87 TYPE_DIVIDER, 88 TYPE_GLOBAL_SEARCH, 89 TYPE_HANDWRITE, 90 TYPE_WALLET_SWIPE_CARD, 91 TYPE_SCREEN_CONTROL, 92 TYPE_FLOAT_NAVIGATION, 93 TYPE_DYNAMIC, 94 TYPE_MUTISCREEN_COLLABORATION, 95 TYPE_FB, 96 TYPE_END 97 }; 98 99 enum class LifeCycleEventType : uint32_t { 100 FOREGROUND = 1, 101 ACTIVE, 102 INACTIVE, 103 BACKGROUND, 104 RESUMED, 105 PAUSED, 106 DESTROYED, 107 }; 108 109 enum class WindowStageLifeCycleEventType : uint32_t { 110 FOREGROUND = 1, 111 RESUMED, 112 PAUSED, 113 BACKGROUND, 114 }; 115 116 const std::map<WindowType, ApiWindowType> NATIVE_JS_TO_WINDOW_TYPE_MAP { 117 { WindowType::WINDOW_TYPE_APP_SUB_WINDOW, ApiWindowType::TYPE_APP }, 118 { WindowType::WINDOW_TYPE_DIALOG, ApiWindowType::TYPE_DIALOG }, 119 { WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW, ApiWindowType::TYPE_SYSTEM_ALERT }, 120 { WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT, ApiWindowType::TYPE_INPUT_METHOD }, 121 { WindowType::WINDOW_TYPE_STATUS_BAR, ApiWindowType::TYPE_STATUS_BAR }, 122 { WindowType::WINDOW_TYPE_PANEL, ApiWindowType::TYPE_PANEL }, 123 { WindowType::WINDOW_TYPE_KEYGUARD, ApiWindowType::TYPE_KEYGUARD }, 124 { WindowType::WINDOW_TYPE_VOLUME_OVERLAY, ApiWindowType::TYPE_VOLUME_OVERLAY }, 125 { WindowType::WINDOW_TYPE_NAVIGATION_BAR, ApiWindowType::TYPE_NAVIGATION_BAR }, 126 { WindowType::WINDOW_TYPE_FLOAT, ApiWindowType::TYPE_FLOAT }, 127 { WindowType::WINDOW_TYPE_FLOAT_CAMERA, ApiWindowType::TYPE_FLOAT_CAMERA }, 128 { WindowType::WINDOW_TYPE_WALLPAPER, ApiWindowType::TYPE_WALLPAPER }, 129 { WindowType::WINDOW_TYPE_DESKTOP, ApiWindowType::TYPE_DESKTOP }, 130 { WindowType::WINDOW_TYPE_LAUNCHER_RECENT, ApiWindowType::TYPE_LAUNCHER_RECENT }, 131 { WindowType::WINDOW_TYPE_LAUNCHER_DOCK, ApiWindowType::TYPE_LAUNCHER_DOCK }, 132 { WindowType::WINDOW_TYPE_VOICE_INTERACTION, ApiWindowType::TYPE_VOICE_INTERACTION }, 133 { WindowType::WINDOW_TYPE_POINTER, ApiWindowType::TYPE_POINTER }, 134 { WindowType::WINDOW_TYPE_SCREENSHOT, ApiWindowType::TYPE_SCREENSHOT }, 135 { WindowType::WINDOW_TYPE_SYSTEM_TOAST, ApiWindowType::TYPE_SYSTEM_TOAST }, 136 { WindowType::WINDOW_TYPE_DOCK_SLICE, ApiWindowType::TYPE_DIVIDER }, 137 { WindowType::WINDOW_TYPE_GLOBAL_SEARCH, ApiWindowType::TYPE_GLOBAL_SEARCH }, 138 { WindowType::WINDOW_TYPE_HANDWRITE, ApiWindowType::TYPE_HANDWRITE }, 139 { WindowType::WINDOW_TYPE_WALLET_SWIPE_CARD, ApiWindowType::TYPE_WALLET_SWIPE_CARD }, 140 { WindowType::WINDOW_TYPE_SCREEN_CONTROL, ApiWindowType::TYPE_SCREEN_CONTROL }, 141 { WindowType::WINDOW_TYPE_FLOAT_NAVIGATION, ApiWindowType::TYPE_FLOAT_NAVIGATION }, 142 { WindowType::WINDOW_TYPE_DYNAMIC, ApiWindowType::TYPE_DYNAMIC }, 143 { WindowType::WINDOW_TYPE_MUTISCREEN_COLLABORATION, ApiWindowType::TYPE_MUTISCREEN_COLLABORATION }, 144 { WindowType::WINDOW_TYPE_FB, ApiWindowType::TYPE_FB }, 145 }; 146 147 const std::map<ApiWindowType, WindowType> JS_TO_NATIVE_WINDOW_TYPE_MAP { 148 { ApiWindowType::TYPE_APP, WindowType::WINDOW_TYPE_APP_SUB_WINDOW }, 149 { ApiWindowType::TYPE_DIALOG, WindowType::WINDOW_TYPE_DIALOG }, 150 { ApiWindowType::TYPE_SYSTEM_ALERT, WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW }, 151 { ApiWindowType::TYPE_INPUT_METHOD, WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT }, 152 { ApiWindowType::TYPE_STATUS_BAR, WindowType::WINDOW_TYPE_STATUS_BAR }, 153 { ApiWindowType::TYPE_PANEL, WindowType::WINDOW_TYPE_PANEL }, 154 { ApiWindowType::TYPE_KEYGUARD, WindowType::WINDOW_TYPE_KEYGUARD }, 155 { ApiWindowType::TYPE_VOLUME_OVERLAY, WindowType::WINDOW_TYPE_VOLUME_OVERLAY }, 156 { ApiWindowType::TYPE_NAVIGATION_BAR, WindowType::WINDOW_TYPE_NAVIGATION_BAR }, 157 { ApiWindowType::TYPE_FLOAT, WindowType::WINDOW_TYPE_FLOAT }, 158 { ApiWindowType::TYPE_FLOAT_CAMERA, WindowType::WINDOW_TYPE_FLOAT_CAMERA }, 159 { ApiWindowType::TYPE_WALLPAPER, WindowType::WINDOW_TYPE_WALLPAPER }, 160 { ApiWindowType::TYPE_DESKTOP, WindowType::WINDOW_TYPE_DESKTOP }, 161 { ApiWindowType::TYPE_LAUNCHER_RECENT, WindowType::WINDOW_TYPE_LAUNCHER_RECENT }, 162 { ApiWindowType::TYPE_LAUNCHER_DOCK, WindowType::WINDOW_TYPE_LAUNCHER_DOCK }, 163 { ApiWindowType::TYPE_VOICE_INTERACTION, WindowType::WINDOW_TYPE_VOICE_INTERACTION }, 164 { ApiWindowType::TYPE_POINTER, WindowType::WINDOW_TYPE_POINTER }, 165 { ApiWindowType::TYPE_SCREENSHOT, WindowType::WINDOW_TYPE_SCREENSHOT }, 166 { ApiWindowType::TYPE_SYSTEM_TOAST, WindowType::WINDOW_TYPE_SYSTEM_TOAST }, 167 { ApiWindowType::TYPE_DIVIDER, WindowType::WINDOW_TYPE_DOCK_SLICE }, 168 { ApiWindowType::TYPE_GLOBAL_SEARCH, WindowType::WINDOW_TYPE_GLOBAL_SEARCH }, 169 { ApiWindowType::TYPE_HANDWRITE, WindowType::WINDOW_TYPE_HANDWRITE }, 170 { ApiWindowType::TYPE_WALLET_SWIPE_CARD, WindowType::WINDOW_TYPE_WALLET_SWIPE_CARD }, 171 { ApiWindowType::TYPE_SCREEN_CONTROL, WindowType::WINDOW_TYPE_SCREEN_CONTROL }, 172 { ApiWindowType::TYPE_FLOAT_NAVIGATION, WindowType::WINDOW_TYPE_FLOAT_NAVIGATION }, 173 { ApiWindowType::TYPE_DYNAMIC, WindowType::WINDOW_TYPE_DYNAMIC }, 174 { ApiWindowType::TYPE_MUTISCREEN_COLLABORATION, WindowType::WINDOW_TYPE_MUTISCREEN_COLLABORATION }, 175 { ApiWindowType::TYPE_FB, WindowType::WINDOW_TYPE_FB }, 176 }; 177 178 enum class ApiWindowMode : uint32_t { 179 UNDEFINED = 1, 180 FULLSCREEN, 181 PRIMARY, 182 SECONDARY, 183 FLOATING, 184 MODE_END = FLOATING 185 }; 186 187 const std::map<WindowMode, ApiWindowMode> NATIVE_TO_JS_WINDOW_MODE_MAP { 188 { WindowMode::WINDOW_MODE_UNDEFINED, ApiWindowMode::UNDEFINED }, 189 { WindowMode::WINDOW_MODE_FULLSCREEN, ApiWindowMode::FULLSCREEN }, 190 { WindowMode::WINDOW_MODE_SPLIT_PRIMARY, ApiWindowMode::PRIMARY }, 191 { WindowMode::WINDOW_MODE_SPLIT_SECONDARY, ApiWindowMode::SECONDARY }, 192 { WindowMode::WINDOW_MODE_FLOATING, ApiWindowMode::FLOATING }, 193 }; 194 195 const std::map<ApiWindowMode, WindowMode> JS_TO_NATIVE_WINDOW_MODE_MAP { 196 {ApiWindowMode::UNDEFINED, WindowMode::WINDOW_MODE_UNDEFINED }, 197 {ApiWindowMode::FULLSCREEN, WindowMode::WINDOW_MODE_FULLSCREEN }, 198 {ApiWindowMode::PRIMARY, WindowMode::WINDOW_MODE_SPLIT_PRIMARY }, 199 {ApiWindowMode::SECONDARY, WindowMode::WINDOW_MODE_SPLIT_SECONDARY }, 200 {ApiWindowMode::FLOATING, WindowMode::WINDOW_MODE_FLOATING }, 201 }; 202 203 enum class ApiOrientation : uint32_t { 204 BEGIN = 0, 205 UNSPECIFIED = BEGIN, 206 PORTRAIT = 1, 207 LANDSCAPE = 2, 208 PORTRAIT_INVERTED = 3, 209 LANDSCAPE_INVERTED = 4, 210 AUTO_ROTATION = 5, 211 AUTO_ROTATION_PORTRAIT = 6, 212 AUTO_ROTATION_LANDSCAPE = 7, 213 AUTO_ROTATION_RESTRICTED = 8, 214 AUTO_ROTATION_PORTRAIT_RESTRICTED = 9, 215 AUTO_ROTATION_LANDSCAPE_RESTRICTED = 10, 216 LOCKED = 11, 217 AUTO_ROTATION_UNSPECIFIED = 12, 218 USER_ROTATION_PORTRAIT = 13, 219 USER_ROTATION_LANDSCAPE = 14, 220 USER_ROTATION_PORTRAIT_INVERTED = 15, 221 USER_ROTATION_LANDSCAPE_INVERTED = 16, 222 FOLLOW_DESKTOP = 17, 223 END = FOLLOW_DESKTOP, 224 }; 225 226 const std::map<ApiOrientation, Orientation> JS_TO_NATIVE_ORIENTATION_MAP { 227 {ApiOrientation::UNSPECIFIED, Orientation::UNSPECIFIED }, 228 {ApiOrientation::PORTRAIT, Orientation::VERTICAL }, 229 {ApiOrientation::LANDSCAPE, Orientation::HORIZONTAL }, 230 {ApiOrientation::PORTRAIT_INVERTED, Orientation::REVERSE_VERTICAL }, 231 {ApiOrientation::LANDSCAPE_INVERTED, Orientation::REVERSE_HORIZONTAL }, 232 {ApiOrientation::AUTO_ROTATION, Orientation::SENSOR }, 233 {ApiOrientation::AUTO_ROTATION_PORTRAIT, Orientation::SENSOR_VERTICAL }, 234 {ApiOrientation::AUTO_ROTATION_LANDSCAPE, Orientation::SENSOR_HORIZONTAL }, 235 {ApiOrientation::AUTO_ROTATION_RESTRICTED, Orientation::AUTO_ROTATION_RESTRICTED }, 236 {ApiOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED, Orientation::AUTO_ROTATION_PORTRAIT_RESTRICTED }, 237 {ApiOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED, Orientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED }, 238 {ApiOrientation::LOCKED, Orientation::LOCKED }, 239 {ApiOrientation::AUTO_ROTATION_UNSPECIFIED, Orientation::AUTO_ROTATION_UNSPECIFIED }, 240 {ApiOrientation::USER_ROTATION_PORTRAIT, Orientation::USER_ROTATION_PORTRAIT }, 241 {ApiOrientation::USER_ROTATION_LANDSCAPE, Orientation::USER_ROTATION_LANDSCAPE }, 242 {ApiOrientation::USER_ROTATION_PORTRAIT_INVERTED, Orientation::USER_ROTATION_PORTRAIT_INVERTED }, 243 {ApiOrientation::USER_ROTATION_LANDSCAPE_INVERTED, Orientation::USER_ROTATION_LANDSCAPE_INVERTED }, 244 {ApiOrientation::FOLLOW_DESKTOP, Orientation::FOLLOW_DESKTOP }, 245 }; 246 247 const std::map<Orientation, ApiOrientation> NATIVE_TO_JS_ORIENTATION_MAP { 248 {Orientation::UNSPECIFIED, ApiOrientation::UNSPECIFIED }, 249 {Orientation::VERTICAL, ApiOrientation::PORTRAIT }, 250 {Orientation::HORIZONTAL, ApiOrientation::LANDSCAPE }, 251 {Orientation::REVERSE_VERTICAL, ApiOrientation::PORTRAIT_INVERTED }, 252 {Orientation::REVERSE_HORIZONTAL, ApiOrientation::LANDSCAPE_INVERTED }, 253 {Orientation::SENSOR, ApiOrientation::AUTO_ROTATION }, 254 {Orientation::SENSOR_VERTICAL, ApiOrientation::AUTO_ROTATION_PORTRAIT }, 255 {Orientation::SENSOR_HORIZONTAL, ApiOrientation::AUTO_ROTATION_LANDSCAPE }, 256 {Orientation::AUTO_ROTATION_RESTRICTED, ApiOrientation::AUTO_ROTATION_RESTRICTED }, 257 {Orientation::AUTO_ROTATION_PORTRAIT_RESTRICTED, ApiOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED }, 258 {Orientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED, ApiOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED }, 259 {Orientation::LOCKED, ApiOrientation::LOCKED }, 260 {Orientation::FOLLOW_RECENT, ApiOrientation::UNSPECIFIED }, 261 {Orientation::AUTO_ROTATION_UNSPECIFIED, ApiOrientation::AUTO_ROTATION_UNSPECIFIED }, 262 {Orientation::USER_ROTATION_PORTRAIT, ApiOrientation::USER_ROTATION_PORTRAIT }, 263 {Orientation::USER_ROTATION_LANDSCAPE, ApiOrientation::USER_ROTATION_LANDSCAPE }, 264 {Orientation::USER_ROTATION_PORTRAIT_INVERTED, ApiOrientation::USER_ROTATION_PORTRAIT_INVERTED }, 265 {Orientation::USER_ROTATION_LANDSCAPE_INVERTED, ApiOrientation::USER_ROTATION_LANDSCAPE_INVERTED }, 266 {Orientation::FOLLOW_DESKTOP, ApiOrientation::FOLLOW_DESKTOP }, 267 }; 268 269 enum class RectChangeReason : uint32_t { 270 UNDEFINED = 0, 271 MAXIMIZE, 272 RECOVER, 273 MOVE, 274 DRAG, 275 DRAG_START, 276 DRAG_END, 277 }; 278 279 const std::map<WindowSizeChangeReason, RectChangeReason> JS_SIZE_CHANGE_REASON { 280 { WindowSizeChangeReason::UNDEFINED, RectChangeReason::UNDEFINED }, 281 { WindowSizeChangeReason::MAXIMIZE, RectChangeReason::MAXIMIZE }, 282 { WindowSizeChangeReason::RECOVER, RectChangeReason::RECOVER }, 283 { WindowSizeChangeReason::ROTATION, RectChangeReason::UNDEFINED }, 284 { WindowSizeChangeReason::DRAG, RectChangeReason::DRAG }, 285 { WindowSizeChangeReason::DRAG_START, RectChangeReason::DRAG_START }, 286 { WindowSizeChangeReason::DRAG_MOVE, RectChangeReason::MOVE }, 287 { WindowSizeChangeReason::DRAG_END, RectChangeReason::DRAG_END }, 288 { WindowSizeChangeReason::RESIZE, RectChangeReason::UNDEFINED }, 289 { WindowSizeChangeReason::MOVE, RectChangeReason::MOVE }, 290 { WindowSizeChangeReason::HIDE, RectChangeReason::UNDEFINED }, 291 { WindowSizeChangeReason::TRANSFORM, RectChangeReason::UNDEFINED }, 292 { WindowSizeChangeReason::CUSTOM_ANIMATION_SHOW, RectChangeReason::UNDEFINED }, 293 { WindowSizeChangeReason::FULL_TO_SPLIT, RectChangeReason::UNDEFINED }, 294 { WindowSizeChangeReason::SPLIT_TO_FULL, RectChangeReason::UNDEFINED }, 295 { WindowSizeChangeReason::FULL_TO_FLOATING, RectChangeReason::UNDEFINED }, 296 { WindowSizeChangeReason::FLOATING_TO_FULL, RectChangeReason::UNDEFINED }, 297 { WindowSizeChangeReason::MAXIMIZE_TO_SPLIT, RectChangeReason::UNDEFINED }, 298 { WindowSizeChangeReason::SPLIT_TO_MAXIMIZE, RectChangeReason::UNDEFINED }, 299 { WindowSizeChangeReason::PAGE_ROTATION, RectChangeReason::UNDEFINED }, 300 { WindowSizeChangeReason::SPLIT_DRAG_START, RectChangeReason::UNDEFINED }, 301 { WindowSizeChangeReason::SPLIT_DRAG, RectChangeReason::UNDEFINED }, 302 { WindowSizeChangeReason::SPLIT_DRAG_END, RectChangeReason::UNDEFINED }, 303 { WindowSizeChangeReason::RESIZE_BY_LIMIT, RectChangeReason::UNDEFINED }, 304 { WindowSizeChangeReason::MAXIMIZE_IN_IMPLICT, RectChangeReason::MAXIMIZE }, 305 { WindowSizeChangeReason::RECOVER_IN_IMPLICIT, RectChangeReason::RECOVER }, 306 { WindowSizeChangeReason::SCREEN_RELATIVE_POSITION_CHANGE, RectChangeReason::UNDEFINED }, 307 { WindowSizeChangeReason::SNAPSHOT_ROTATION, RectChangeReason::UNDEFINED }, 308 { WindowSizeChangeReason::END, RectChangeReason::UNDEFINED }, 309 }; 310 311 enum class ApiModalityType : uint32_t { 312 BEGIN = 0, 313 WINDOW_MODALITY = BEGIN, 314 APPLICATION_MODALITY, 315 END = APPLICATION_MODALITY, 316 }; 317 318 inline const std::map<ApiModalityType, ModalityType> JS_TO_NATIVE_MODALITY_TYPE_MAP { 319 { ApiModalityType::WINDOW_MODALITY, ModalityType::WINDOW_MODALITY }, 320 { ApiModalityType::APPLICATION_MODALITY, ModalityType::APPLICATION_MODALITY }, 321 }; 322 323 using AsyncCallbackFunc_ = std::function<void(napi_env env, size_t argc, napi_value* argv)>; 324 325 class AsyncCallback : virtual public RefBase { 326 public: 327 AsyncCallbackFunc_ resolvedCallback_ = nullptr; 328 AsyncCallbackFunc_ rejectedCallback_ = nullptr; AsyncCallback(AsyncCallbackFunc_ resolvedCallback,AsyncCallbackFunc_ rejectedCallback)329 AsyncCallback(AsyncCallbackFunc_ resolvedCallback, AsyncCallbackFunc_ rejectedCallback) 330 : resolvedCallback_(resolvedCallback), rejectedCallback_(rejectedCallback) {} 331 }; 332 333 /* 334 * Promise 335 */ 336 bool CheckPromise(napi_env env, napi_value promiseObj); 337 napi_value ResolvedCallback(napi_env env, napi_callback_info info); 338 napi_value RejectedCallback(napi_env env, napi_callback_info info); 339 bool CallPromise(napi_env env, napi_value promiseObj, AsyncCallback* asyncCallback); 340 341 napi_value CreateJsWindowLayoutInfoArrayObject(napi_env env, const std::vector<sptr<WindowLayoutInfo>>& infos); 342 napi_value CreateJsWindowLayoutInfoObject(napi_env env, const sptr<WindowLayoutInfo>& info); 343 napi_value CreateJsWindowInfoArrayObject(napi_env env, const std::vector<sptr<WindowVisibilityInfo>>& infos); 344 napi_value CreateJsWindowInfoObject(napi_env env, const sptr<WindowVisibilityInfo>& window); 345 napi_value GetRectAndConvertToJsValue(napi_env env, const Rect& rect); 346 napi_value CreateJsWindowAnimationConfigObject(napi_env env, const KeyboardAnimationCurve& curve); 347 napi_value CreateJsWindowPropertiesObject(napi_env env, const WindowPropertyInfo& windowPropertyInfo); 348 napi_value CreateJsSystemBarPropertiesObject(napi_env env, sptr<Window>& window); 349 napi_value CreateRotationChangeInfoObject(napi_env env, const RotationChangeInfo& rotationChangeInfo); 350 bool GetSystemBarPropertiesFromJs(napi_env env, napi_value jsObject, 351 std::unordered_map<WindowType, SystemBarProperty>& properties, 352 std::unordered_map<WindowType, SystemBarPropertyFlag>& propertyFlags); 353 bool SetWindowStatusBarContentColor(napi_env env, napi_value jsObject, 354 std::unordered_map<WindowType, SystemBarProperty>& properties, 355 std::unordered_map<WindowType, SystemBarPropertyFlag>& propertyFlags); 356 bool SetWindowNavigationBarContentColor(napi_env env, napi_value jsObject, 357 std::unordered_map<WindowType, SystemBarProperty>& properties, 358 std::unordered_map<WindowType, SystemBarPropertyFlag>& propertyFlags); 359 bool GetSystemBarStatus(napi_env env, napi_callback_info info, 360 std::unordered_map<WindowType, SystemBarProperty>& systemBarProperties, 361 std::unordered_map<WindowType, SystemBarPropertyFlag>& systemBarpropertyFlags); 362 napi_value GetStatusBarPropertyObject(napi_env env, sptr<Window>& window); 363 bool ParseColorMetrics(napi_env env, napi_value value, uint32_t& colorValue); 364 bool GetWindowBackgroundColorFromJs(napi_env env, napi_value value, std::string& colorStr); 365 bool ParseAndCheckRect(napi_env env, napi_value jsObject, const Rect& windowRect, Rect& touchableRect); 366 WmErrorCode ParseTouchableAreas(napi_env env, napi_callback_info info, const Rect& windowRect, 367 std::vector<Rect>& touchableAreas); 368 bool GetSpecificBarStatus(napi_env env, napi_callback_info info, 369 bool& systemBarEnable, bool& systemBarEnableAnimation); 370 napi_value CreateJsSystemBarRegionTintArrayObject(napi_env env, 371 const SystemBarRegionTints& tints); 372 napi_value ConvertAvoidAreaToJsValue(napi_env env, const AvoidArea& avoidArea, AvoidAreaType type); 373 bool CheckCallingPermission(std::string permission); 374 bool ParseSystemWindowTypeForApiWindowType(int32_t apiWindowType, WindowType& windowType); 375 napi_value WindowTypeInit(napi_env env); 376 napi_value AvoidAreaTypeInit(napi_env env); 377 napi_value WindowModeInit(napi_env env); 378 napi_value GlobalWindowModeInit(napi_env env); 379 napi_value ScreenshotEventTypeInit(napi_env env); 380 napi_value ColorSpaceInit(napi_env env); 381 napi_value OrientationInit(napi_env env); 382 napi_value WindowStageEventTypeInit(napi_env env); 383 napi_value WindowStageLifecycleEventTypeInit(napi_env env); 384 napi_value WindowAnchorInit(napi_env env); 385 napi_value WindowEventTypeInit(napi_env env); 386 napi_value WindowLayoutModeInit(napi_env env); 387 napi_value BlurStyleInit(napi_env env); 388 napi_value MaximizePresentationInit(napi_env env); 389 napi_value WindowErrorCodeInit(napi_env env); 390 napi_value WindowErrorInit(napi_env env); 391 napi_value WindowStatusTypeInit(napi_env env); 392 napi_value RectChangeReasonInit(napi_env env); 393 napi_value RotationChangeTypeInit(napi_env env); 394 napi_value RectTypeInit(napi_env env); 395 napi_value AnimationTypeInit(napi_env env); 396 napi_value WindowTransitionTypeInit(napi_env env); 397 napi_value WindowAnimationCurveInit(napi_env env); 398 napi_value GetWindowLimitsAndConvertToJsValue(napi_env env, const WindowLimits& windowLimits); 399 napi_value ConvertTitleButtonAreaToJsValue(napi_env env, const TitleButtonRect& titleButtonRect); 400 napi_value ExtensionWindowAttributeInit(napi_env env); 401 napi_value ModalityTypeInit(napi_env env); 402 napi_value CreateJsDecorButtonStyleObj(napi_env env, DecorButtonStyle decorButtonStyle); 403 napi_value ConvertWindowDensityInfoToJsValue(napi_env env, const WindowDensityInfo& windowDensityInfo); 404 bool ConvertDecorButtonStyleFromJs(napi_env env, napi_value jsObject, DecorButtonStyle& decorButtonStyle); 405 bool GetAPI7Ability(napi_env env, AppExecFwk::Ability* &ability); 406 bool GetWindowMaskFromJsValue(napi_env env, napi_value jsObject, std::vector<std::vector<uint32_t>>& windowMask); 407 bool GetMoveConfigurationFromJsValue(napi_env env, napi_value jsObject, MoveConfiguration& moveConfiguration); 408 bool ParseRectAnimationConfig(napi_env env, napi_value jsObject, RectAnimationConfig& rectAnimationConfig); 409 void ConvertJSSystemBarStyleToSystemBarProperties(napi_env env, napi_value jsObject, 410 std::map<WindowType, SystemBarProperty>& properties, 411 std::map<WindowType, SystemBarPropertyFlag>& propertyFlags); 412 std::unique_ptr<AbilityRuntime::NapiAsyncTask> CreateAsyncTask(napi_env env, napi_value lastParam, 413 std::unique_ptr<AbilityRuntime::NapiAsyncTask::ExecuteCallback>&& execute, 414 std::unique_ptr<AbilityRuntime::NapiAsyncTask::CompleteCallback>&& complete, napi_value* result); 415 std::unique_ptr<AbilityRuntime::NapiAsyncTask> CreateEmptyAsyncTask( 416 napi_env env, napi_value lastParam, napi_value* result); 417 bool ParseSubWindowOptions(napi_env env, napi_value jsObject, const sptr<WindowOption>& windowOption); 418 WmErrorCode ParseShowWindowOptions(napi_env env, napi_value showWindowOptions, bool& focusOnShow); 419 bool ParseKeyFramePolicy(napi_env env, napi_value jsObject, KeyFramePolicy& keyFramePolicy); 420 napi_value ConvertKeyFramePolicyToJsValue(napi_env env, const KeyFramePolicy& keyFramePolicy); 421 bool GetRotationResultFromJs(napi_env env, napi_value jsObject, RotationChangeResult& rotationChangeResult); 422 bool ConvertRectFromJsValue(napi_env env, napi_value jsObject, Rect& displayRect); 423 bool CheckZIndex(int32_t zIndex); 424 bool ParseZIndex(napi_env env, napi_value jsObject, WindowOption& option); 425 template<class T> ParseJsValue(napi_value jsObject,napi_env env,const std::string & name,T & data)426 bool ParseJsValue(napi_value jsObject, napi_env env, const std::string& name, T& data) 427 { 428 napi_value value = nullptr; 429 napi_get_named_property(env, jsObject, name.c_str(), &value); 430 napi_valuetype type = napi_undefined; 431 napi_typeof(env, value, &type); 432 if (type != napi_undefined) { 433 if (!AbilityRuntime::ConvertFromJsValue(env, value, data)) { 434 return false; 435 } 436 } else { 437 return false; 438 } 439 return true; 440 } 441 442 template<class T> ParseJsValueOrGetDefault(napi_value jsObject,napi_env env,const std::string & name,T & data,const T & defaultVal)443 bool ParseJsValueOrGetDefault(napi_value jsObject, napi_env env, 444 const std::string& name, T& data, const T& defaultVal) 445 { 446 napi_value value = nullptr; 447 napi_get_named_property(env, jsObject, name.c_str(), &value); 448 napi_valuetype type = napi_undefined; 449 napi_typeof(env, value, &type); 450 if (type != napi_undefined) { 451 if (!AbilityRuntime::ConvertFromJsValue(env, value, data)) { 452 return false; 453 } 454 } else { 455 data = defaultVal; 456 return true; 457 } 458 return true; 459 } 460 461 template<class T> ConvertNativeValueToVector(napi_env env,napi_value nativeArray,std::vector<T> & out)462 inline bool ConvertNativeValueToVector(napi_env env, napi_value nativeArray, std::vector<T>& out) 463 { 464 if (nativeArray == nullptr) { 465 return false; 466 } 467 T value; 468 uint32_t size = 0; 469 napi_get_array_length(env, nativeArray, &size); 470 for (uint32_t i = 0; i < size; i++) { 471 napi_value getElementValue = nullptr; 472 napi_get_element(env, nativeArray, i, &getElementValue); 473 if (!AbilityRuntime::ConvertFromJsValue(env, getElementValue, value)) { 474 return false; 475 } 476 out.emplace_back(value); 477 } 478 return true; 479 } 480 481 /** 482 * @brief Create a JS object representing a window rectangle change event. 483 * 484 * The resulting object has the following structure: 485 * { 486 * rect: { x, y, width, height }, 487 * reason: <RectChangeReason enum value> 488 * } 489 * 490 * Used to pass rectangle change info from native code to JavaScript. 491 * 492 * @param env The NAPI environment. 493 * @param rect The window rectangle. 494 * @param reason The change reason. 495 * @return The JS object on success, or nullptr on failure. 496 */ 497 napi_value BuildJsRectChangeOptions(napi_env env, const Rect& rect, RectChangeReason reason); 498 499 /** 500 * @brief Create a JS object from a native Position. 501 * 502 * The resulting object has the form: 503 * { 504 * x: <number>, 505 * y: <number> 506 * } 507 * 508 * @param env The NAPI environment. 509 * @param position The Position to convert. 510 * @return The JS object on success, or nullptr on failure. 511 */ 512 napi_value BuildJsPosition(napi_env env, const Position& position); 513 } 514 } 515 #endif