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 <map> 19 #include "js_runtime_utils.h" 20 #include "native_engine/native_engine.h" 21 #include "native_engine/native_value.h" 22 #include "window.h" 23 24 #ifndef WINDOW_PREVIEW 25 #include "window_manager.h" 26 #else 27 #include "mock/window_manager.h" 28 #endif 29 30 #include "window_option.h" 31 #include "window_visibility_info.h" 32 #include "wm_common.h" 33 #include "window_helper.h" 34 namespace OHOS { 35 namespace Rosen { 36 constexpr int32_t RGB_LENGTH = 6; 37 constexpr int32_t RGBA_LENGTH = 8; 38 39 #define CHECK_NAPI_RETCODE(errCode, code, call) \ 40 do { \ 41 napi_status retCode = (call); \ 42 if (retCode != napi_ok) { \ 43 WLOGFE("napi call failed, return %{public}d", static_cast<int32_t>(retCode)); \ 44 errCode = code; \ 45 } \ 46 } while (0) 47 48 #define CHECK_NAPI_ENV_RETURN_IF_NULL(env) \ 49 do { \ 50 if ((env) == nullptr) { \ 51 TLOGE(WmsLogTag::DEFAULT, "env is invalid"); \ 52 return nullptr; \ 53 } \ 54 } while (0) 55 56 #define CHECK_NAPI_CREATE_OBJECT_RETURN_IF_NULL(env, objValue) \ 57 do { \ 58 napi_create_object((env), &(objValue)); \ 59 if ((objValue) == nullptr) { \ 60 TLOGE(WmsLogTag::DEFAULT, "Failed to get object"); \ 61 return nullptr; \ 62 } \ 63 } while (0) 64 65 enum class ApiWindowType : uint32_t { 66 TYPE_BASE, 67 TYPE_APP = TYPE_BASE, 68 TYPE_SYSTEM_ALERT, 69 TYPE_INPUT_METHOD, 70 TYPE_STATUS_BAR, 71 TYPE_PANEL, 72 TYPE_KEYGUARD, 73 TYPE_VOLUME_OVERLAY, 74 TYPE_NAVIGATION_BAR, 75 TYPE_FLOAT, 76 TYPE_WALLPAPER, 77 TYPE_DESKTOP, 78 TYPE_LAUNCHER_RECENT, 79 TYPE_LAUNCHER_DOCK, 80 TYPE_VOICE_INTERACTION, 81 TYPE_POINTER, 82 TYPE_FLOAT_CAMERA, 83 TYPE_DIALOG, 84 TYPE_SCREENSHOT, 85 TYPE_SYSTEM_TOAST, 86 TYPE_DIVIDER, 87 TYPE_GLOBAL_SEARCH, 88 TYPE_HANDWRITE, 89 TYPE_WALLET_SWIPE_CARD, 90 TYPE_SCREEN_CONTROL, 91 TYPE_FLOAT_NAVIGATION, 92 TYPE_MAIN = 32, 93 TYPE_END 94 }; 95 96 enum class LifeCycleEventType : uint32_t { 97 FOREGROUND = 1, 98 ACTIVE, 99 INACTIVE, 100 BACKGROUND, 101 RESUMED, 102 PAUSED, 103 DESTROYED, 104 }; 105 106 const std::map<WindowType, ApiWindowType> NATIVE_JS_TO_WINDOW_TYPE_MAP { 107 { WindowType::WINDOW_TYPE_APP_SUB_WINDOW, ApiWindowType::TYPE_APP }, 108 { WindowType::WINDOW_TYPE_DIALOG, ApiWindowType::TYPE_DIALOG }, 109 { WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW, ApiWindowType::TYPE_SYSTEM_ALERT }, 110 { WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT, ApiWindowType::TYPE_INPUT_METHOD }, 111 { WindowType::WINDOW_TYPE_STATUS_BAR, ApiWindowType::TYPE_STATUS_BAR }, 112 { WindowType::WINDOW_TYPE_PANEL, ApiWindowType::TYPE_PANEL }, 113 { WindowType::WINDOW_TYPE_KEYGUARD, ApiWindowType::TYPE_KEYGUARD }, 114 { WindowType::WINDOW_TYPE_VOLUME_OVERLAY, ApiWindowType::TYPE_VOLUME_OVERLAY }, 115 { WindowType::WINDOW_TYPE_NAVIGATION_BAR, ApiWindowType::TYPE_NAVIGATION_BAR }, 116 { WindowType::WINDOW_TYPE_FLOAT, ApiWindowType::TYPE_FLOAT }, 117 { WindowType::WINDOW_TYPE_FLOAT_CAMERA, ApiWindowType::TYPE_FLOAT_CAMERA }, 118 { WindowType::WINDOW_TYPE_WALLPAPER, ApiWindowType::TYPE_WALLPAPER }, 119 { WindowType::WINDOW_TYPE_DESKTOP, ApiWindowType::TYPE_DESKTOP }, 120 { WindowType::WINDOW_TYPE_LAUNCHER_RECENT, ApiWindowType::TYPE_LAUNCHER_RECENT }, 121 { WindowType::WINDOW_TYPE_LAUNCHER_DOCK, ApiWindowType::TYPE_LAUNCHER_DOCK }, 122 { WindowType::WINDOW_TYPE_VOICE_INTERACTION, ApiWindowType::TYPE_VOICE_INTERACTION }, 123 { WindowType::WINDOW_TYPE_POINTER, ApiWindowType::TYPE_POINTER }, 124 { WindowType::WINDOW_TYPE_SCREENSHOT, ApiWindowType::TYPE_SCREENSHOT }, 125 { WindowType::WINDOW_TYPE_SYSTEM_TOAST, ApiWindowType::TYPE_SYSTEM_TOAST }, 126 { WindowType::WINDOW_TYPE_DOCK_SLICE, ApiWindowType::TYPE_DIVIDER }, 127 { WindowType::WINDOW_TYPE_GLOBAL_SEARCH, ApiWindowType::TYPE_GLOBAL_SEARCH }, 128 { WindowType::WINDOW_TYPE_HANDWRITE, ApiWindowType::TYPE_HANDWRITE }, 129 { WindowType::WINDOW_TYPE_WALLET_SWIPE_CARD, ApiWindowType::TYPE_WALLET_SWIPE_CARD }, 130 { WindowType::WINDOW_TYPE_SCREEN_CONTROL, ApiWindowType::TYPE_SCREEN_CONTROL }, 131 { WindowType::WINDOW_TYPE_FLOAT_NAVIGATION, ApiWindowType::TYPE_FLOAT_NAVIGATION }, 132 { WindowType::WINDOW_TYPE_APP_MAIN_WINDOW, ApiWindowType::TYPE_MAIN }, 133 }; 134 135 const std::map<ApiWindowType, WindowType> JS_TO_NATIVE_WINDOW_TYPE_MAP { 136 { ApiWindowType::TYPE_APP, WindowType::WINDOW_TYPE_APP_SUB_WINDOW }, 137 { ApiWindowType::TYPE_DIALOG, WindowType::WINDOW_TYPE_DIALOG }, 138 { ApiWindowType::TYPE_SYSTEM_ALERT, WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW }, 139 { ApiWindowType::TYPE_INPUT_METHOD, WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT }, 140 { ApiWindowType::TYPE_STATUS_BAR, WindowType::WINDOW_TYPE_STATUS_BAR }, 141 { ApiWindowType::TYPE_PANEL, WindowType::WINDOW_TYPE_PANEL }, 142 { ApiWindowType::TYPE_KEYGUARD, WindowType::WINDOW_TYPE_KEYGUARD }, 143 { ApiWindowType::TYPE_VOLUME_OVERLAY, WindowType::WINDOW_TYPE_VOLUME_OVERLAY }, 144 { ApiWindowType::TYPE_NAVIGATION_BAR, WindowType::WINDOW_TYPE_NAVIGATION_BAR }, 145 { ApiWindowType::TYPE_FLOAT, WindowType::WINDOW_TYPE_FLOAT }, 146 { ApiWindowType::TYPE_FLOAT_CAMERA, WindowType::WINDOW_TYPE_FLOAT_CAMERA }, 147 { ApiWindowType::TYPE_WALLPAPER, WindowType::WINDOW_TYPE_WALLPAPER }, 148 { ApiWindowType::TYPE_DESKTOP, WindowType::WINDOW_TYPE_DESKTOP }, 149 { ApiWindowType::TYPE_LAUNCHER_RECENT, WindowType::WINDOW_TYPE_LAUNCHER_RECENT }, 150 { ApiWindowType::TYPE_LAUNCHER_DOCK, WindowType::WINDOW_TYPE_LAUNCHER_DOCK }, 151 { ApiWindowType::TYPE_VOICE_INTERACTION, WindowType::WINDOW_TYPE_VOICE_INTERACTION }, 152 { ApiWindowType::TYPE_POINTER, WindowType::WINDOW_TYPE_POINTER }, 153 { ApiWindowType::TYPE_SCREENSHOT, WindowType::WINDOW_TYPE_SCREENSHOT }, 154 { ApiWindowType::TYPE_SYSTEM_TOAST, WindowType::WINDOW_TYPE_SYSTEM_TOAST }, 155 { ApiWindowType::TYPE_DIVIDER, WindowType::WINDOW_TYPE_DOCK_SLICE }, 156 { ApiWindowType::TYPE_GLOBAL_SEARCH, WindowType::WINDOW_TYPE_GLOBAL_SEARCH }, 157 { ApiWindowType::TYPE_HANDWRITE, WindowType::WINDOW_TYPE_HANDWRITE }, 158 { ApiWindowType::TYPE_WALLET_SWIPE_CARD, WindowType::WINDOW_TYPE_WALLET_SWIPE_CARD }, 159 { ApiWindowType::TYPE_SCREEN_CONTROL, WindowType::WINDOW_TYPE_SCREEN_CONTROL }, 160 { ApiWindowType::TYPE_FLOAT_NAVIGATION, WindowType::WINDOW_TYPE_FLOAT_NAVIGATION }, 161 { ApiWindowType::TYPE_MAIN, WindowType::WINDOW_TYPE_APP_MAIN_WINDOW }, 162 }; 163 164 enum class ApiWindowMode : uint32_t { 165 UNDEFINED = 1, 166 FULLSCREEN, 167 PRIMARY, 168 SECONDARY, 169 FLOATING, 170 MODE_END = FLOATING 171 }; 172 173 const std::map<WindowMode, ApiWindowMode> NATIVE_TO_JS_WINDOW_MODE_MAP { 174 { WindowMode::WINDOW_MODE_UNDEFINED, ApiWindowMode::UNDEFINED }, 175 { WindowMode::WINDOW_MODE_FULLSCREEN, ApiWindowMode::FULLSCREEN }, 176 { WindowMode::WINDOW_MODE_SPLIT_PRIMARY, ApiWindowMode::PRIMARY }, 177 { WindowMode::WINDOW_MODE_SPLIT_SECONDARY, ApiWindowMode::SECONDARY }, 178 { WindowMode::WINDOW_MODE_FLOATING, ApiWindowMode::FLOATING }, 179 }; 180 181 const std::map<ApiWindowMode, WindowMode> JS_TO_NATIVE_WINDOW_MODE_MAP { 182 {ApiWindowMode::UNDEFINED, WindowMode::WINDOW_MODE_UNDEFINED }, 183 {ApiWindowMode::FULLSCREEN, WindowMode::WINDOW_MODE_FULLSCREEN }, 184 {ApiWindowMode::PRIMARY, WindowMode::WINDOW_MODE_SPLIT_PRIMARY }, 185 {ApiWindowMode::SECONDARY, WindowMode::WINDOW_MODE_SPLIT_SECONDARY }, 186 {ApiWindowMode::FLOATING, WindowMode::WINDOW_MODE_FLOATING }, 187 }; 188 189 enum class ApiOrientation : uint32_t { 190 BEGIN = 0, 191 UNSPECIFIED = BEGIN, 192 PORTRAIT = 1, 193 LANDSCAPE = 2, 194 PORTRAIT_INVERTED = 3, 195 LANDSCAPE_INVERTED = 4, 196 AUTO_ROTATION = 5, 197 AUTO_ROTATION_PORTRAIT = 6, 198 AUTO_ROTATION_LANDSCAPE = 7, 199 AUTO_ROTATION_RESTRICTED = 8, 200 AUTO_ROTATION_PORTRAIT_RESTRICTED = 9, 201 AUTO_ROTATION_LANDSCAPE_RESTRICTED = 10, 202 LOCKED = 11, 203 AUTO_ROTATION_UNSPECIFIED = 12, 204 USER_ROTATION_PORTRAIT = 13, 205 USER_ROTATION_LANDSCAPE = 14, 206 USER_ROTATION_PORTRAIT_INVERTED = 15, 207 USER_ROTATION_LANDSCAPE_INVERTED = 16, 208 FOLLOW_DESKTOP = 17, 209 END = FOLLOW_DESKTOP, 210 }; 211 212 const std::map<ApiOrientation, Orientation> JS_TO_NATIVE_ORIENTATION_MAP { 213 {ApiOrientation::UNSPECIFIED, Orientation::UNSPECIFIED }, 214 {ApiOrientation::PORTRAIT, Orientation::VERTICAL }, 215 {ApiOrientation::LANDSCAPE, Orientation::HORIZONTAL }, 216 {ApiOrientation::PORTRAIT_INVERTED, Orientation::REVERSE_VERTICAL }, 217 {ApiOrientation::LANDSCAPE_INVERTED, Orientation::REVERSE_HORIZONTAL }, 218 {ApiOrientation::AUTO_ROTATION, Orientation::SENSOR }, 219 {ApiOrientation::AUTO_ROTATION_PORTRAIT, Orientation::SENSOR_VERTICAL }, 220 {ApiOrientation::AUTO_ROTATION_LANDSCAPE, Orientation::SENSOR_HORIZONTAL }, 221 {ApiOrientation::AUTO_ROTATION_RESTRICTED, Orientation::AUTO_ROTATION_RESTRICTED }, 222 {ApiOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED, Orientation::AUTO_ROTATION_PORTRAIT_RESTRICTED }, 223 {ApiOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED, Orientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED }, 224 {ApiOrientation::LOCKED, Orientation::LOCKED }, 225 {ApiOrientation::AUTO_ROTATION_UNSPECIFIED, Orientation::AUTO_ROTATION_UNSPECIFIED }, 226 {ApiOrientation::USER_ROTATION_PORTRAIT, Orientation::USER_ROTATION_PORTRAIT }, 227 {ApiOrientation::USER_ROTATION_LANDSCAPE, Orientation::USER_ROTATION_LANDSCAPE }, 228 {ApiOrientation::USER_ROTATION_PORTRAIT_INVERTED, Orientation::USER_ROTATION_PORTRAIT_INVERTED }, 229 {ApiOrientation::USER_ROTATION_LANDSCAPE_INVERTED, Orientation::USER_ROTATION_LANDSCAPE_INVERTED }, 230 {ApiOrientation::FOLLOW_DESKTOP, Orientation::FOLLOW_DESKTOP }, 231 }; 232 233 const std::map<Orientation, ApiOrientation> NATIVE_TO_JS_ORIENTATION_MAP { 234 {Orientation::UNSPECIFIED, ApiOrientation::UNSPECIFIED }, 235 {Orientation::VERTICAL, ApiOrientation::PORTRAIT }, 236 {Orientation::HORIZONTAL, ApiOrientation::LANDSCAPE }, 237 {Orientation::REVERSE_VERTICAL, ApiOrientation::PORTRAIT_INVERTED }, 238 {Orientation::REVERSE_HORIZONTAL, ApiOrientation::LANDSCAPE_INVERTED }, 239 {Orientation::SENSOR, ApiOrientation::AUTO_ROTATION }, 240 {Orientation::SENSOR_VERTICAL, ApiOrientation::AUTO_ROTATION_PORTRAIT }, 241 {Orientation::SENSOR_HORIZONTAL, ApiOrientation::AUTO_ROTATION_LANDSCAPE }, 242 {Orientation::AUTO_ROTATION_RESTRICTED, ApiOrientation::AUTO_ROTATION_RESTRICTED }, 243 {Orientation::AUTO_ROTATION_PORTRAIT_RESTRICTED, ApiOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED }, 244 {Orientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED, ApiOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED }, 245 {Orientation::LOCKED, ApiOrientation::LOCKED }, 246 {Orientation::FOLLOW_RECENT, ApiOrientation::UNSPECIFIED }, 247 {Orientation::AUTO_ROTATION_UNSPECIFIED, ApiOrientation::AUTO_ROTATION_UNSPECIFIED }, 248 {Orientation::USER_ROTATION_PORTRAIT, ApiOrientation::USER_ROTATION_PORTRAIT }, 249 {Orientation::USER_ROTATION_LANDSCAPE, ApiOrientation::USER_ROTATION_LANDSCAPE }, 250 {Orientation::USER_ROTATION_PORTRAIT_INVERTED, ApiOrientation::USER_ROTATION_PORTRAIT_INVERTED }, 251 {Orientation::USER_ROTATION_LANDSCAPE_INVERTED, ApiOrientation::USER_ROTATION_LANDSCAPE_INVERTED }, 252 {Orientation::FOLLOW_DESKTOP, ApiOrientation::FOLLOW_DESKTOP }, 253 }; 254 255 enum class RectChangeReason : uint32_t { 256 UNDEFINED = 0, 257 MAXIMIZE, 258 RECOVER, 259 MOVE, 260 DRAG, 261 DRAG_START, 262 DRAG_END, 263 }; 264 265 const std::map<WindowSizeChangeReason, RectChangeReason> JS_SIZE_CHANGE_REASON { 266 { WindowSizeChangeReason::UNDEFINED, RectChangeReason::UNDEFINED }, 267 { WindowSizeChangeReason::MAXIMIZE, RectChangeReason::MAXIMIZE }, 268 { WindowSizeChangeReason::RECOVER, RectChangeReason::RECOVER }, 269 { WindowSizeChangeReason::ROTATION, RectChangeReason::UNDEFINED }, 270 { WindowSizeChangeReason::DRAG, RectChangeReason::DRAG }, 271 { WindowSizeChangeReason::DRAG_START, RectChangeReason::DRAG_START }, 272 { WindowSizeChangeReason::DRAG_MOVE, RectChangeReason::MOVE }, 273 { WindowSizeChangeReason::DRAG_END, RectChangeReason::DRAG_END }, 274 { WindowSizeChangeReason::RESIZE, RectChangeReason::UNDEFINED }, 275 { WindowSizeChangeReason::MOVE, RectChangeReason::MOVE }, 276 { WindowSizeChangeReason::HIDE, RectChangeReason::UNDEFINED }, 277 { WindowSizeChangeReason::TRANSFORM, RectChangeReason::UNDEFINED }, 278 { WindowSizeChangeReason::CUSTOM_ANIMATION_SHOW, RectChangeReason::UNDEFINED }, 279 { WindowSizeChangeReason::FULL_TO_SPLIT, RectChangeReason::UNDEFINED }, 280 { WindowSizeChangeReason::SPLIT_TO_FULL, RectChangeReason::UNDEFINED }, 281 { WindowSizeChangeReason::FULL_TO_FLOATING, RectChangeReason::UNDEFINED }, 282 { WindowSizeChangeReason::FLOATING_TO_FULL, RectChangeReason::UNDEFINED }, 283 { WindowSizeChangeReason::MAXIMIZE_TO_SPLIT, RectChangeReason::UNDEFINED }, 284 { WindowSizeChangeReason::SPLIT_TO_MAXIMIZE, RectChangeReason::UNDEFINED }, 285 { WindowSizeChangeReason::END, RectChangeReason::UNDEFINED }, 286 }; 287 288 enum class ApiModalityType : uint32_t { 289 BEGIN = 0, 290 WINDOW_MODALITY = BEGIN, 291 APPLICATION_MODALITY, 292 END = APPLICATION_MODALITY, 293 }; 294 295 inline const std::map<ApiModalityType, ModalityType> JS_TO_NATIVE_MODALITY_TYPE_MAP { 296 { ApiModalityType::WINDOW_MODALITY, ModalityType::WINDOW_MODALITY }, 297 { ApiModalityType::APPLICATION_MODALITY, ModalityType::APPLICATION_MODALITY }, 298 }; 299 300 using AsyncCallbackFunc_ = std::function<void(napi_env env, size_t argc, napi_value* argv)>; 301 302 class AsyncCallback : virtual public RefBase { 303 public: 304 AsyncCallbackFunc_ resolvedCallback_ = nullptr; 305 AsyncCallbackFunc_ rejectedCallback_ = nullptr; AsyncCallback(AsyncCallbackFunc_ resolvedCallback,AsyncCallbackFunc_ rejectedCallback)306 AsyncCallback(AsyncCallbackFunc_ resolvedCallback, AsyncCallbackFunc_ rejectedCallback) 307 : resolvedCallback_(resolvedCallback), rejectedCallback_(rejectedCallback) {} 308 }; 309 310 /* 311 * Promise 312 */ 313 bool CheckPromise(napi_env env, napi_value promiseObj); 314 napi_value ResolvedCallback(napi_env env, napi_callback_info info); 315 napi_value RejectedCallback(napi_env env, napi_callback_info info); 316 bool CallPromise(napi_env env, napi_value promiseObj, AsyncCallback* asyncCallback); 317 318 napi_value CreateJsWindowLayoutInfoArrayObject(napi_env env, const std::vector<sptr<WindowLayoutInfo>>& infos); 319 napi_value CreateJsWindowLayoutInfoObject(napi_env env, const sptr<WindowLayoutInfo>& info); 320 napi_value CreateJsWindowInfoArrayObject(napi_env env, const std::vector<sptr<WindowVisibilityInfo>>& infos); 321 napi_value CreateJsWindowInfoObject(napi_env env, const sptr<WindowVisibilityInfo>& window); 322 napi_value GetRectAndConvertToJsValue(napi_env env, const Rect& rect); 323 napi_value CreateJsWindowPropertiesObject(napi_env env, sptr<Window>& window, const Rect& drawableRect); 324 napi_value CreateJsSystemBarPropertiesObject(napi_env env, sptr<Window>& window); 325 bool GetSystemBarPropertiesFromJs(napi_env env, napi_value jsObject, 326 std::unordered_map<WindowType, SystemBarProperty>& properties, 327 std::unordered_map<WindowType, SystemBarPropertyFlag>& propertyFlags); 328 bool SetWindowStatusBarContentColor(napi_env env, napi_value jsObject, 329 std::unordered_map<WindowType, SystemBarProperty>& properties, 330 std::unordered_map<WindowType, SystemBarPropertyFlag>& propertyFlags); 331 bool SetWindowNavigationBarContentColor(napi_env env, napi_value jsObject, 332 std::unordered_map<WindowType, SystemBarProperty>& properties, 333 std::unordered_map<WindowType, SystemBarPropertyFlag>& propertyFlags); 334 bool GetSystemBarStatus(napi_env env, napi_callback_info info, 335 std::unordered_map<WindowType, SystemBarProperty>& systemBarProperties, 336 std::unordered_map<WindowType, SystemBarPropertyFlag>& systemBarpropertyFlags); 337 napi_value GetStatusBarPropertyObject(napi_env env, sptr<Window>& window); 338 bool ParseColorMetrics(napi_env env, napi_value value, uint32_t& colorValue); 339 bool GetWindowBackgroundColorFromJs(napi_env env, napi_value value, std::string& colorStr); 340 bool ParseAndCheckRect(napi_env env, napi_value jsObject, const Rect& windowRect, Rect& touchableRect); 341 WmErrorCode ParseTouchableAreas(napi_env env, napi_callback_info info, const Rect& windowRect, 342 std::vector<Rect>& touchableAreas); 343 bool GetSpecificBarStatus(napi_env env, napi_callback_info info, 344 bool& systemBarEnable, bool& systemBarEnableAnimation); 345 napi_value CreateJsSystemBarRegionTintArrayObject(napi_env env, 346 const SystemBarRegionTints& tints); 347 napi_value ConvertAvoidAreaToJsValue(napi_env env, const AvoidArea& avoidArea, AvoidAreaType type); 348 bool CheckCallingPermission(std::string permission); 349 bool ParseSystemWindowTypeForApiWindowType(int32_t apiWindowType, WindowType& windowType); 350 napi_value WindowTypeInit(napi_env env); 351 napi_value AvoidAreaTypeInit(napi_env env); 352 napi_value WindowModeInit(napi_env env); 353 napi_value ColorSpaceInit(napi_env env); 354 napi_value OrientationInit(napi_env env); 355 napi_value WindowStageEventTypeInit(napi_env env); 356 napi_value WindowEventTypeInit(napi_env env); 357 napi_value WindowLayoutModeInit(napi_env env); 358 napi_value BlurStyleInit(napi_env env); 359 napi_value MaximizePresentationInit(napi_env env); 360 napi_value WindowErrorCodeInit(napi_env env); 361 napi_value WindowErrorInit(napi_env env); 362 napi_value WindowStatusTypeInit(napi_env env); 363 napi_value RectChangeReasonInit(napi_env env); 364 napi_value GetWindowLimitsAndConvertToJsValue(napi_env env, const WindowLimits& windowLimits); 365 napi_value ConvertTitleButtonAreaToJsValue(napi_env env, const TitleButtonRect& titleButtonRect); 366 napi_value ExtensionWindowAttributeInit(napi_env env); 367 napi_value ModalityTypeInit(napi_env env); 368 napi_value CreateJsDecorButtonStyleObj(napi_env env, DecorButtonStyle decorButtonStyle); 369 napi_value ConvertWindowDensityInfoToJsValue(napi_env env, const WindowDensityInfo& windowDensityInfo); 370 bool ConvertDecorButtonStyleFromJs(napi_env env, napi_value jsObject, DecorButtonStyle& decorButtonStyle); 371 bool GetAPI7Ability(napi_env env, AppExecFwk::Ability* &ability); 372 bool GetWindowMaskFromJsValue(napi_env env, napi_value jsObject, std::vector<std::vector<uint32_t>>& windowMask); 373 bool GetMoveConfigurationFromJsValue(napi_env env, napi_value jsObject, MoveConfiguration& moveConfiguration); 374 bool ParseRectAnimationConfig(napi_env env, napi_value jsObject, RectAnimationConfig& rectAnimationConfig); 375 void ConvertJSSystemBarStyleToSystemBarProperties(napi_env env, napi_value jsObject, 376 std::map<WindowType, SystemBarProperty>& properties, 377 std::map<WindowType, SystemBarPropertyFlag>& propertyFlags); 378 std::unique_ptr<AbilityRuntime::NapiAsyncTask> CreateAsyncTask(napi_env env, napi_value lastParam, 379 std::unique_ptr<AbilityRuntime::NapiAsyncTask::ExecuteCallback>&& execute, 380 std::unique_ptr<AbilityRuntime::NapiAsyncTask::CompleteCallback>&& complete, napi_value* result); 381 std::unique_ptr<AbilityRuntime::NapiAsyncTask> CreateEmptyAsyncTask( 382 napi_env env, napi_value lastParam, napi_value* result); 383 bool ParseSubWindowOptions(napi_env env, napi_value jsObject, const sptr<WindowOption>& windowOption); 384 template<class T> ParseJsValue(napi_value jsObject,napi_env env,const std::string & name,T & data)385 bool ParseJsValue(napi_value jsObject, napi_env env, const std::string& name, T& data) 386 { 387 napi_value value = nullptr; 388 napi_get_named_property(env, jsObject, name.c_str(), &value); 389 napi_valuetype type = napi_undefined; 390 napi_typeof(env, value, &type); 391 if (type != napi_undefined) { 392 if (!AbilityRuntime::ConvertFromJsValue(env, value, data)) { 393 return false; 394 } 395 } else { 396 return false; 397 } 398 return true; 399 } 400 template<class T> ConvertNativeValueToVector(napi_env env,napi_value nativeArray,std::vector<T> & out)401 inline bool ConvertNativeValueToVector(napi_env env, napi_value nativeArray, std::vector<T>& out) 402 { 403 if (nativeArray == nullptr) { 404 return false; 405 } 406 T value; 407 uint32_t size = 0; 408 napi_get_array_length(env, nativeArray, &size); 409 for (uint32_t i = 0; i < size; i++) { 410 napi_value getElementValue = nullptr; 411 napi_get_element(env, nativeArray, i, &getElementValue); 412 if (!AbilityRuntime::ConvertFromJsValue(env, getElementValue, value)) { 413 return false; 414 } 415 out.emplace_back(value); 416 } 417 return true; 418 } 419 } 420 } 421 #endif