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 #include "window_helper.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 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_END 90 }; 91 92 enum class LifeCycleEventType : uint32_t { 93 FOREGROUND = 1, 94 ACTIVE, 95 INACTIVE, 96 BACKGROUND, 97 RESUMED, 98 PAUSED, 99 DESTROYED, 100 }; 101 102 const std::map<WindowType, ApiWindowType> NATIVE_JS_TO_WINDOW_TYPE_MAP { 103 { WindowType::WINDOW_TYPE_APP_SUB_WINDOW, ApiWindowType::TYPE_APP }, 104 { WindowType::WINDOW_TYPE_DIALOG, ApiWindowType::TYPE_DIALOG }, 105 { WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW, ApiWindowType::TYPE_SYSTEM_ALERT }, 106 { WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT, ApiWindowType::TYPE_INPUT_METHOD }, 107 { WindowType::WINDOW_TYPE_STATUS_BAR, ApiWindowType::TYPE_STATUS_BAR }, 108 { WindowType::WINDOW_TYPE_PANEL, ApiWindowType::TYPE_PANEL }, 109 { WindowType::WINDOW_TYPE_KEYGUARD, ApiWindowType::TYPE_KEYGUARD }, 110 { WindowType::WINDOW_TYPE_VOLUME_OVERLAY, ApiWindowType::TYPE_VOLUME_OVERLAY }, 111 { WindowType::WINDOW_TYPE_NAVIGATION_BAR, ApiWindowType::TYPE_NAVIGATION_BAR }, 112 { WindowType::WINDOW_TYPE_FLOAT, ApiWindowType::TYPE_FLOAT }, 113 { WindowType::WINDOW_TYPE_FLOAT_CAMERA, ApiWindowType::TYPE_FLOAT_CAMERA }, 114 { WindowType::WINDOW_TYPE_WALLPAPER, ApiWindowType::TYPE_WALLPAPER }, 115 { WindowType::WINDOW_TYPE_DESKTOP, ApiWindowType::TYPE_DESKTOP }, 116 { WindowType::WINDOW_TYPE_LAUNCHER_RECENT, ApiWindowType::TYPE_LAUNCHER_RECENT }, 117 { WindowType::WINDOW_TYPE_LAUNCHER_DOCK, ApiWindowType::TYPE_LAUNCHER_DOCK }, 118 { WindowType::WINDOW_TYPE_VOICE_INTERACTION, ApiWindowType::TYPE_VOICE_INTERACTION }, 119 { WindowType::WINDOW_TYPE_POINTER, ApiWindowType::TYPE_POINTER }, 120 { WindowType::WINDOW_TYPE_SCREENSHOT, ApiWindowType::TYPE_SCREENSHOT }, 121 { WindowType::WINDOW_TYPE_SYSTEM_TOAST, ApiWindowType::TYPE_SYSTEM_TOAST }, 122 { WindowType::WINDOW_TYPE_DOCK_SLICE, ApiWindowType::TYPE_DIVIDER }, 123 { WindowType::WINDOW_TYPE_GLOBAL_SEARCH, ApiWindowType::TYPE_GLOBAL_SEARCH }, 124 { WindowType::WINDOW_TYPE_HANDWRITE, ApiWindowType::TYPE_HANDWRITE }, 125 }; 126 127 const std::map<ApiWindowType, WindowType> JS_TO_NATIVE_WINDOW_TYPE_MAP { 128 { ApiWindowType::TYPE_APP, WindowType::WINDOW_TYPE_APP_SUB_WINDOW }, 129 { ApiWindowType::TYPE_DIALOG, WindowType::WINDOW_TYPE_DIALOG }, 130 { ApiWindowType::TYPE_SYSTEM_ALERT, WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW }, 131 { ApiWindowType::TYPE_INPUT_METHOD, WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT }, 132 { ApiWindowType::TYPE_STATUS_BAR, WindowType::WINDOW_TYPE_STATUS_BAR }, 133 { ApiWindowType::TYPE_PANEL, WindowType::WINDOW_TYPE_PANEL }, 134 { ApiWindowType::TYPE_KEYGUARD, WindowType::WINDOW_TYPE_KEYGUARD }, 135 { ApiWindowType::TYPE_VOLUME_OVERLAY, WindowType::WINDOW_TYPE_VOLUME_OVERLAY }, 136 { ApiWindowType::TYPE_NAVIGATION_BAR, WindowType::WINDOW_TYPE_NAVIGATION_BAR }, 137 { ApiWindowType::TYPE_FLOAT, WindowType::WINDOW_TYPE_FLOAT }, 138 { ApiWindowType::TYPE_FLOAT_CAMERA, WindowType::WINDOW_TYPE_FLOAT_CAMERA }, 139 { ApiWindowType::TYPE_WALLPAPER, WindowType::WINDOW_TYPE_WALLPAPER }, 140 { ApiWindowType::TYPE_DESKTOP, WindowType::WINDOW_TYPE_DESKTOP }, 141 { ApiWindowType::TYPE_LAUNCHER_RECENT, WindowType::WINDOW_TYPE_LAUNCHER_RECENT }, 142 { ApiWindowType::TYPE_LAUNCHER_DOCK, WindowType::WINDOW_TYPE_LAUNCHER_DOCK }, 143 { ApiWindowType::TYPE_VOICE_INTERACTION, WindowType::WINDOW_TYPE_VOICE_INTERACTION }, 144 { ApiWindowType::TYPE_POINTER, WindowType::WINDOW_TYPE_POINTER }, 145 { ApiWindowType::TYPE_SCREENSHOT, WindowType::WINDOW_TYPE_SCREENSHOT }, 146 { ApiWindowType::TYPE_SYSTEM_TOAST, WindowType::WINDOW_TYPE_SYSTEM_TOAST }, 147 { ApiWindowType::TYPE_DIVIDER, WindowType::WINDOW_TYPE_DOCK_SLICE }, 148 { ApiWindowType::TYPE_GLOBAL_SEARCH, WindowType::WINDOW_TYPE_GLOBAL_SEARCH }, 149 { ApiWindowType::TYPE_HANDWRITE, WindowType::WINDOW_TYPE_HANDWRITE }, 150 }; 151 152 enum class ApiWindowMode : uint32_t { 153 UNDEFINED = 1, 154 FULLSCREEN, 155 PRIMARY, 156 SECONDARY, 157 FLOATING, 158 MODE_END = FLOATING 159 }; 160 161 const std::map<WindowMode, ApiWindowMode> NATIVE_TO_JS_WINDOW_MODE_MAP { 162 { WindowMode::WINDOW_MODE_UNDEFINED, ApiWindowMode::UNDEFINED }, 163 { WindowMode::WINDOW_MODE_FULLSCREEN, ApiWindowMode::FULLSCREEN }, 164 { WindowMode::WINDOW_MODE_SPLIT_PRIMARY, ApiWindowMode::PRIMARY }, 165 { WindowMode::WINDOW_MODE_SPLIT_SECONDARY, ApiWindowMode::SECONDARY }, 166 { WindowMode::WINDOW_MODE_FLOATING, ApiWindowMode::FLOATING }, 167 }; 168 169 const std::map<ApiWindowMode, WindowMode> JS_TO_NATIVE_WINDOW_MODE_MAP { 170 {ApiWindowMode::UNDEFINED, WindowMode::WINDOW_MODE_UNDEFINED }, 171 {ApiWindowMode::FULLSCREEN, WindowMode::WINDOW_MODE_FULLSCREEN }, 172 {ApiWindowMode::PRIMARY, WindowMode::WINDOW_MODE_SPLIT_PRIMARY }, 173 {ApiWindowMode::SECONDARY, WindowMode::WINDOW_MODE_SPLIT_SECONDARY }, 174 {ApiWindowMode::FLOATING, WindowMode::WINDOW_MODE_FLOATING }, 175 }; 176 177 enum class ApiOrientation : uint32_t { 178 BEGIN = 0, 179 UNSPECIFIED = BEGIN, 180 PORTRAIT = 1, 181 LANDSCAPE = 2, 182 PORTRAIT_INVERTED = 3, 183 LANDSCAPE_INVERTED = 4, 184 AUTO_ROTATION = 5, 185 AUTO_ROTATION_PORTRAIT = 6, 186 AUTO_ROTATION_LANDSCAPE = 7, 187 AUTO_ROTATION_RESTRICTED = 8, 188 AUTO_ROTATION_PORTRAIT_RESTRICTED = 9, 189 AUTO_ROTATION_LANDSCAPE_RESTRICTED = 10, 190 LOCKED = 11, 191 AUTO_ROTATION_UNSPECIFIED = 12, 192 USER_ROTATION_PORTRAIT = 13, 193 USER_ROTATION_LANDSCAPE = 14, 194 USER_ROTATION_PORTRAIT_INVERTED = 15, 195 USER_ROTATION_LANDSCAPE_INVERTED = 16, 196 FOLLOW_DESKTOP = 17, 197 END = FOLLOW_DESKTOP, 198 }; 199 200 const std::map<ApiOrientation, Orientation> JS_TO_NATIVE_ORIENTATION_MAP { 201 {ApiOrientation::UNSPECIFIED, Orientation::UNSPECIFIED }, 202 {ApiOrientation::PORTRAIT, Orientation::VERTICAL }, 203 {ApiOrientation::LANDSCAPE, Orientation::HORIZONTAL }, 204 {ApiOrientation::PORTRAIT_INVERTED, Orientation::REVERSE_VERTICAL }, 205 {ApiOrientation::LANDSCAPE_INVERTED, Orientation::REVERSE_HORIZONTAL }, 206 {ApiOrientation::AUTO_ROTATION, Orientation::SENSOR }, 207 {ApiOrientation::AUTO_ROTATION_PORTRAIT, Orientation::SENSOR_VERTICAL }, 208 {ApiOrientation::AUTO_ROTATION_LANDSCAPE, Orientation::SENSOR_HORIZONTAL }, 209 {ApiOrientation::AUTO_ROTATION_RESTRICTED, Orientation::AUTO_ROTATION_RESTRICTED }, 210 {ApiOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED, Orientation::AUTO_ROTATION_PORTRAIT_RESTRICTED }, 211 {ApiOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED, Orientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED }, 212 {ApiOrientation::LOCKED, Orientation::LOCKED }, 213 {ApiOrientation::AUTO_ROTATION_UNSPECIFIED, Orientation::AUTO_ROTATION_UNSPECIFIED }, 214 {ApiOrientation::USER_ROTATION_PORTRAIT, Orientation::USER_ROTATION_PORTRAIT }, 215 {ApiOrientation::USER_ROTATION_LANDSCAPE, Orientation::USER_ROTATION_LANDSCAPE }, 216 {ApiOrientation::USER_ROTATION_PORTRAIT_INVERTED, Orientation::USER_ROTATION_PORTRAIT_INVERTED }, 217 {ApiOrientation::USER_ROTATION_LANDSCAPE_INVERTED, Orientation::USER_ROTATION_LANDSCAPE_INVERTED }, 218 {ApiOrientation::FOLLOW_DESKTOP, Orientation::FOLLOW_DESKTOP }, 219 }; 220 221 const std::map<Orientation, ApiOrientation> NATIVE_TO_JS_ORIENTATION_MAP { 222 {Orientation::UNSPECIFIED, ApiOrientation::UNSPECIFIED }, 223 {Orientation::VERTICAL, ApiOrientation::PORTRAIT }, 224 {Orientation::HORIZONTAL, ApiOrientation::LANDSCAPE }, 225 {Orientation::REVERSE_VERTICAL, ApiOrientation::PORTRAIT_INVERTED }, 226 {Orientation::REVERSE_HORIZONTAL, ApiOrientation::LANDSCAPE_INVERTED }, 227 {Orientation::SENSOR, ApiOrientation::AUTO_ROTATION }, 228 {Orientation::SENSOR_VERTICAL, ApiOrientation::AUTO_ROTATION_PORTRAIT }, 229 {Orientation::SENSOR_HORIZONTAL, ApiOrientation::AUTO_ROTATION_LANDSCAPE }, 230 {Orientation::AUTO_ROTATION_RESTRICTED, ApiOrientation::AUTO_ROTATION_RESTRICTED }, 231 {Orientation::AUTO_ROTATION_PORTRAIT_RESTRICTED, ApiOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED }, 232 {Orientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED, ApiOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED }, 233 {Orientation::LOCKED, ApiOrientation::LOCKED }, 234 {Orientation::FOLLOW_RECENT, ApiOrientation::UNSPECIFIED }, 235 {Orientation::AUTO_ROTATION_UNSPECIFIED, ApiOrientation::AUTO_ROTATION_UNSPECIFIED }, 236 {Orientation::USER_ROTATION_PORTRAIT, ApiOrientation::USER_ROTATION_PORTRAIT }, 237 {Orientation::USER_ROTATION_LANDSCAPE, ApiOrientation::USER_ROTATION_LANDSCAPE }, 238 {Orientation::USER_ROTATION_PORTRAIT_INVERTED, ApiOrientation::USER_ROTATION_PORTRAIT_INVERTED }, 239 {Orientation::USER_ROTATION_LANDSCAPE_INVERTED, ApiOrientation::USER_ROTATION_LANDSCAPE_INVERTED }, 240 {Orientation::FOLLOW_DESKTOP, ApiOrientation::FOLLOW_DESKTOP }, 241 }; 242 243 enum class RectChangeReason : uint32_t { 244 UNDEFINED = 0, 245 MAXIMIZE, 246 RECOVER, 247 MOVE, 248 DRAG, 249 DRAG_START, 250 DRAG_END, 251 }; 252 253 const std::map<WindowSizeChangeReason, RectChangeReason> JS_SIZE_CHANGE_REASON { 254 { WindowSizeChangeReason::UNDEFINED, RectChangeReason::UNDEFINED }, 255 { WindowSizeChangeReason::MAXIMIZE, RectChangeReason::MAXIMIZE }, 256 { WindowSizeChangeReason::RECOVER, RectChangeReason::RECOVER }, 257 { WindowSizeChangeReason::ROTATION, RectChangeReason::UNDEFINED }, 258 { WindowSizeChangeReason::DRAG, RectChangeReason::DRAG }, 259 { WindowSizeChangeReason::DRAG_START, RectChangeReason::DRAG_START }, 260 { WindowSizeChangeReason::DRAG_MOVE, RectChangeReason::MOVE }, 261 { WindowSizeChangeReason::DRAG_END, RectChangeReason::DRAG_END }, 262 { WindowSizeChangeReason::RESIZE, RectChangeReason::UNDEFINED }, 263 { WindowSizeChangeReason::MOVE, RectChangeReason::MOVE }, 264 { WindowSizeChangeReason::HIDE, RectChangeReason::UNDEFINED }, 265 { WindowSizeChangeReason::TRANSFORM, RectChangeReason::UNDEFINED }, 266 { WindowSizeChangeReason::CUSTOM_ANIMATION_SHOW, RectChangeReason::UNDEFINED }, 267 { WindowSizeChangeReason::FULL_TO_SPLIT, RectChangeReason::UNDEFINED }, 268 { WindowSizeChangeReason::SPLIT_TO_FULL, RectChangeReason::UNDEFINED }, 269 { WindowSizeChangeReason::FULL_TO_FLOATING, RectChangeReason::UNDEFINED }, 270 { WindowSizeChangeReason::FLOATING_TO_FULL, RectChangeReason::UNDEFINED }, 271 { WindowSizeChangeReason::END, RectChangeReason::UNDEFINED }, 272 }; 273 274 enum class ApiModalityType : uint32_t { 275 BEGIN = 0, 276 WINDOW_MODALITY = BEGIN, 277 APPLICATION_MODALITY, 278 END = APPLICATION_MODALITY, 279 }; 280 281 inline const std::map<ApiModalityType, ModalityType> JS_TO_NATIVE_MODALITY_TYPE_MAP { 282 { ApiModalityType::WINDOW_MODALITY, ModalityType::WINDOW_MODALITY }, 283 { ApiModalityType::APPLICATION_MODALITY, ModalityType::APPLICATION_MODALITY }, 284 }; 285 286 napi_value CreateJsWindowInfoArrayObject(napi_env env, const std::vector<sptr<WindowVisibilityInfo>>& infos); 287 napi_value CreateJsWindowInfoObject(napi_env env, const sptr<WindowVisibilityInfo>& window); 288 napi_value GetRectAndConvertToJsValue(napi_env env, const Rect& rect); 289 napi_value CreateJsWindowPropertiesObject(napi_env env, sptr<Window>& window, const Rect& drawableRect); 290 napi_value CreateJsSystemBarPropertiesObject(napi_env env, sptr<Window>& window); 291 bool GetSystemBarPropertiesFromJs(napi_env env, napi_value jsObject, 292 std::map<WindowType, SystemBarProperty>& properties, 293 std::map<WindowType, SystemBarPropertyFlag>& propertyFlags); 294 bool SetWindowStatusBarContentColor(napi_env env, napi_value jsObject, 295 std::map<WindowType, SystemBarProperty>& properties, 296 std::map<WindowType, SystemBarPropertyFlag>& propertyFlags); 297 bool SetWindowNavigationBarContentColor(napi_env env, napi_value jsObject, 298 std::map<WindowType, SystemBarProperty>& properties, 299 std::map<WindowType, SystemBarPropertyFlag>& propertyFlags); 300 bool GetSystemBarStatus(napi_env env, napi_callback_info info, 301 std::map<WindowType, SystemBarProperty>& systemBarProperties, 302 std::map<WindowType, SystemBarPropertyFlag>& systemBarpropertyFlags); 303 bool ParseAndCheckRect(napi_env env, napi_value jsObject, const Rect& windowRect, Rect& touchableRect); 304 WmErrorCode ParseTouchableAreas(napi_env env, napi_callback_info info, const Rect& windowRect, 305 std::vector<Rect>& touchableAreas); 306 bool GetSpecificBarStatus(napi_env env, napi_callback_info info, 307 bool& systemBarEnable, bool& systemBarEnableAnimation); 308 napi_value CreateJsSystemBarRegionTintArrayObject(napi_env env, 309 const SystemBarRegionTints& tints); 310 napi_value ConvertAvoidAreaToJsValue(napi_env env, const AvoidArea& avoidArea, AvoidAreaType type); 311 bool CheckCallingPermission(std::string permission); 312 bool ParseSystemWindowTypeForApiWindowType(int32_t apiWindowType, WindowType& windowType); 313 napi_value WindowTypeInit(napi_env env); 314 napi_value AvoidAreaTypeInit(napi_env env); 315 napi_value WindowModeInit(napi_env env); 316 napi_value ColorSpaceInit(napi_env env); 317 napi_value OrientationInit(napi_env env); 318 napi_value WindowStageEventTypeInit(napi_env env); 319 napi_value WindowEventTypeInit(napi_env env); 320 napi_value WindowLayoutModeInit(napi_env env); 321 napi_value BlurStyleInit(napi_env env); 322 napi_value MaximizePresentationInit(napi_env env); 323 napi_value WindowErrorCodeInit(napi_env env); 324 napi_value WindowErrorInit(napi_env env); 325 napi_value WindowStatusTypeInit(napi_env env); 326 napi_value RectChangeReasonInit(napi_env env); 327 napi_value GetWindowLimitsAndConvertToJsValue(napi_env env, const WindowLimits& windowLimits); 328 napi_value ConvertTitleButtonAreaToJsValue(napi_env env, const TitleButtonRect& titleButtonRect); 329 napi_value ModalityTypeInit(napi_env env); 330 napi_value ExtensionWindowAttributeInit(napi_env env); 331 bool GetAPI7Ability(napi_env env, AppExecFwk::Ability* &ability); 332 bool GetWindowMaskFromJsValue(napi_env env, napi_value jsObject, std::vector<std::vector<uint32_t>>& windowMask); 333 void ConvertJSSystemBarStyleToSystemBarProperties(napi_env env, napi_value jsObject, 334 std::map<WindowType, SystemBarProperty>& properties, 335 std::map<WindowType, SystemBarPropertyFlag>& propertyFlags); 336 std::unique_ptr<AbilityRuntime::NapiAsyncTask> CreateAsyncTask(napi_env env, napi_value lastParam, 337 std::unique_ptr<AbilityRuntime::NapiAsyncTask::ExecuteCallback>&& execute, 338 std::unique_ptr<AbilityRuntime::NapiAsyncTask::CompleteCallback>&& complete, napi_value* result); 339 std::unique_ptr<AbilityRuntime::NapiAsyncTask> CreateEmptyAsyncTask( 340 napi_env env, napi_value lastParam, napi_value* result); 341 bool ParseSubWindowOptions(napi_env env, napi_value jsObject, const sptr<WindowOption>& windowOption); 342 template<class T> ParseJsValue(napi_value jsObject,napi_env env,const std::string & name,T & data)343 bool ParseJsValue(napi_value jsObject, napi_env env, const std::string& name, T& data) 344 { 345 napi_value value = nullptr; 346 napi_get_named_property(env, jsObject, name.c_str(), &value); 347 napi_valuetype type = napi_undefined; 348 napi_typeof(env, value, &type); 349 if (type != napi_undefined) { 350 if (!AbilityRuntime::ConvertFromJsValue(env, value, data)) { 351 return false; 352 } 353 } else { 354 return false; 355 } 356 return true; 357 } 358 template<class T> ConvertNativeValueToVector(napi_env env,napi_value nativeArray,std::vector<T> & out)359 inline bool ConvertNativeValueToVector(napi_env env, napi_value nativeArray, std::vector<T>& out) 360 { 361 if (nativeArray == nullptr) { 362 return false; 363 } 364 T value; 365 uint32_t size = 0; 366 napi_get_array_length(env, nativeArray, &size); 367 for (uint32_t i = 0; i < size; i++) { 368 napi_value getElementValue = nullptr; 369 napi_get_element(env, nativeArray, i, &getElementValue); 370 if (!AbilityRuntime::ConvertFromJsValue(env, getElementValue, value)) { 371 return false; 372 } 373 out.emplace_back(value); 374 } 375 return true; 376 } 377 } 378 } 379 #endif