@openui5/sap.ui.core 1.119.1 → 1.120.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (968) hide show
  1. package/THIRDPARTY.txt +6 -6
  2. package/package.json +1 -1
  3. package/src/jquery.sap.global.js +40 -111
  4. package/src/jquery.sap.properties.js +7 -1
  5. package/src/jquery.sap.resources.js +1 -1
  6. package/src/jquery.sap.script.js +5 -3
  7. package/src/jquery.sap.storage.js +6 -3
  8. package/src/sap/base/Event.js +32 -78
  9. package/src/sap/base/Eventing.js +114 -271
  10. package/src/sap/base/Log.js +21 -1
  11. package/src/sap/base/config.js +14 -9
  12. package/src/sap/base/i18n/Formatting.js +400 -256
  13. package/src/sap/base/i18n/LanguageTag.js +64 -66
  14. package/src/sap/base/i18n/Localization.js +125 -87
  15. package/src/sap/base/i18n/ResourceBundle.js +1 -1
  16. package/src/sap/base/i18n/date/CalendarType.js +2 -2
  17. package/src/sap/base/i18n/date/CalendarWeekNumbering.js +2 -2
  18. package/src/sap/base/i18n/date/TimezoneUtils.js +43 -6
  19. package/src/sap/base/util/LoaderExtensions.js +8 -2
  20. package/src/sap/base/util/mixedFetch.js +1 -0
  21. package/src/sap/base/util/resolveReference.js +31 -13
  22. package/src/sap/base/util/restricted/_CancelablePromise.js +1 -1
  23. package/src/sap/base/util/restricted/_castArray.js +1 -1
  24. package/src/sap/base/util/restricted/_compact.js +1 -1
  25. package/src/sap/base/util/restricted/_curry.js +1 -1
  26. package/src/sap/base/util/restricted/_debounce.js +1 -1
  27. package/src/sap/base/util/restricted/_difference.js +1 -1
  28. package/src/sap/base/util/restricted/_differenceBy.js +1 -1
  29. package/src/sap/base/util/restricted/_differenceWith.js +1 -1
  30. package/src/sap/base/util/restricted/_flatMap.js +1 -1
  31. package/src/sap/base/util/restricted/_flatMapDeep.js +1 -1
  32. package/src/sap/base/util/restricted/_flatMapDepth.js +1 -1
  33. package/src/sap/base/util/restricted/_flatten.js +1 -1
  34. package/src/sap/base/util/restricted/_flattenDeep.js +1 -1
  35. package/src/sap/base/util/restricted/_flattenDepth.js +1 -1
  36. package/src/sap/base/util/restricted/_intersection.js +1 -1
  37. package/src/sap/base/util/restricted/_intersectionBy.js +1 -1
  38. package/src/sap/base/util/restricted/_intersectionWith.js +1 -1
  39. package/src/sap/base/util/restricted/_isEqual.js +1 -1
  40. package/src/sap/base/util/restricted/_isEqualWith.js +1 -1
  41. package/src/sap/base/util/restricted/_isNil.js +1 -1
  42. package/src/sap/base/util/restricted/_max.js +1 -1
  43. package/src/sap/base/util/restricted/_merge.js +1 -1
  44. package/src/sap/base/util/restricted/_mergeWith.js +1 -1
  45. package/src/sap/base/util/restricted/_min.js +1 -1
  46. package/src/sap/base/util/restricted/_omit.js +1 -1
  47. package/src/sap/base/util/restricted/_pick.js +1 -1
  48. package/src/sap/base/util/restricted/_pickBy.js +1 -1
  49. package/src/sap/base/util/restricted/_throttle.js +1 -1
  50. package/src/sap/base/util/restricted/_toArray.js +1 -1
  51. package/src/sap/base/util/restricted/_union.js +1 -1
  52. package/src/sap/base/util/restricted/_unionBy.js +1 -1
  53. package/src/sap/base/util/restricted/_unionWith.js +1 -1
  54. package/src/sap/base/util/restricted/_uniq.js +1 -1
  55. package/src/sap/base/util/restricted/_uniqBy.js +1 -1
  56. package/src/sap/base/util/restricted/_uniqWith.js +1 -1
  57. package/src/sap/base/util/restricted/_without.js +1 -1
  58. package/src/sap/base/util/restricted/_xor.js +1 -1
  59. package/src/sap/base/util/restricted/_xorBy.js +1 -1
  60. package/src/sap/base/util/restricted/_xorWith.js +1 -1
  61. package/src/sap/base/util/restricted/_zipObject.js +1 -1
  62. package/src/sap/base/util/restricted/_zipObjectDeep.js +1 -1
  63. package/src/sap/base/util/syncFetch.js +1 -0
  64. package/src/sap/ui/Device.js +3 -3
  65. package/src/sap/ui/Global.js +6 -7
  66. package/src/sap/ui/base/BindingInfo.js +3 -3
  67. package/src/sap/ui/base/BindingParser.js +5 -2
  68. package/src/sap/ui/base/DataType.js +57 -1
  69. package/src/sap/ui/base/DesignTime.js +69 -0
  70. package/src/sap/ui/base/Event.js +2 -2
  71. package/src/sap/ui/base/EventProvider.js +1 -1
  72. package/src/sap/ui/base/ExpressionParser.js +25 -4
  73. package/src/sap/ui/base/Interface.js +1 -1
  74. package/src/sap/ui/base/ManagedObject.js +102 -85
  75. package/src/sap/ui/base/ManagedObjectMetadata.js +53 -31
  76. package/src/sap/ui/base/ManagedObjectObserver.js +1 -0
  77. package/src/sap/ui/base/Metadata.js +3 -3
  78. package/src/sap/ui/base/Object.js +19 -1
  79. package/src/sap/ui/base/ObjectPool.js +1 -1
  80. package/src/sap/ui/core/.library +3 -3
  81. package/src/sap/ui/core/AnimationMode.js +2 -2
  82. package/src/sap/ui/core/AppCacheBuster.js +30 -18
  83. package/src/sap/ui/core/BusyIndicator.js +1 -1
  84. package/src/sap/ui/core/CalendarType.js +6 -0
  85. package/src/sap/ui/core/Component.js +175 -86
  86. package/src/sap/ui/core/ComponentContainer.js +6 -5
  87. package/src/sap/ui/core/ComponentMetadata.js +3 -4
  88. package/src/sap/ui/core/ComponentSupport.js +1 -1
  89. package/src/sap/ui/core/Configuration.js +395 -709
  90. package/src/sap/ui/core/Control.js +1 -1
  91. package/src/sap/ui/core/ControlBehavior.js +37 -28
  92. package/src/sap/ui/core/Core.js +338 -216
  93. package/src/sap/ui/core/CustomData.js +1 -1
  94. package/src/sap/ui/core/DeclarativeSupport.js +3 -1
  95. package/src/sap/ui/core/Element.js +24 -10
  96. package/src/sap/ui/core/ElementMetadata.js +1 -1
  97. package/src/sap/ui/core/EnabledPropagator.js +3 -2
  98. package/src/sap/ui/core/EventBus.js +1 -1
  99. package/src/sap/ui/core/Fragment.js +3 -3
  100. package/src/sap/ui/core/HTML.js +1 -1
  101. package/src/sap/ui/core/History.js +1 -1
  102. package/src/sap/ui/core/Icon.js +1 -1
  103. package/src/sap/ui/core/IndicationColorSupport.js +13 -1
  104. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  105. package/src/sap/ui/core/InvisibleMessage.js +2 -3
  106. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  107. package/src/sap/ui/core/InvisibleText.js +17 -1
  108. package/src/sap/ui/core/Item.js +1 -1
  109. package/src/sap/ui/core/LabelEnablement.js +8 -1
  110. package/src/sap/ui/core/LayoutData.js +1 -1
  111. package/src/sap/ui/core/Lib.js +253 -57
  112. package/src/sap/ui/core/ListItem.js +1 -1
  113. package/src/sap/ui/core/LocalBusyIndicator.js +1 -1
  114. package/src/sap/ui/core/Locale.js +1 -1
  115. package/src/sap/ui/core/LocaleData.js +118 -32
  116. package/src/sap/ui/core/Manifest.js +4 -2
  117. package/src/sap/ui/core/Message.js +1 -1
  118. package/src/sap/ui/core/Placeholder.js +18 -0
  119. package/src/sap/ui/core/Popup.js +5 -0
  120. package/src/sap/ui/core/RenderManager.js +21 -17
  121. package/src/sap/ui/core/Renderer.js +1 -1
  122. package/src/sap/ui/core/Rendering.js +51 -47
  123. package/src/sap/ui/core/ResizeHandler.js +2 -2
  124. package/src/sap/ui/core/ScrollBar.js +1 -1
  125. package/src/sap/ui/core/SeparatorItem.js +1 -1
  126. package/src/sap/ui/core/Shortcut.js +5 -3
  127. package/src/sap/ui/core/Supportability.js +146 -0
  128. package/src/sap/ui/core/Theming.js +130 -88
  129. package/src/sap/ui/core/Title.js +1 -1
  130. package/src/sap/ui/core/TooltipBase.js +4 -3
  131. package/src/sap/ui/core/UIArea.js +5 -4
  132. package/src/sap/ui/core/UIComponent.js +38 -12
  133. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  134. package/src/sap/ui/core/ValueStateSupport.js +1 -1
  135. package/src/sap/ui/core/VariantLayoutData.js +1 -1
  136. package/src/sap/ui/core/XMLComposite.js +1 -1
  137. package/src/sap/ui/core/XMLCompositeMetadata.js +1 -1
  138. package/src/sap/ui/core/XMLTemplateProcessor.js +3 -3
  139. package/src/sap/ui/core/_IconRegistry.js +13 -6
  140. package/src/sap/ui/core/cldr/ar.json +143 -137
  141. package/src/sap/ui/core/cldr/ar_EG.json +143 -137
  142. package/src/sap/ui/core/cldr/ar_SA.json +143 -137
  143. package/src/sap/ui/core/cldr/bg.json +423 -423
  144. package/src/sap/ui/core/cldr/ca.json +541 -494
  145. package/src/sap/ui/core/cldr/cs.json +475 -364
  146. package/src/sap/ui/core/cldr/cy.json +656 -477
  147. package/src/sap/ui/core/cldr/da.json +334 -275
  148. package/src/sap/ui/core/cldr/de.json +388 -291
  149. package/src/sap/ui/core/cldr/de_AT.json +388 -291
  150. package/src/sap/ui/core/cldr/de_CH.json +394 -297
  151. package/src/sap/ui/core/cldr/el.json +169 -166
  152. package/src/sap/ui/core/cldr/el_CY.json +169 -166
  153. package/src/sap/ui/core/cldr/en.json +558 -521
  154. package/src/sap/ui/core/cldr/en_AU.json +558 -520
  155. package/src/sap/ui/core/cldr/en_GB.json +476 -439
  156. package/src/sap/ui/core/cldr/en_HK.json +520 -482
  157. package/src/sap/ui/core/cldr/en_IE.json +486 -448
  158. package/src/sap/ui/core/cldr/en_IN.json +466 -428
  159. package/src/sap/ui/core/cldr/en_NZ.json +506 -468
  160. package/src/sap/ui/core/cldr/en_PG.json +506 -468
  161. package/src/sap/ui/core/cldr/en_SG.json +506 -468
  162. package/src/sap/ui/core/cldr/en_ZA.json +486 -448
  163. package/src/sap/ui/core/cldr/es.json +473 -468
  164. package/src/sap/ui/core/cldr/es_AR.json +445 -440
  165. package/src/sap/ui/core/cldr/es_BO.json +479 -474
  166. package/src/sap/ui/core/cldr/es_CL.json +469 -464
  167. package/src/sap/ui/core/cldr/es_CO.json +387 -381
  168. package/src/sap/ui/core/cldr/es_MX.json +502 -497
  169. package/src/sap/ui/core/cldr/es_PE.json +455 -450
  170. package/src/sap/ui/core/cldr/es_UY.json +479 -474
  171. package/src/sap/ui/core/cldr/es_VE.json +499 -494
  172. package/src/sap/ui/core/cldr/et.json +378 -320
  173. package/src/sap/ui/core/cldr/fa.json +104 -104
  174. package/src/sap/ui/core/cldr/fi.json +401 -315
  175. package/src/sap/ui/core/cldr/fr.json +391 -385
  176. package/src/sap/ui/core/cldr/fr_BE.json +391 -385
  177. package/src/sap/ui/core/cldr/fr_CA.json +499 -493
  178. package/src/sap/ui/core/cldr/fr_CH.json +334 -328
  179. package/src/sap/ui/core/cldr/fr_LU.json +391 -385
  180. package/src/sap/ui/core/cldr/he.json +291 -159
  181. package/src/sap/ui/core/cldr/hi.json +157 -128
  182. package/src/sap/ui/core/cldr/hr.json +514 -461
  183. package/src/sap/ui/core/cldr/hu.json +287 -257
  184. package/src/sap/ui/core/cldr/id.json +463 -416
  185. package/src/sap/ui/core/cldr/it.json +468 -413
  186. package/src/sap/ui/core/cldr/it_CH.json +468 -413
  187. package/src/sap/ui/core/cldr/ja.json +98 -61
  188. package/src/sap/ui/core/cldr/kk.json +631 -571
  189. package/src/sap/ui/core/cldr/ko.json +79 -71
  190. package/src/sap/ui/core/cldr/lt.json +361 -270
  191. package/src/sap/ui/core/cldr/lv.json +234 -242
  192. package/src/sap/ui/core/cldr/ms.json +463 -408
  193. package/src/sap/ui/core/cldr/nb.json +176 -143
  194. package/src/sap/ui/core/cldr/nl.json +463 -393
  195. package/src/sap/ui/core/cldr/nl_BE.json +463 -393
  196. package/src/sap/ui/core/cldr/pl.json +633 -344
  197. package/src/sap/ui/core/cldr/pt.json +447 -336
  198. package/src/sap/ui/core/cldr/pt_PT.json +488 -449
  199. package/src/sap/ui/core/cldr/ro.json +477 -383
  200. package/src/sap/ui/core/cldr/ru.json +367 -332
  201. package/src/sap/ui/core/cldr/ru_UA.json +361 -326
  202. package/src/sap/ui/core/cldr/sk.json +502 -537
  203. package/src/sap/ui/core/cldr/sl.json +168 -161
  204. package/src/sap/ui/core/cldr/sr.json +276 -225
  205. package/src/sap/ui/core/cldr/sr_Latn.json +972 -907
  206. package/src/sap/ui/core/cldr/sv.json +420 -346
  207. package/src/sap/ui/core/cldr/th.json +117 -94
  208. package/src/sap/ui/core/cldr/tr.json +413 -359
  209. package/src/sap/ui/core/cldr/uk.json +395 -368
  210. package/src/sap/ui/core/cldr/vi.json +392 -379
  211. package/src/sap/ui/core/cldr/zh_CN.json +91 -33
  212. package/src/sap/ui/core/cldr/zh_HK.json +90 -32
  213. package/src/sap/ui/core/cldr/zh_SG.json +90 -32
  214. package/src/sap/ui/core/cldr/zh_TW.json +75 -51
  215. package/src/sap/ui/core/date/CalendarWeekNumbering.js +6 -0
  216. package/src/sap/ui/core/date/Islamic.js +4 -4
  217. package/src/sap/ui/core/date/UI5Date.js +1 -1
  218. package/src/sap/ui/core/date/_Calendars.js +5 -2
  219. package/src/sap/ui/core/delegate/ItemNavigation.js +1 -1
  220. package/src/sap/ui/core/delegate/ScrollEnablement.js +1 -1
  221. package/src/sap/ui/core/dnd/DragAndDrop.js +3 -2
  222. package/src/sap/ui/core/dnd/DragDropBase.js +1 -1
  223. package/src/sap/ui/core/dnd/DragDropInfo.js +1 -1
  224. package/src/sap/ui/core/dnd/DragInfo.js +1 -1
  225. package/src/sap/ui/core/dnd/DropInfo.js +1 -1
  226. package/src/sap/ui/core/format/DateFormat.js +33 -21
  227. package/src/sap/ui/core/format/NumberFormat.js +3 -2
  228. package/src/sap/ui/core/format/TimezoneUtil.js +1 -1
  229. package/src/sap/ui/core/getCompatibilityVersion.js +2 -2
  230. package/src/sap/ui/core/hyphenation/Hyphenation.js +1 -1
  231. package/src/sap/ui/core/library.js +128 -8
  232. package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
  233. package/src/sap/ui/core/message/Message.js +2 -2
  234. package/src/sap/ui/core/message/MessageManager.js +1 -1
  235. package/src/sap/ui/core/message/MessageParser.js +1 -1
  236. package/src/sap/ui/core/message/MessageProcessor.js +1 -1
  237. package/src/sap/ui/core/message/MessageType.js +2 -1
  238. package/src/sap/ui/core/messagebundle.properties +24 -0
  239. package/src/sap/ui/core/messagebundle_ar.properties +15 -3
  240. package/src/sap/ui/core/messagebundle_bg.properties +14 -2
  241. package/src/sap/ui/core/messagebundle_ca.properties +13 -1
  242. package/src/sap/ui/core/messagebundle_cs.properties +15 -3
  243. package/src/sap/ui/core/messagebundle_cy.properties +16 -4
  244. package/src/sap/ui/core/messagebundle_da.properties +15 -3
  245. package/src/sap/ui/core/messagebundle_de.properties +15 -3
  246. package/src/sap/ui/core/messagebundle_el.properties +16 -4
  247. package/src/sap/ui/core/messagebundle_en.properties +12 -0
  248. package/src/sap/ui/core/messagebundle_en_GB.properties +16 -4
  249. package/src/sap/ui/core/messagebundle_es.properties +15 -3
  250. package/src/sap/ui/core/messagebundle_es_MX.properties +15 -3
  251. package/src/sap/ui/core/messagebundle_et.properties +15 -3
  252. package/src/sap/ui/core/messagebundle_fi.properties +15 -3
  253. package/src/sap/ui/core/messagebundle_fr.properties +15 -3
  254. package/src/sap/ui/core/messagebundle_fr_CA.properties +14 -2
  255. package/src/sap/ui/core/messagebundle_hi.properties +16 -4
  256. package/src/sap/ui/core/messagebundle_hr.properties +14 -2
  257. package/src/sap/ui/core/messagebundle_hu.properties +16 -4
  258. package/src/sap/ui/core/messagebundle_id.properties +15 -3
  259. package/src/sap/ui/core/messagebundle_it.properties +17 -5
  260. package/src/sap/ui/core/messagebundle_iw.properties +15 -3
  261. package/src/sap/ui/core/messagebundle_ja.properties +25 -13
  262. package/src/sap/ui/core/messagebundle_kk.properties +15 -3
  263. package/src/sap/ui/core/messagebundle_ko.properties +14 -2
  264. package/src/sap/ui/core/messagebundle_lt.properties +15 -3
  265. package/src/sap/ui/core/messagebundle_lv.properties +15 -3
  266. package/src/sap/ui/core/messagebundle_mk.properties +352 -0
  267. package/src/sap/ui/core/messagebundle_ms.properties +15 -3
  268. package/src/sap/ui/core/messagebundle_nl.properties +15 -3
  269. package/src/sap/ui/core/messagebundle_no.properties +14 -2
  270. package/src/sap/ui/core/messagebundle_pl.properties +15 -3
  271. package/src/sap/ui/core/messagebundle_pt.properties +15 -3
  272. package/src/sap/ui/core/messagebundle_pt_PT.properties +14 -2
  273. package/src/sap/ui/core/messagebundle_ro.properties +15 -3
  274. package/src/sap/ui/core/messagebundle_ru.properties +15 -3
  275. package/src/sap/ui/core/messagebundle_sh.properties +43 -31
  276. package/src/sap/ui/core/messagebundle_sk.properties +16 -4
  277. package/src/sap/ui/core/messagebundle_sl.properties +15 -3
  278. package/src/sap/ui/core/messagebundle_sv.properties +22 -10
  279. package/src/sap/ui/core/messagebundle_th.properties +15 -3
  280. package/src/sap/ui/core/messagebundle_tr.properties +15 -3
  281. package/src/sap/ui/core/messagebundle_uk.properties +18 -6
  282. package/src/sap/ui/core/messagebundle_vi.properties +18 -6
  283. package/src/sap/ui/core/messagebundle_zh_CN.properties +15 -3
  284. package/src/sap/ui/core/messagebundle_zh_TW.properties +15 -3
  285. package/src/sap/ui/core/mvc/Controller.js +22 -16
  286. package/src/sap/ui/core/mvc/ControllerExtensionProvider.js +1 -1
  287. package/src/sap/ui/core/mvc/EventHandlerResolver.js +5 -15
  288. package/src/sap/ui/core/mvc/HTMLView.js +2 -2
  289. package/src/sap/ui/core/mvc/JSONView.js +4 -1
  290. package/src/sap/ui/core/mvc/JSONViewRenderer.js +1 -0
  291. package/src/sap/ui/core/mvc/JSView.js +1 -1
  292. package/src/sap/ui/core/mvc/OverrideExecution.js +4 -4
  293. package/src/sap/ui/core/mvc/TemplateView.js +1 -1
  294. package/src/sap/ui/core/mvc/View.js +25 -15
  295. package/src/sap/ui/core/mvc/ViewType.js +2 -0
  296. package/src/sap/ui/core/mvc/XMLView.js +1 -1
  297. package/src/sap/ui/core/plugin/DeclarativeSupport.js +2 -1
  298. package/src/sap/ui/core/plugin/LessSupport.js +3 -1
  299. package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
  300. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  301. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  302. package/src/sap/ui/core/routing/Router.js +2 -4
  303. package/src/sap/ui/core/routing/Target.js +1 -3
  304. package/src/sap/ui/core/routing/Targets.js +2 -3
  305. package/src/sap/ui/core/routing/Views.js +2 -3
  306. package/src/sap/ui/core/routing/async/Target.js +1 -1
  307. package/src/sap/ui/core/rules/Config.support.js +11 -17
  308. package/src/sap/ui/core/search/OpenSearchProvider.js +2 -1
  309. package/src/sap/ui/core/search/SearchProvider.js +2 -1
  310. package/src/sap/ui/core/service/Service.js +1 -1
  311. package/src/sap/ui/core/service/ServiceFactory.js +1 -1
  312. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  313. package/src/sap/ui/core/support/Hotkeys.js +5 -3
  314. package/src/sap/ui/core/support/Plugin.js +1 -1
  315. package/src/sap/ui/core/support/RuleEngineOpaExtension.js +1 -3
  316. package/src/sap/ui/core/support/Support.js +3 -5
  317. package/src/sap/ui/core/support/ToolsAPI.js +15 -11
  318. package/src/sap/ui/core/support/plugins/ControlTree.js +2 -2
  319. package/src/sap/ui/core/support/plugins/Interaction.js +4 -4
  320. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  321. package/src/sap/ui/core/support/plugins/Performance.js +1 -1
  322. package/src/sap/ui/core/support/plugins/Selector.js +7 -5
  323. package/src/sap/ui/core/support/plugins/TechInfo.js +1 -1
  324. package/src/sap/ui/core/support/plugins/Trace.js +1 -1
  325. package/src/sap/ui/core/support/plugins/ViewInfo.js +1 -1
  326. package/src/sap/ui/core/support/techinfo/TechnicalInfo.js +3 -1
  327. package/src/sap/ui/core/syncStyleClass.js +2 -2
  328. package/src/sap/ui/core/themes/base/fonts/SAP-icons.ttf +0 -0
  329. package/src/sap/ui/core/themes/base/fonts/SAP-icons.woff2 +0 -0
  330. package/src/sap/ui/core/themes/base/global.less +9 -9
  331. package/src/sap/ui/core/theming/Parameters.js +18 -19
  332. package/src/sap/ui/core/theming/ThemeManager.js +23 -4
  333. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
  334. package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
  335. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
  336. package/src/sap/ui/core/tmpl/Template.js +1 -1
  337. package/src/sap/ui/core/tmpl/TemplateControl.js +1 -1
  338. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  339. package/src/sap/ui/core/util/Export.js +1 -1
  340. package/src/sap/ui/core/util/ExportCell.js +1 -1
  341. package/src/sap/ui/core/util/ExportColumn.js +1 -1
  342. package/src/sap/ui/core/util/ExportRow.js +1 -1
  343. package/src/sap/ui/core/util/ExportType.js +1 -1
  344. package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
  345. package/src/sap/ui/core/util/File.js +1 -1
  346. package/src/sap/ui/core/util/LibraryInfo.js +1 -1
  347. package/src/sap/ui/core/util/MockServer.js +1 -1
  348. package/src/sap/ui/core/util/PasteHelper.js +1 -1
  349. package/src/sap/ui/core/util/XMLPreprocessor.js +3 -0
  350. package/src/sap/ui/core/util/_LocalizationHelper.js +122 -0
  351. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  352. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  353. package/src/sap/ui/core/util/serializer/ViewSerializer.js +4 -4
  354. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  355. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  356. package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
  357. package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
  358. package/src/sap/ui/core/webc/WebComponent.js +1 -1
  359. package/src/sap/ui/core/webc/WebComponentMetadata.js +1 -1
  360. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  361. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  362. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  363. package/src/sap/ui/debug/ControlTree.js +1 -1
  364. package/src/sap/ui/debug/DebugEnv.js +29 -7
  365. package/src/sap/ui/debug/PropertyList.js +1 -1
  366. package/src/sap/ui/model/ClientListBinding.js +9 -4
  367. package/src/sap/ui/model/ClientModel.js +1 -1
  368. package/src/sap/ui/model/ClientTreeBinding.js +9 -4
  369. package/src/sap/ui/model/CompositeDataState.js +1 -1
  370. package/src/sap/ui/model/CompositeType.js +1 -1
  371. package/src/sap/ui/model/DataState.js +2 -2
  372. package/src/sap/ui/model/Filter.js +39 -1
  373. package/src/sap/ui/model/FilterProcessor.js +15 -5
  374. package/src/sap/ui/model/ListBinding.js +5 -0
  375. package/src/sap/ui/model/ManagedObjectBindingSupport.js +4 -4
  376. package/src/sap/ui/model/MetaModel.js +1 -1
  377. package/src/sap/ui/model/Model.js +14 -8
  378. package/src/sap/ui/model/SelectionModel.js +1 -1
  379. package/src/sap/ui/model/SimpleType.js +1 -1
  380. package/src/sap/ui/model/TreeAutoExpandMode.js +1 -1
  381. package/src/sap/ui/model/TreeBinding.js +3 -0
  382. package/src/sap/ui/model/Type.js +1 -1
  383. package/src/sap/ui/model/analytics/AnalyticalBinding.js +3 -1
  384. package/src/sap/ui/model/json/JSONListBinding.js +3 -1
  385. package/src/sap/ui/model/json/JSONModel.js +1 -1
  386. package/src/sap/ui/model/json/JSONTreeBinding.js +3 -2
  387. package/src/sap/ui/model/message/MessageListBinding.js +3 -0
  388. package/src/sap/ui/model/message/MessageModel.js +1 -1
  389. package/src/sap/ui/model/odata/AnnotationHelper.js +9 -3
  390. package/src/sap/ui/model/odata/ODataAnnotations.js +1 -1
  391. package/src/sap/ui/model/odata/ODataListBinding.js +8 -2
  392. package/src/sap/ui/model/odata/ODataMessageParser.js +1 -1
  393. package/src/sap/ui/model/odata/ODataMetaModel.js +1 -1
  394. package/src/sap/ui/model/odata/ODataMetadata.js +1 -1
  395. package/src/sap/ui/model/odata/ODataModel.js +9 -5
  396. package/src/sap/ui/model/odata/ODataPropertyBinding.js +1 -2
  397. package/src/sap/ui/model/odata/ODataTreeBinding.js +2 -0
  398. package/src/sap/ui/model/odata/ODataTreeBindingFlat.js +9 -14
  399. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  400. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  401. package/src/sap/ui/model/odata/type/Currency.js +1 -1
  402. package/src/sap/ui/model/odata/type/Date.js +1 -1
  403. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  404. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  405. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  406. package/src/sap/ui/model/odata/type/DateTimeWithTimezone.js +1 -1
  407. package/src/sap/ui/model/odata/type/Decimal.js +1 -1
  408. package/src/sap/ui/model/odata/type/Double.js +1 -1
  409. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  410. package/src/sap/ui/model/odata/type/Int.js +1 -1
  411. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  412. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  413. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  414. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  415. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  416. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  417. package/src/sap/ui/model/odata/type/Single.js +1 -1
  418. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  419. package/src/sap/ui/model/odata/type/String.js +1 -1
  420. package/src/sap/ui/model/odata/type/Time.js +1 -1
  421. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  422. package/src/sap/ui/model/odata/type/Unit.js +1 -1
  423. package/src/sap/ui/model/odata/v2/Context.js +1 -1
  424. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +1 -1
  425. package/src/sap/ui/model/odata/v2/ODataListBinding.js +40 -15
  426. package/src/sap/ui/model/odata/v2/ODataModel.js +26 -62
  427. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +38 -4
  428. package/src/sap/ui/model/odata/v4/Context.js +81 -7
  429. package/src/sap/ui/model/odata/v4/ODataBinding.js +3 -0
  430. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +1 -1
  431. package/src/sap/ui/model/odata/v4/ODataListBinding.js +217 -75
  432. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +2 -2
  433. package/src/sap/ui/model/odata/v4/ODataModel.js +6 -6
  434. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +1 -1
  435. package/src/sap/ui/model/odata/v4/lib/_AggregationCache.js +406 -199
  436. package/src/sap/ui/model/odata/v4/lib/_AggregationHelper.js +12 -7
  437. package/src/sap/ui/model/odata/v4/lib/_Cache.js +53 -30
  438. package/src/sap/ui/model/odata/v4/lib/_Helper.js +6 -4
  439. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +6 -6
  440. package/src/sap/ui/model/resource/ResourceModel.js +5 -6
  441. package/src/sap/ui/model/type/Boolean.js +1 -1
  442. package/src/sap/ui/model/type/Currency.js +1 -1
  443. package/src/sap/ui/model/type/Date.js +1 -1
  444. package/src/sap/ui/model/type/DateInterval.js +1 -1
  445. package/src/sap/ui/model/type/DateTime.js +1 -1
  446. package/src/sap/ui/model/type/DateTimeInterval.js +1 -1
  447. package/src/sap/ui/model/type/FileSize.js +1 -1
  448. package/src/sap/ui/model/type/Float.js +1 -1
  449. package/src/sap/ui/model/type/Integer.js +1 -1
  450. package/src/sap/ui/model/type/String.js +1 -1
  451. package/src/sap/ui/model/type/Time.js +1 -1
  452. package/src/sap/ui/model/type/TimeInterval.js +1 -1
  453. package/src/sap/ui/model/type/Unit.js +1 -1
  454. package/src/sap/ui/model/xml/XMLListBinding.js +3 -0
  455. package/src/sap/ui/model/xml/XMLModel.js +1 -1
  456. package/src/sap/ui/model/xml/XMLTreeBinding.js +3 -0
  457. package/src/sap/ui/performance/BeaconRequest.js +2 -2
  458. package/src/sap/ui/performance/trace/Interaction.js +20 -16
  459. package/src/sap/ui/qunit/QUnitUtils.js +64 -45
  460. package/src/sap/ui/qunit/qunit-coverage.js +6 -0
  461. package/src/sap/ui/qunit/utils/ControlIterator.js +31 -1
  462. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +1 -1
  463. package/src/sap/ui/security/Security.js +128 -0
  464. package/src/sap/ui/test/BlanketReporter.js +2 -3
  465. package/src/sap/ui/test/BlanketReporterUI.view.xml +1 -1
  466. package/src/sap/ui/test/BranchTracking.js +2 -3
  467. package/src/sap/ui/test/ModuleTracking.js +48 -20
  468. package/src/sap/ui/test/OpaExtension.js +3 -3
  469. package/src/sap/ui/test/OpaPlugin.js +16 -6
  470. package/src/sap/ui/test/TestUtils.js +7 -4
  471. package/src/sap/ui/test/_BrowserLogCollector.js +1 -0
  472. package/src/sap/ui/test/_ControlFinder.js +3 -2
  473. package/src/sap/ui/test/_LogCollector.js +1 -0
  474. package/src/sap/ui/test/_UsageReport.js +115 -114
  475. package/src/sap/ui/test/actions/EnterText.js +24 -2
  476. package/src/sap/ui/test/autowaiter/WaiterBase.js +1 -0
  477. package/src/sap/ui/test/autowaiter/_moduleWaiter.js +1 -2
  478. package/src/sap/ui/test/autowaiter/_timeoutWaiter.js +1 -1
  479. package/src/sap/ui/test/generic/GenericTestCollection.js +5 -0
  480. package/src/sap/ui/test/generic/TestBase.js +1 -1
  481. package/src/sap/ui/test/generic/Utils.js +1 -1
  482. package/src/sap/ui/test/matchers/LabelFor.js +2 -12
  483. package/src/sap/ui/test/matchers/Matcher.js +1 -1
  484. package/src/sap/ui/test/pipelines/PipelineFactory.js +1 -0
  485. package/src/sap/ui/test/selectors/_Selector.js +1 -1
  486. package/src/sap/ui/util/Storage.js +1 -1
  487. package/src/ui5loader-autoconfig.js +84 -11
  488. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/manifest.json +3 -10
  489. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/package.json +13 -0
  490. package/test/sap/ui/core/demokit/sample/MessageManager/ODataBackendMessagesComp/ui5.yaml +11 -0
  491. package/test/sap/ui/core/demokit/sample/RoutingNestedComponent/localService/mockserver.js +3 -4
  492. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/ChartAnnotation.fragment.xml +7 -7
  493. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/Component.js +2 -3
  494. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/Detail.view.xml +12 -13
  495. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/Facets.fragment.xml +4 -4
  496. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/Field.fragment.xml +8 -8
  497. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/FormFacet.fragment.xml +3 -5
  498. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/LabeledField.fragment.xml +3 -3
  499. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/Table.fragment.xml +10 -10
  500. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/TableFacet.fragment.xml +3 -3
  501. package/test/sap/ui/core/demokit/sample/ViewTemplate/scenario/extension/HeaderInfo.fragment.xml +1 -1
  502. package/test/sap/ui/core/demokit/sample/ViewTemplate/tiny/Field.fragment.xml +2 -2
  503. package/test/sap/ui/core/demokit/sample/ViewTemplate/tiny/Template.view.xml +19 -21
  504. package/test/sap/ui/core/demokit/sample/ViewTemplate/types/TemplateV4.view.xml +2 -2
  505. package/test/sap/ui/core/demokit/sample/ViewTemplate/valuelist/Component.js +2 -3
  506. package/test/sap/ui/core/demokit/sample/common/SandboxModelHelper.js +2 -3
  507. package/test/sap/ui/core/demokit/sample/common/ValueHelp.js +2 -3
  508. package/test/sap/ui/core/demokit/sample/common/pages/Any.js +7 -8
  509. package/test/sap/ui/core/demokit/sample/matcher/BindingPath/manifest.json +3 -11
  510. package/test/sap/ui/core/demokit/sample/matcher/BindingPath/package.json +13 -0
  511. package/test/sap/ui/core/demokit/sample/matcher/BindingPath/ui5.yaml +11 -0
  512. package/test/sap/ui/core/demokit/sample/matcher/Descendant/Component.js +1 -1
  513. package/test/sap/ui/core/demokit/sample/matcher/Descendant/manifest.json +3 -11
  514. package/test/sap/ui/core/demokit/sample/matcher/Descendant/package.json +13 -0
  515. package/test/sap/ui/core/demokit/sample/matcher/Descendant/ui5.yaml +11 -0
  516. package/test/sap/ui/core/demokit/sample/matcher/I18NText/manifest.json +3 -11
  517. package/test/sap/ui/core/demokit/sample/matcher/I18NText/package.json +13 -0
  518. package/test/sap/ui/core/demokit/sample/matcher/I18NText/ui5.yaml +11 -0
  519. package/test/sap/ui/core/demokit/sample/matcher/LabelFor/manifest.json +3 -11
  520. package/test/sap/ui/core/demokit/sample/matcher/LabelFor/package.json +13 -0
  521. package/test/sap/ui/core/demokit/sample/matcher/LabelFor/ui5.yaml +11 -0
  522. package/test/sap/ui/core/demokit/sample/odata/v4/Ancestry/Main.controller.js +15 -6
  523. package/test/sap/ui/core/demokit/sample/odata/v4/DataAggregation/DataAggregation.controller.js +2 -3
  524. package/test/sap/ui/core/demokit/sample/odata/v4/FlatDataAggregation/FlatDataAggregation.controller.js +3 -4
  525. package/test/sap/ui/core/demokit/sample/odata/v4/HierarchyBindAction/Main.controller.js +39 -16
  526. package/test/sap/ui/core/demokit/sample/odata/v4/HierarchyBindAction/Main.view.xml +18 -21
  527. package/test/sap/ui/core/demokit/sample/odata/v4/HierarchyBindAction/data/all.json +509 -395
  528. package/test/sap/ui/core/demokit/sample/odata/v4/HierarchyBindAction/data/metadata.xml +586 -422
  529. package/test/sap/ui/core/demokit/sample/odata/v4/HierarchyBindAction/manifest.json +1 -1
  530. package/test/sap/ui/core/demokit/sample/odata/v4/LateProperties/Main.controller.js +2 -3
  531. package/test/sap/ui/core/demokit/sample/odata/v4/ListBindingTemplate/Facets.fragment.xml +22 -23
  532. package/test/sap/ui/core/demokit/sample/odata/v4/ListBindingTemplate/FormattedText.fragment.xml +2 -3
  533. package/test/sap/ui/core/demokit/sample/odata/v4/ListBindingTemplate/Main.view.xml +7 -7
  534. package/test/sap/ui/core/demokit/sample/odata/v4/MultipleInlineCreationRowsGrid/Main.controller.js +0 -3
  535. package/test/sap/ui/core/demokit/sample/odata/v4/RecursiveHierarchy/RecursiveHierarchy.controller.js +54 -9
  536. package/test/sap/ui/core/demokit/sample/odata/v4/RecursiveHierarchy/RecursiveHierarchy.view.xml +34 -9
  537. package/test/sap/ui/core/demokit/sample/odata/v4/RecursiveHierarchy/SandboxModel.js +156 -23
  538. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrders/Main.view.xml +3 -2
  539. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrdersTemplate/Facets.fragment.xml +22 -23
  540. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrdersTemplate/FormattedText.fragment.xml +2 -3
  541. package/test/sap/ui/core/demokit/sample/odata/v4/SalesOrdersTemplate/Main.view.xml +5 -5
  542. package/test/sap/ui/core/demokit/sample/odata/v4/ServerDrivenPaging/Main.controller.js +2 -3
  543. package/test/sap/ui/core/demokit/tutorial/databinding/01/Component.js +9 -25
  544. package/test/sap/ui/core/demokit/tutorial/databinding/01/manifest.json +20 -0
  545. package/test/sap/ui/core/demokit/tutorial/databinding/01/ui5.yaml +2 -2
  546. package/test/sap/ui/core/demokit/tutorial/databinding/01/webapp/manifest.json +5 -0
  547. package/test/sap/ui/core/demokit/tutorial/databinding/02/Component.js +9 -25
  548. package/test/sap/ui/core/demokit/tutorial/databinding/02/manifest.json +20 -0
  549. package/test/sap/ui/core/demokit/tutorial/databinding/02/ui5.yaml +2 -2
  550. package/test/sap/ui/core/demokit/tutorial/databinding/02/webapp/manifest.json +5 -0
  551. package/test/sap/ui/core/demokit/tutorial/databinding/03/Component.js +9 -25
  552. package/test/sap/ui/core/demokit/tutorial/databinding/03/manifest.json +20 -0
  553. package/test/sap/ui/core/demokit/tutorial/databinding/03/ui5.yaml +2 -2
  554. package/test/sap/ui/core/demokit/tutorial/databinding/03/webapp/manifest.json +5 -0
  555. package/test/sap/ui/core/demokit/tutorial/databinding/04/Component.js +9 -26
  556. package/test/sap/ui/core/demokit/tutorial/databinding/04/manifest.json +21 -0
  557. package/test/sap/ui/core/demokit/tutorial/databinding/04/ui5.yaml +2 -2
  558. package/test/sap/ui/core/demokit/tutorial/databinding/04/webapp/manifest.json +5 -0
  559. package/test/sap/ui/core/demokit/tutorial/databinding/05/Component.js +9 -26
  560. package/test/sap/ui/core/demokit/tutorial/databinding/05/manifest.json +21 -0
  561. package/test/sap/ui/core/demokit/tutorial/databinding/05/ui5.yaml +2 -2
  562. package/test/sap/ui/core/demokit/tutorial/databinding/05/webapp/manifest.json +5 -0
  563. package/test/sap/ui/core/demokit/tutorial/databinding/06/Component.js +9 -27
  564. package/test/sap/ui/core/demokit/tutorial/databinding/06/manifest.json +22 -0
  565. package/test/sap/ui/core/demokit/tutorial/databinding/06/ui5.yaml +2 -2
  566. package/test/sap/ui/core/demokit/tutorial/databinding/06/webapp/manifest.json +5 -0
  567. package/test/sap/ui/core/demokit/tutorial/databinding/07/Component.js +9 -28
  568. package/test/sap/ui/core/demokit/tutorial/databinding/07/manifest.json +23 -0
  569. package/test/sap/ui/core/demokit/tutorial/databinding/07/ui5.yaml +2 -2
  570. package/test/sap/ui/core/demokit/tutorial/databinding/07/webapp/manifest.json +5 -0
  571. package/test/sap/ui/core/demokit/tutorial/databinding/08/Component.js +9 -28
  572. package/test/sap/ui/core/demokit/tutorial/databinding/08/manifest.json +23 -0
  573. package/test/sap/ui/core/demokit/tutorial/databinding/08/ui5.yaml +2 -2
  574. package/test/sap/ui/core/demokit/tutorial/databinding/08/webapp/manifest.json +5 -0
  575. package/test/sap/ui/core/demokit/tutorial/databinding/09/Component.js +9 -29
  576. package/test/sap/ui/core/demokit/tutorial/databinding/09/manifest.json +24 -0
  577. package/test/sap/ui/core/demokit/tutorial/databinding/09/ui5.yaml +2 -2
  578. package/test/sap/ui/core/demokit/tutorial/databinding/09/webapp/manifest.json +5 -0
  579. package/test/sap/ui/core/demokit/tutorial/databinding/10/Component.js +9 -29
  580. package/test/sap/ui/core/demokit/tutorial/databinding/10/manifest.json +24 -0
  581. package/test/sap/ui/core/demokit/tutorial/databinding/10/ui5.yaml +2 -2
  582. package/test/sap/ui/core/demokit/tutorial/databinding/10/webapp/manifest.json +5 -0
  583. package/test/sap/ui/core/demokit/tutorial/databinding/11/Component.js +9 -29
  584. package/test/sap/ui/core/demokit/tutorial/databinding/11/manifest.json +24 -0
  585. package/test/sap/ui/core/demokit/tutorial/databinding/11/ui5.yaml +2 -2
  586. package/test/sap/ui/core/demokit/tutorial/databinding/11/webapp/manifest.json +5 -0
  587. package/test/sap/ui/core/demokit/tutorial/databinding/12/Component.js +9 -30
  588. package/test/sap/ui/core/demokit/tutorial/databinding/12/manifest.json +25 -0
  589. package/test/sap/ui/core/demokit/tutorial/databinding/12/ui5.yaml +2 -2
  590. package/test/sap/ui/core/demokit/tutorial/databinding/12/webapp/manifest.json +5 -0
  591. package/test/sap/ui/core/demokit/tutorial/databinding/13/Component.js +9 -30
  592. package/test/sap/ui/core/demokit/tutorial/databinding/13/manifest.json +25 -0
  593. package/test/sap/ui/core/demokit/tutorial/databinding/13/ui5.yaml +2 -2
  594. package/test/sap/ui/core/demokit/tutorial/databinding/13/webapp/manifest.json +5 -0
  595. package/test/sap/ui/core/demokit/tutorial/databinding/14/Component.js +9 -30
  596. package/test/sap/ui/core/demokit/tutorial/databinding/14/manifest.json +25 -0
  597. package/test/sap/ui/core/demokit/tutorial/databinding/14/ui5.yaml +2 -2
  598. package/test/sap/ui/core/demokit/tutorial/databinding/14/webapp/manifest.json +5 -0
  599. package/test/sap/ui/core/demokit/tutorial/databinding/15/Component.js +9 -32
  600. package/test/sap/ui/core/demokit/tutorial/databinding/15/manifest.json +27 -0
  601. package/test/sap/ui/core/demokit/tutorial/databinding/15/ui5.yaml +2 -2
  602. package/test/sap/ui/core/demokit/tutorial/databinding/15/webapp/manifest.json +5 -0
  603. package/test/sap/ui/core/demokit/tutorial/mockserver/01/Component.js +9 -30
  604. package/test/sap/ui/core/demokit/tutorial/mockserver/01/manifest.json +24 -0
  605. package/test/sap/ui/core/demokit/tutorial/mockserver/01/ui5.yaml +2 -2
  606. package/test/sap/ui/core/demokit/tutorial/mockserver/02/Component.js +9 -33
  607. package/test/sap/ui/core/demokit/tutorial/mockserver/02/manifest.json +27 -0
  608. package/test/sap/ui/core/demokit/tutorial/mockserver/02/ui5.yaml +2 -2
  609. package/test/sap/ui/core/demokit/tutorial/mockserver/03/Component.js +9 -33
  610. package/test/sap/ui/core/demokit/tutorial/mockserver/03/manifest.json +27 -0
  611. package/test/sap/ui/core/demokit/tutorial/mockserver/03/ui5.yaml +2 -2
  612. package/test/sap/ui/core/demokit/tutorial/mockserver/04/Component.js +9 -33
  613. package/test/sap/ui/core/demokit/tutorial/mockserver/04/manifest.json +27 -0
  614. package/test/sap/ui/core/demokit/tutorial/mockserver/04/ui5.yaml +2 -2
  615. package/test/sap/ui/core/demokit/tutorial/navigation/01/Component.js +9 -33
  616. package/test/sap/ui/core/demokit/tutorial/navigation/01/manifest.json +28 -0
  617. package/test/sap/ui/core/demokit/tutorial/navigation/01/ui5.yaml +2 -2
  618. package/test/sap/ui/core/demokit/tutorial/navigation/02/Component.js +9 -35
  619. package/test/sap/ui/core/demokit/tutorial/navigation/02/manifest.json +30 -0
  620. package/test/sap/ui/core/demokit/tutorial/navigation/02/ui5.yaml +2 -2
  621. package/test/sap/ui/core/demokit/tutorial/navigation/03/Component.js +9 -37
  622. package/test/sap/ui/core/demokit/tutorial/navigation/03/manifest.json +32 -0
  623. package/test/sap/ui/core/demokit/tutorial/navigation/03/ui5.yaml +2 -2
  624. package/test/sap/ui/core/demokit/tutorial/navigation/04/Component.js +9 -38
  625. package/test/sap/ui/core/demokit/tutorial/navigation/04/manifest.json +33 -0
  626. package/test/sap/ui/core/demokit/tutorial/navigation/04/ui5.yaml +2 -2
  627. package/test/sap/ui/core/demokit/tutorial/navigation/05/Component.js +9 -38
  628. package/test/sap/ui/core/demokit/tutorial/navigation/05/manifest.json +33 -0
  629. package/test/sap/ui/core/demokit/tutorial/navigation/05/ui5.yaml +2 -2
  630. package/test/sap/ui/core/demokit/tutorial/navigation/06/Component.js +9 -40
  631. package/test/sap/ui/core/demokit/tutorial/navigation/06/manifest.json +35 -0
  632. package/test/sap/ui/core/demokit/tutorial/navigation/06/ui5.yaml +2 -2
  633. package/test/sap/ui/core/demokit/tutorial/navigation/07/Component.js +9 -42
  634. package/test/sap/ui/core/demokit/tutorial/navigation/07/manifest.json +37 -0
  635. package/test/sap/ui/core/demokit/tutorial/navigation/07/ui5.yaml +2 -2
  636. package/test/sap/ui/core/demokit/tutorial/navigation/08/Component.js +9 -45
  637. package/test/sap/ui/core/demokit/tutorial/navigation/08/manifest.json +40 -0
  638. package/test/sap/ui/core/demokit/tutorial/navigation/08/ui5.yaml +2 -2
  639. package/test/sap/ui/core/demokit/tutorial/navigation/09/Component.js +9 -45
  640. package/test/sap/ui/core/demokit/tutorial/navigation/09/manifest.json +40 -0
  641. package/test/sap/ui/core/demokit/tutorial/navigation/09/ui5.yaml +2 -2
  642. package/test/sap/ui/core/demokit/tutorial/navigation/10/Component.js +9 -47
  643. package/test/sap/ui/core/demokit/tutorial/navigation/10/manifest.json +42 -0
  644. package/test/sap/ui/core/demokit/tutorial/navigation/10/ui5.yaml +2 -2
  645. package/test/sap/ui/core/demokit/tutorial/navigation/11/Component.js +9 -52
  646. package/test/sap/ui/core/demokit/tutorial/navigation/11/manifest.json +47 -0
  647. package/test/sap/ui/core/demokit/tutorial/navigation/11/ui5.yaml +2 -2
  648. package/test/sap/ui/core/demokit/tutorial/navigation/12/Component.js +9 -52
  649. package/test/sap/ui/core/demokit/tutorial/navigation/12/manifest.json +47 -0
  650. package/test/sap/ui/core/demokit/tutorial/navigation/12/ui5.yaml +2 -2
  651. package/test/sap/ui/core/demokit/tutorial/navigation/13/Component.js +9 -52
  652. package/test/sap/ui/core/demokit/tutorial/navigation/13/manifest.json +47 -0
  653. package/test/sap/ui/core/demokit/tutorial/navigation/13/ui5.yaml +2 -2
  654. package/test/sap/ui/core/demokit/tutorial/navigation/14/Component.js +9 -52
  655. package/test/sap/ui/core/demokit/tutorial/navigation/14/manifest.json +47 -0
  656. package/test/sap/ui/core/demokit/tutorial/navigation/14/ui5.yaml +2 -2
  657. package/test/sap/ui/core/demokit/tutorial/navigation/15/Component.js +9 -52
  658. package/test/sap/ui/core/demokit/tutorial/navigation/15/manifest.json +47 -0
  659. package/test/sap/ui/core/demokit/tutorial/navigation/15/ui5.yaml +2 -2
  660. package/test/sap/ui/core/demokit/tutorial/navigation/16/Component.js +9 -52
  661. package/test/sap/ui/core/demokit/tutorial/navigation/16/manifest.json +47 -0
  662. package/test/sap/ui/core/demokit/tutorial/navigation/16/ui5.yaml +2 -2
  663. package/test/sap/ui/core/demokit/tutorial/navigation/17/Component.js +9 -52
  664. package/test/sap/ui/core/demokit/tutorial/navigation/17/manifest.json +47 -0
  665. package/test/sap/ui/core/demokit/tutorial/navigation/17/ui5.yaml +2 -2
  666. package/test/sap/ui/core/demokit/tutorial/odatav4/01/Component.js +3 -27
  667. package/test/sap/ui/core/demokit/tutorial/odatav4/01/manifest.json +28 -0
  668. package/test/sap/ui/core/demokit/tutorial/odatav4/01/ui5.yaml +2 -2
  669. package/test/sap/ui/core/demokit/tutorial/odatav4/02/Component.js +3 -27
  670. package/test/sap/ui/core/demokit/tutorial/odatav4/02/manifest.json +28 -0
  671. package/test/sap/ui/core/demokit/tutorial/odatav4/02/ui5.yaml +2 -2
  672. package/test/sap/ui/core/demokit/tutorial/odatav4/03/Component.js +3 -27
  673. package/test/sap/ui/core/demokit/tutorial/odatav4/03/manifest.json +28 -0
  674. package/test/sap/ui/core/demokit/tutorial/odatav4/03/ui5.yaml +2 -2
  675. package/test/sap/ui/core/demokit/tutorial/odatav4/04/Component.js +3 -27
  676. package/test/sap/ui/core/demokit/tutorial/odatav4/04/manifest.json +28 -0
  677. package/test/sap/ui/core/demokit/tutorial/odatav4/04/ui5.yaml +2 -2
  678. package/test/sap/ui/core/demokit/tutorial/odatav4/05/Component.js +3 -27
  679. package/test/sap/ui/core/demokit/tutorial/odatav4/05/manifest.json +28 -0
  680. package/test/sap/ui/core/demokit/tutorial/odatav4/05/ui5.yaml +2 -2
  681. package/test/sap/ui/core/demokit/tutorial/odatav4/06/Component.js +3 -27
  682. package/test/sap/ui/core/demokit/tutorial/odatav4/06/manifest.json +28 -0
  683. package/test/sap/ui/core/demokit/tutorial/odatav4/06/ui5.yaml +2 -2
  684. package/test/sap/ui/core/demokit/tutorial/odatav4/07/Component.js +3 -27
  685. package/test/sap/ui/core/demokit/tutorial/odatav4/07/manifest.json +28 -0
  686. package/test/sap/ui/core/demokit/tutorial/odatav4/07/ui5.yaml +2 -2
  687. package/test/sap/ui/core/demokit/tutorial/odatav4/08/Component.js +3 -27
  688. package/test/sap/ui/core/demokit/tutorial/odatav4/08/manifest.json +28 -0
  689. package/test/sap/ui/core/demokit/tutorial/odatav4/08/ui5.yaml +2 -2
  690. package/test/sap/ui/core/demokit/tutorial/odatav4/09/Component.js +3 -27
  691. package/test/sap/ui/core/demokit/tutorial/odatav4/09/manifest.json +28 -0
  692. package/test/sap/ui/core/demokit/tutorial/odatav4/09/ui5.yaml +2 -2
  693. package/test/sap/ui/core/demokit/tutorial/odatav4/10/Component.js +3 -27
  694. package/test/sap/ui/core/demokit/tutorial/odatav4/10/manifest.json +28 -0
  695. package/test/sap/ui/core/demokit/tutorial/odatav4/10/ui5.yaml +2 -2
  696. package/test/sap/ui/core/demokit/tutorial/odatav4/11/Component.js +3 -27
  697. package/test/sap/ui/core/demokit/tutorial/odatav4/11/manifest.json +28 -0
  698. package/test/sap/ui/core/demokit/tutorial/odatav4/11/ui5.yaml +2 -2
  699. package/test/sap/ui/core/demokit/tutorial/troubleshooting/01/Component.js +9 -29
  700. package/test/sap/ui/core/demokit/tutorial/troubleshooting/01/manifest.json +25 -0
  701. package/test/sap/ui/core/demokit/tutorial/troubleshooting/01/ui5.yaml +2 -2
  702. package/test/sap/ui/core/internal/samples/odata/v2/SalesOrders/Component.js +2 -3
  703. package/test/sap/ui/core/internal/samples/odata/v2/SalesOrders/Main.view.xml +1 -1
  704. package/test/sap/ui/core/internal/samples/odata/v2/SalesOrders/SandboxModel.js +2 -3
  705. package/test/sap/ui/core/qunit/ClientModel.qunit.js +28 -28
  706. package/test/sap/ui/core/qunit/CompositeBinding.qunit.js +18 -0
  707. package/test/sap/ui/core/qunit/ControlRenderer.qunit.js +4 -3
  708. package/test/sap/ui/core/qunit/Core.qunit.js +5 -14
  709. package/test/sap/ui/core/qunit/Core_libraryPreloadFiles.qunit.js +4 -4
  710. package/test/sap/ui/core/qunit/Core_libraryPreloadFiles_unavoidablyUsingEval.qunit.js +6 -6
  711. package/test/sap/ui/core/qunit/Core_unavoidablyUsingEval.qunit.js +31 -30
  712. package/test/sap/ui/core/qunit/DataState.qunit.js +7 -4
  713. package/test/sap/ui/core/qunit/DuplicateIds.qunit.js +3 -0
  714. package/test/sap/ui/core/qunit/DuplicateIds_noError.qunit.js +4 -0
  715. package/test/sap/ui/core/qunit/Element_metadata_renderer.qunit.js +6 -0
  716. package/test/sap/ui/core/qunit/ExpressionParser.qunit.js +144 -85
  717. package/test/sap/ui/core/qunit/HTML.qunit.js +87 -84
  718. package/test/sap/ui/core/qunit/InvisibleText.qunit.js +22 -1
  719. package/test/sap/ui/core/qunit/LRUPersistentCache.qunit.js +4 -4
  720. package/test/sap/ui/core/qunit/Lib.qunit.js +64 -1
  721. package/test/sap/ui/core/qunit/ListBinding.qunit.js +14 -1
  722. package/test/sap/ui/core/qunit/ManagedObject.qunit.js +90 -4
  723. package/test/sap/ui/core/qunit/ManagedObjectMetadata.qunit.js +41 -40
  724. package/test/sap/ui/core/qunit/ManagedObjectModel.qunit.js +2 -1
  725. package/test/sap/ui/core/qunit/{ManagedObject_noBoot.qunit.js → ManagedObject_BindingParser.qunit.js} +10 -9
  726. package/test/sap/ui/core/qunit/Object.qunit.js +36 -0
  727. package/test/sap/ui/core/qunit/RenderManager.qunit.js +86 -94
  728. package/test/sap/ui/core/qunit/ShortcutHints.qunit.js +11 -97
  729. package/test/sap/ui/core/qunit/StaticBinding.qunit.js +3 -0
  730. package/test/sap/ui/core/qunit/UIArea.qunit.js +34 -35
  731. package/test/sap/ui/core/qunit/analytics/AnalyticalTreeBindingAdapter.qunit.js +3 -0
  732. package/test/sap/ui/core/qunit/analytics/ODataModelAdapter.qunit.js +3 -0
  733. package/test/sap/ui/core/qunit/analytics/odata4analytics.qunit.js +3 -0
  734. package/test/sap/ui/core/qunit/app/DesignMode_controllerDeactivated.qunit.js +5 -6
  735. package/test/sap/ui/core/qunit/app/DesignMode_suppressedDeactivation.qunit.js +5 -6
  736. package/test/sap/ui/core/qunit/app/MessageListBinding.qunit.js +3 -0
  737. package/test/sap/ui/core/qunit/app/_createDesignModeTests_legacyAPIs.qunit.js +8 -10
  738. package/test/sap/ui/core/qunit/base/Config_cascade.qunit.js +2 -2
  739. package/test/sap/ui/core/qunit/base/i18n/Formatting.qunit.js +49 -30
  740. package/test/sap/ui/core/qunit/base/i18n/ResourceBundle.qunit.js +123 -10
  741. package/test/sap/ui/core/qunit/base/util/resolveReference.qunit.js +9 -0
  742. package/test/sap/ui/core/qunit/base/util/testdata/MyModule.js +5 -0
  743. package/test/sap/ui/core/qunit/bootstrap/BootstrapCustomBootTaskPreloadCss.beforeBootstrap.qunit.js +4 -2
  744. package/test/sap/ui/core/qunit/bootstrap/BootstrapMinimal.qunit.html +1 -0
  745. package/test/sap/ui/core/qunit/bootstrap/BootstrapPreload.qunit.js +9 -10
  746. package/test/sap/ui/core/qunit/bootstrap/BootstrapPreload_legacyAPIs.qunit.js +0 -2
  747. package/test/sap/ui/core/qunit/bootstrap/BootstrapWithinBody.qunit.html +2 -1
  748. package/test/sap/ui/core/qunit/bootstrap/BootstrapWithinHead.qunit.html +2 -1
  749. package/test/sap/ui/core/qunit/bootstrap/Configuration.qunit.js +122 -266
  750. package/test/sap/ui/core/qunit/bootstrap/ConfigurationFlexibility_LibConfigured.qunit.html +22 -0
  751. package/test/sap/ui/core/qunit/bootstrap/ConfigurationFlexibility_LibConfigured.qunit.js +22 -0
  752. package/test/sap/ui/core/qunit/bootstrap/ConfigurationFlexibility_LibLoaded.qunit.html +22 -0
  753. package/test/sap/ui/core/qunit/bootstrap/ConfigurationFlexibility_LibLoaded.qunit.js +16 -0
  754. package/test/sap/ui/core/qunit/bootstrap/ConfigurationFlexibility_LibNotLoaded.qunit.html +22 -0
  755. package/test/sap/ui/core/qunit/bootstrap/ConfigurationFlexibility_LibNotLoaded.qunit.js +14 -0
  756. package/test/sap/ui/core/qunit/bootstrap/ControlBehavior.qunit.js +110 -0
  757. package/test/sap/ui/core/qunit/bootstrap/PreloadCfg.qunit.js +4 -3
  758. package/test/sap/ui/core/qunit/bootstrap/ResourceRoot_ResourcesURL_Standard.qunit.html +1 -1
  759. package/test/sap/ui/core/qunit/bootstrap/ThemeVersion.beforeBootstrap.qunit.js +2 -3
  760. package/test/sap/ui/core/qunit/bootstrap/_checkCoreAndLibraryBooted.qunit.js +39 -34
  761. package/test/sap/ui/core/qunit/bootstrap/_checkCoreAndLibraryBooted_legacyAPIs.qunit.js +5 -1
  762. package/test/sap/ui/core/qunit/bootstrap/testsuite.bootstrap.qunit.js +51 -15
  763. package/test/sap/ui/core/qunit/compat_legacyAPIs/jquery-compat.qunit.html +23 -0
  764. package/test/sap/ui/core/qunit/compat_legacyAPIs/jquery-compat.qunit.js +1 -1
  765. package/test/sap/ui/core/qunit/compat_legacyAPIs/jquery.sap.stubs.qunit.js +16 -20
  766. package/test/sap/ui/core/qunit/compat_legacyAPIs/testsuite.compat.qunit.js +1 -4
  767. package/test/sap/ui/core/qunit/component/Component.qunit.js +100 -7
  768. package/test/sap/ui/core/qunit/component/Models.qunit.js +3 -1
  769. package/test/sap/ui/core/qunit/component/Preloading.qunit.js +8 -12
  770. package/test/sap/ui/core/qunit/component/UIComponent.qunit.js +8 -2
  771. package/test/sap/ui/core/qunit/component/testdata/routerPreloading/Component.js +23 -0
  772. package/test/sap/ui/core/qunit/component/testdata/routerPreloading/Main.view.xml +8 -0
  773. package/test/sap/ui/core/qunit/component/testdata/routerPreloading/manifest.json +34 -0
  774. package/test/sap/ui/core/qunit/component/testdata/targetsPreloading/Component.js +23 -0
  775. package/test/sap/ui/core/qunit/component/testdata/targetsPreloading/Main.view.xml +8 -0
  776. package/test/sap/ui/core/qunit/component/testdata/targetsPreloading/manifest.json +28 -0
  777. package/test/sap/ui/core/qunit/date/_Calendars.qunit.js +52 -0
  778. package/test/sap/ui/core/qunit/generic/legacy/ControlMemoryLeaks.qunit.js +18 -0
  779. package/test/sap/ui/core/qunit/generic/legacy/ControlMemoryLeaksUsingIterator.qunit.js +3 -4
  780. package/test/sap/ui/core/qunit/generic/legacy/DuplicateIdCheck.qunit.js +18 -0
  781. package/test/sap/ui/core/qunit/generic/legacy/SettersContextReturn.qunit.js +15 -0
  782. package/test/sap/ui/core/qunit/generic/testsuite.generic.qunit.js +21 -0
  783. package/test/sap/ui/core/qunit/gherkin/fixture/testHarnessAmbiguous.js +2 -3
  784. package/test/sap/ui/core/qunit/gherkin/fixture/testHarnessDuplicate.js +2 -3
  785. package/test/sap/ui/core/qunit/gherkin/fixture/testHarnessFailing.js +2 -3
  786. package/test/sap/ui/core/qunit/gherkin/opa5TestHarness.qunit.html +16 -0
  787. package/test/sap/ui/core/qunit/gherkin/opa5TestHarness.qunit.js +1 -1
  788. package/test/sap/ui/core/qunit/gherkin/qUnitTestHarness.qunit.html +16 -0
  789. package/test/sap/ui/core/qunit/gherkin/qUnitTestHarness.qunit.js +1 -1
  790. package/test/sap/ui/core/qunit/gherkin/testsuite.gherkin.qunit.js +3 -2
  791. package/test/sap/ui/core/qunit/i18n/Buddhist.qunit.js +3 -0
  792. package/test/sap/ui/core/qunit/i18n/GenericLocaleData.qunit.js +217 -114
  793. package/test/sap/ui/core/qunit/i18n/Islamic.qunit.js +7 -4
  794. package/test/sap/ui/core/qunit/i18n/Japanese.qunit.js +3 -0
  795. package/test/sap/ui/core/qunit/i18n/LocaleData.qunit.js +341 -7
  796. package/test/sap/ui/core/qunit/i18n/Persian.qunit.js +3 -0
  797. package/test/sap/ui/core/qunit/i18n/UniversalDate.qunit.js +3 -0
  798. package/test/sap/ui/core/qunit/i18n/UniversalDateUtils.qunit.js +10 -1
  799. package/test/sap/ui/core/qunit/i18n/helper/_timezones.js +17 -11
  800. package/test/sap/ui/core/qunit/i18n/testsuite.i18n.qunit.js +7 -1
  801. package/test/sap/ui/core/qunit/internal/1Ring.qunit.html +5 -1
  802. package/test/sap/ui/core/qunit/internal/1RingModels.qunit.html +2 -2
  803. package/test/sap/ui/core/qunit/internal/1RingModels.qunit.js +1 -0
  804. package/test/sap/ui/core/qunit/internal/AnnotationParser.qunit.html +1 -2
  805. package/test/sap/ui/core/qunit/internal/ODataV4.qunit.html +6 -1
  806. package/test/sap/ui/core/qunit/internal/testsuite.feature-odata-v4.qunit.js +2 -1
  807. package/test/sap/ui/core/qunit/jquery.sap.global-config.qunit.html +24 -0
  808. package/test/sap/ui/core/qunit/jquery.sap.global-config.qunit.js +12 -6
  809. package/test/sap/ui/core/qunit/jquery.sap.global-config_beforeBootstrap.qunit.js +1 -1
  810. package/test/sap/ui/core/qunit/json/JSONListBinding.qunit.js +30 -0
  811. package/test/sap/ui/core/qunit/loader/exposeAsAMDLoader.qunit.html +1 -0
  812. package/test/sap/ui/core/qunit/model/Binding.qunit.js +3 -0
  813. package/test/sap/ui/core/qunit/model/ClientListBinding.qunit.js +5 -2
  814. package/test/sap/ui/core/qunit/model/ClientPropertyBinding.qunit.js +3 -0
  815. package/test/sap/ui/core/qunit/model/ClientTreeBinding.qunit.js +5 -2
  816. package/test/sap/ui/core/qunit/model/ClientTreeBindingAdapter.qunit.js +6 -0
  817. package/test/sap/ui/core/qunit/model/CompositeDataState.qunit.js +3 -0
  818. package/test/sap/ui/core/qunit/model/Context.qunit.js +3 -0
  819. package/test/sap/ui/core/qunit/model/ContextBinding.qunit.js +3 -0
  820. package/test/sap/ui/core/qunit/model/Filter.qunit.js +49 -0
  821. package/test/sap/ui/core/qunit/model/FilterProcessor.qunit.js +68 -1
  822. package/test/sap/ui/core/qunit/model/ListBinding.qunit.js +23 -5
  823. package/test/sap/ui/core/qunit/model/Model.qunit.js +46 -2
  824. package/test/sap/ui/core/qunit/model/PropertyBinding.qunit.js +3 -0
  825. package/test/sap/ui/core/qunit/model/Sorter.qunit.js +3 -0
  826. package/test/sap/ui/core/qunit/model/TreeBinding.qunit.js +43 -3
  827. package/test/sap/ui/core/qunit/model/TreeBindingAdapter.qunit.js +3 -0
  828. package/test/sap/ui/core/qunit/mvc/Controller.qunit.js +107 -93
  829. package/test/sap/ui/core/qunit/mvc/View.qunit.js +3 -0
  830. package/test/sap/ui/core/qunit/mvc/XMLTemplateProcessor.qunit.js +17 -14
  831. package/test/sap/ui/core/qunit/mvc/XMLTemplateProcessorAsync.qunit.js +23 -12
  832. package/test/sap/ui/core/qunit/mvc/XMLTemplateProcessorRequireXML.qunit.js +29 -82
  833. package/test/sap/ui/core/qunit/mvc/XMLTemplateProcessorRequireXML_unavoidablySync.qunit.js +123 -0
  834. package/test/sap/ui/core/qunit/mvc/extensions/Controllerextensions.qunit.js +4 -0
  835. package/test/sap/ui/core/qunit/mvc/extensions/Controllerextensions_legacy.qunit.js +4 -0
  836. package/test/sap/ui/core/qunit/mvc/testsuite.mvc.qunit.js +16 -0
  837. package/test/sap/ui/core/qunit/mvc/viewprocessing/ViewProcessing.qunit.js +408 -419
  838. package/test/sap/ui/core/qunit/odata/AnnotationHelper.qunit.js +6 -4
  839. package/test/sap/ui/core/qunit/odata/ODataAnnotations.qunit.js +16 -0
  840. package/test/sap/ui/core/qunit/odata/ODataMetaModel.qunit.js +8 -1
  841. package/test/sap/ui/core/qunit/odata/ODataModel_legacyAPIs.qunit.js +22 -22
  842. package/test/sap/ui/core/qunit/odata/ODataTreeBindingAdapter.qunit.js +1 -1
  843. package/test/sap/ui/core/qunit/odata/ODataUtils.qunit.js +5 -1
  844. package/test/sap/ui/core/qunit/odata/type/DateTimeBase.qunit.js +4 -4
  845. package/test/sap/ui/core/qunit/odata/type/DateTimeWithTimezone.qunit.js +6 -6
  846. package/test/sap/ui/core/qunit/odata/type/Time.qunit.js +3 -4
  847. package/test/sap/ui/core/qunit/odata/type/TimeOfDay.qunit.js +4 -4
  848. package/test/sap/ui/core/qunit/odata/v2/ODataListBindingNoFakeService.qunit.js +52 -29
  849. package/test/sap/ui/core/qunit/odata/v2/ODataModel.integration.qunit.js +952 -292
  850. package/test/sap/ui/core/qunit/odata/v2/ODataModelNoFakeService.qunit.js +8 -15
  851. package/test/sap/ui/core/qunit/odata/v2/ODataPropertyBindingNoFakeService.qunit.js +6 -7
  852. package/test/sap/ui/core/qunit/odata/v2/ODataTreeBindingFlatNoFakeService.qunit.js +215 -1
  853. package/test/sap/ui/core/qunit/odata/v2/ODataTreeBindingNoFakeService.qunit.js +211 -20
  854. package/test/sap/ui/core/qunit/odata/v2/ODataV2Model.qunit.js +32 -36
  855. package/test/sap/ui/core/qunit/odata/v2/V2ODataModelDataState.qunit.js +3 -2
  856. package/test/sap/ui/core/qunit/odata/v4/Context.qunit.js +69 -2
  857. package/test/sap/ui/core/qunit/odata/v4/ODataBinding.qunit.js +19 -9
  858. package/test/sap/ui/core/qunit/odata/v4/ODataListBinding.qunit.js +601 -99
  859. package/test/sap/ui/core/qunit/odata/v4/ODataMetaModel.qunit.js +5 -5
  860. package/test/sap/ui/core/qunit/odata/v4/ODataModel.integration.qunit.js +1896 -407
  861. package/test/sap/ui/core/qunit/odata/v4/ODataModel.qunit.js +7 -5
  862. package/test/sap/ui/core/qunit/odata/v4/ODataModel.realOData.qunit.js +4 -4
  863. package/test/sap/ui/core/qunit/odata/v4/lib/_AggregationCache.qunit.js +909 -422
  864. package/test/sap/ui/core/qunit/odata/v4/lib/_AggregationHelper.qunit.js +21 -6
  865. package/test/sap/ui/core/qunit/odata/v4/lib/_Cache.qunit.js +104 -33
  866. package/test/sap/ui/core/qunit/odata/v4/lib/_Helper.qunit.js +8 -0
  867. package/test/sap/ui/core/qunit/odata/v4/lib/_MetadataRequestor.qunit.js +4 -4
  868. package/test/sap/ui/core/qunit/odata/v4/lib/_Requestor.qunit.js +9 -9
  869. package/test/sap/ui/core/qunit/odata/v4/lib/_V2MetadataConverter.qunit.js +3 -3
  870. package/test/sap/ui/core/qunit/odata/v4/lib/_V4MetadataConverter.qunit.js +3 -3
  871. package/test/sap/ui/core/qunit/opa/OpaPlugin.qunit.js +16 -0
  872. package/test/sap/ui/core/qunit/opa/_LogCollector.qunit.js +17 -9
  873. package/test/sap/ui/core/qunit/opa/actions/EnterText.qunit.js +66 -3
  874. package/test/sap/ui/core/qunit/opa/autowaiter/_cssAnimationWaiter.js +3 -3
  875. package/test/sap/ui/core/qunit/opa/autowaiter/_cssTransitionWaiter.js +3 -3
  876. package/test/sap/ui/core/qunit/opa/autowaiter/_jsAnimationWaiter.js +3 -3
  877. package/test/sap/ui/core/qunit/opa/autowaiter/_timeoutWaiter.js +11 -0
  878. package/test/sap/ui/core/qunit/opa/fixture/miniUI5Site.js +14 -8
  879. package/test/sap/ui/core/qunit/opa/fixture/uncaughtError.js +18 -12
  880. package/test/sap/ui/core/qunit/performance/BeaconRequest.qunit.js +18 -2
  881. package/test/sap/ui/core/qunit/performance/trace/FESR.qunit.js +11 -2
  882. package/test/sap/ui/core/qunit/performance/trace/Interaction.qunit.js +4 -7
  883. package/test/sap/ui/core/qunit/resource/ResourceBinding.qunit.js +1 -0
  884. package/test/sap/ui/core/qunit/resource/ResourceModel.qunit.js +5 -4
  885. package/test/sap/ui/core/qunit/routing/async/Target.qunit.js +20 -18
  886. package/test/sap/ui/core/qunit/routing/async/Targets.qunit.js +1 -4
  887. package/test/sap/ui/core/qunit/routing/fixture/routingConfig/Component.js +2 -25
  888. package/test/sap/ui/core/qunit/routing/fixture/routingConfig/manifest.json +28 -0
  889. package/test/sap/ui/core/qunit/rule/misc/silentEventBus.qunit.js +1 -2
  890. package/test/sap/ui/core/qunit/testdata/libraries/scenario11/lib1/library.js +11 -0
  891. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib1/library-preload.js +3 -1
  892. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib1/library.js +3 -1
  893. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib2/library-preload.js +3 -1
  894. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib2/library.js +3 -1
  895. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib3/library-preload.js +2 -1
  896. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib3/library.js +2 -1
  897. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib5/library-preload.js +2 -1
  898. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib5/library.js +2 -1
  899. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib6/library-preload.js +2 -1
  900. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib6/library.js +2 -1
  901. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib8/library-preload.js +2 -1
  902. package/test/sap/ui/core/qunit/testdata/libraries/scenario14/lib8/library.js +2 -1
  903. package/test/sap/ui/core/qunit/testdata/libraries/terminologies/integration/lib/library-preload.js +1 -1
  904. package/test/sap/ui/core/qunit/testdata/shortcutHints/Component.js +9 -0
  905. package/test/sap/ui/core/qunit/testdata/shortcutHints/RootView.controller.js +8 -0
  906. package/test/sap/ui/core/qunit/testdata/shortcutHints/RootView.view.xml +16 -0
  907. package/test/sap/ui/core/qunit/testdata/shortcutHints/lib/MyControl.js +27 -0
  908. package/test/sap/ui/core/qunit/testdata/shortcutHints/manifest.json +26 -0
  909. package/test/sap/ui/core/qunit/testdata/uilib-custom-theme-fallback/library.js +4 -5
  910. package/test/sap/ui/core/qunit/testdata/uilib-failing-css-import/library.js +5 -6
  911. package/test/sap/ui/core/qunit/testdata/xml-require/view/XMLTemplateProcessorAsync_require_expression.controller.js +2 -1
  912. package/test/sap/ui/core/qunit/testdata/xml-require/view/XMLTemplateProcessorAsync_require_expression.view.xml +18 -1
  913. package/test/sap/ui/core/qunit/testsuite.core.framework.qunit.js +3 -0
  914. package/test/sap/ui/core/qunit/testsuites/testsuite.control.framework.qunit.js +0 -4
  915. package/test/sap/ui/core/qunit/testsuites/testsuite.foundation.enablement.qunit.js +6 -1
  916. package/test/sap/ui/core/qunit/testsuites/testsuite.managed.object.qunit.js +4 -1
  917. package/test/sap/ui/core/qunit/testsuites/testsuite.modular.core.qunit.js +1 -1
  918. package/test/sap/ui/core/qunit/testsuites/testsuite.security.qunit.js +3 -9
  919. package/test/sap/ui/core/qunit/types/DataType.qunit.js +14 -3
  920. package/test/sap/ui/core/qunit/types/Date.qunit.js +3 -0
  921. package/test/sap/ui/core/qunit/types/DateFormat.qunit.js +391 -147
  922. package/test/sap/ui/core/qunit/types/DateFormatTimezones.qunit.js +32 -29
  923. package/test/sap/ui/core/qunit/types/DateInterval.qunit.js +7 -4
  924. package/test/sap/ui/core/qunit/types/FileSizeFormat.qunit.js +5 -1
  925. package/test/sap/ui/core/qunit/types/ListFormat.qunit.js +3 -0
  926. package/test/sap/ui/core/qunit/types/NumberFormat.qunit.js +4 -3
  927. package/test/sap/ui/core/qunit/types/NumberFormatCurrencies.qunit.js +5 -4
  928. package/test/sap/ui/core/qunit/types/NumberFormatCurrenciesTrailing.qunit.js +4 -3
  929. package/test/sap/ui/core/qunit/types/SimpleType.qunit.js +3 -0
  930. package/test/sap/ui/core/qunit/types/TimezoneUtil.qunit.js +23 -0
  931. package/test/sap/ui/core/qunit/types/Types.qunit.js +44 -10
  932. package/test/sap/ui/core/qunit/types/testsuite.types.qunit.js +3 -0
  933. package/test/sap/ui/core/qunit/util/InvisibleMessage.qunit.js +4 -4
  934. package/test/sap/ui/core/qunit/util/XMLPreprocessor.qunit.js +592 -83
  935. package/test/sap/ui/core/qunit/util/beforeBootstrap/jQuery.sap.FrameOptions-allowlist.js +7 -0
  936. package/test/sap/ui/core/qunit/util/beforeBootstrap/jQuery.sap.FrameOptions-frameOptions.js +7 -0
  937. package/test/sap/ui/core/qunit/{bootstrap/CfgFromGlobalObject.qunit.html → util/jQuery.sap.FrameOptions-meta-tag-override-mode.qunit.html} +7 -11
  938. package/test/sap/ui/core/qunit/util/jQuery.sap.FrameOptions-meta-tag-override-mode.qunit.js +3 -4
  939. package/test/sap/ui/core/qunit/util/jQuery.sap.FrameOptions-meta-tag-override-service.qunit.html +26 -0
  940. package/test/sap/ui/core/qunit/util/jQuery.sap.FrameOptions-meta-tag-override-service.qunit.js +3 -4
  941. package/test/sap/ui/core/qunit/{bootstrap/CfgDefaults.qunit.html → util/jQuery.sap.FrameOptions-meta-tag.qunit.html} +5 -8
  942. package/test/sap/ui/core/qunit/util/jQuery.sap.FrameOptions-meta-tag.qunit.js +3 -4
  943. package/test/sap/ui/core/qunit/util/jQuery.sap.Version.qunit.js +10 -10
  944. package/test/sap/ui/core/qunit/util/jquery.sap.logger.qunit.html +18 -0
  945. package/test/sap/ui/core/qunit/util/jquery.sap.resources.qunit.js +1 -1
  946. package/test/sap/ui/core/qunit/util/testsuite.util.qunit.js +1 -3
  947. package/test/sap/ui/core/qunit/xml/XMLListBinding.qunit.js +3 -0
  948. package/test/sap/ui/core/qunit/xml/XMLModel.qunit.js +3 -0
  949. package/test/sap/ui/core/qunit/xml/XMLPropertyBinding.qunit.js +3 -0
  950. package/test/sap/ui/core/qunit/xml/XMLTreeBinding.qunit.js +3 -0
  951. package/test/sap/ui/core/relnotes/changes-1.119.json +1 -12
  952. package/test/sap/ui/core/relnotes/changes-1.120.json +442 -0
  953. package/test/sap/ui/core/terminologies/App.controller.js +2 -3
  954. package/test/sap/ui/core/terminologies/main.js +2 -3
  955. package/test/sap/ui/test/qunit/TestUtils.qunit.js +3 -3
  956. package/src/sap/ui/core/ConfigTest.js +0 -17
  957. package/src/sap/ui/core/_ConfigurationProvider.js +0 -187
  958. package/test/sap/ui/core/ComponentExtensibility_CustomizingDisabled.html +0 -57
  959. package/test/sap/ui/core/qunit/bootstrap/CfgDefaults.qunit.js +0 -71
  960. package/test/sap/ui/core/qunit/bootstrap/CfgFromConfigAttribute.qunit.html +0 -29
  961. package/test/sap/ui/core/qunit/bootstrap/CfgFromConfigAttribute.qunit.js +0 -40
  962. package/test/sap/ui/core/qunit/bootstrap/CfgFromGlobalObject.beforeBootstrap.qunit.js +0 -20
  963. package/test/sap/ui/core/qunit/bootstrap/CfgFromGlobalObject.qunit.js +0 -40
  964. package/test/sap/ui/core/qunit/bootstrap/CfgFromTagAttributes.qunit.html +0 -42
  965. package/test/sap/ui/core/qunit/bootstrap/CfgFromTagAttributes.qunit.js +0 -49
  966. package/test/sap/ui/core/qunit/util/BusyIndicatorNoCore.qunit.js +0 -96
  967. package/test/sap/ui/core/qunit/util/beforeBootstrap/jQuery.sap.FrameOptions-meta-tag.js +0 -10
  968. package/test/sap/ui/core/samples/mvc/JSONView.html +0 -65
@@ -4355,23 +4355,47 @@ sap.ui.define([
4355
4355
 
4356
4356
  // code under test
4357
4357
  oBinding.createContexts(0, [{
4358
- "@$ui5._" : {predicate : "('1')"}
4358
+ "@$ui5._" : {context : "n/a", predicate : "('1')"}
4359
4359
  }]);
4360
4360
 
4361
4361
  assert.strictEqual(oBinding.aContexts[0], oCreatedContext);
4362
4362
  assert.strictEqual(oCreatedContext.getModelIndex(), 0);
4363
4363
  });
4364
4364
 
4365
+ //*********************************************************************************************
4366
+ QUnit.test("createContexts: reuse created from 'context' annotation", function (assert) {
4367
+ var oBinding = this.bindList("/EMPLOYEES"),
4368
+ oCreatedContext = Context.create(this.oModel, oBinding, "/EMPLOYEES('1')", -1,
4369
+ SyncPromise.resolve()),
4370
+ oNewContext = {};
4371
+
4372
+ oBinding.mPreviousContextsByPath = {
4373
+ "/EMPLOYEES('1')" : oCreatedContext
4374
+ };
4375
+
4376
+ this.mock(Context).expects("create").never();
4377
+ this.mock(this.oModel).expects("addPrerenderingTask")
4378
+ .withExactArgs(sinon.match.func).callsArg(0);
4379
+ this.mock(oCreatedContext).expects("destroy").withExactArgs();
4380
+
4381
+ oBinding.createContexts(0, [{
4382
+ "@$ui5._" : {context : oNewContext, predicate : "('1')"}
4383
+ }]);
4384
+
4385
+ assert.strictEqual(oBinding.aContexts[0], oNewContext);
4386
+ });
4387
+
4365
4388
  //*********************************************************************************************
4366
4389
  // undefined -> the reinsertion callback is not called because the binding already has another cache
4367
4390
  [undefined, false, true].forEach(function (bSuccess) {
4368
4391
  [false, true].forEach(function (bCreated) { // the deleted context is created-persisted
4369
4392
  [undefined, false, true].forEach(function (bExpanded) { // undefined -> no hierarchy
4370
- const sTitle = "delete: success=" + bSuccess + ", created=" + bCreated
4371
- + ", expanded=" + bExpanded;
4372
- if (bCreated && bExpanded) {
4373
- return;
4374
- }
4393
+ [false, true].forEach(function (bExpandFailure) {
4394
+ const sTitle = "delete: success=" + bSuccess + ", created=" + bCreated
4395
+ + ", expanded=" + bExpanded + ", expandFailure=" + bExpandFailure;
4396
+ if (bCreated && bExpanded || bExpandFailure && (bSuccess || !bExpanded)) {
4397
+ return;
4398
+ }
4375
4399
 
4376
4400
  QUnit.test(sTitle, function (assert) {
4377
4401
  var oBinding = this.bindList("/EMPLOYEES"),
@@ -4413,7 +4437,7 @@ sap.ui.define([
4413
4437
  oContext1Mock.expects("isDeleted").atLeast(1).withExactArgs().returns(false);
4414
4438
  oContext1Mock.expects("isExpanded").withExactArgs().returns(bExpanded);
4415
4439
  oBindingMock.expects("collapse").exactly(bExpanded ? 1 : 0)
4416
- .withExactArgs(sinon.match.same(oContext1));
4440
+ .withExactArgs(sinon.match.same(oContext1), true);
4417
4441
  oBindingMock.expects("destroyPreviousContexts").never();
4418
4442
  oContext1Mock.expects("resetKeepAlive").never();
4419
4443
  oDeleteCall = oContext1Mock.expects("doDelete")
@@ -4443,8 +4467,11 @@ sap.ui.define([
4443
4467
  .withExactArgs([sContext1Path]);
4444
4468
  // expectations for catch
4445
4469
  oBindingMock.expects("expand").exactly(!bSuccess && bExpanded ? 1 : 0)
4446
- .withExactArgs(sinon.match.same(oContext1));
4447
- oBindingMock.expects("_fireChange").exactly(bSuccess ? 0 : 1)
4470
+ .withExactArgs(sinon.match.same(oContext1), true)
4471
+ .returns(bExpandFailure
4472
+ ? SyncPromise.reject("~oExpandError~")
4473
+ : SyncPromise.resolve());
4474
+ oBindingMock.expects("_fireChange").exactly(bSuccess || bExpandFailure ? 0 : 1)
4448
4475
  .withExactArgs({reason : ChangeReason.Add});
4449
4476
 
4450
4477
  return oDeleteFromCachePromise;
@@ -4509,16 +4536,21 @@ sap.ui.define([
4509
4536
  assert.strictEqual(oBinding.iDeletedContexts, 4);
4510
4537
 
4511
4538
  return oPromise.then(function () {
4512
- assert.ok(bSuccess);
4539
+ assert.ok(bSuccess && !bExpandFailure);
4513
4540
  assert.strictEqual(oBinding.iDeletedContexts, 3);
4514
4541
  assert.strictEqual(oContext1.iIndex, Context.VIRTUAL);
4515
4542
  }, function (oError) {
4516
- assert.notOk(bSuccess);
4517
- assert.strictEqual(oError, "~oError~");
4518
- assert.strictEqual(oBinding.iDeletedContexts, 3);
4519
- sinon.assert.calledWithExactly(fnUndelete); // might be called twice
4543
+ assert.ok(!bSuccess || bExpandFailure);
4544
+ if (bExpandFailure) {
4545
+ assert.strictEqual(oError, "~oExpandError~");
4546
+ } else {
4547
+ assert.strictEqual(oError, "~oError~");
4548
+ assert.strictEqual(oBinding.iDeletedContexts, 3);
4549
+ sinon.assert.calledWithExactly(fnUndelete); // might be called twice
4550
+ }
4520
4551
  });
4521
4552
  });
4553
+ });
4522
4554
  });
4523
4555
  });
4524
4556
  });
@@ -4682,13 +4714,6 @@ sap.ui.define([
4682
4714
  // code under test
4683
4715
  oBinding.delete("~oGroupLock~", "~sEditUrl~", oContext);
4684
4716
  }, new Error("Unsupported kept-alive context: ~toString~"));
4685
-
4686
- oBinding.mParameters.$$aggregation = {expandTo : 2, hierarchyQualifier : "X"};
4687
-
4688
- assert.throws(function () {
4689
- // code under test
4690
- oBinding.delete("~oGroupLock~", "~sEditUrl~", {/*oContext*/});
4691
- }, new Error("Unsupported $$aggregation.expandTo: 2"));
4692
4717
  });
4693
4718
 
4694
4719
  //*********************************************************************************************
@@ -5596,13 +5621,6 @@ sap.ui.define([
5596
5621
  // code under test
5597
5622
  oBinding.create({"@$ui5.node.parent" : oParentContext}, true);
5598
5623
  }, new Error("Unsupported collapsed parent: ~toString~"));
5599
-
5600
- oBinding.mParameters.$$aggregation = {expandTo : 2, hierarchyQualifier : "X"};
5601
-
5602
- assert.throws(function () {
5603
- // code under test
5604
- oBinding.create();
5605
- }, new Error("Unsupported $$aggregation.expandTo: 2"));
5606
5624
  });
5607
5625
 
5608
5626
  //*********************************************************************************************
@@ -5670,6 +5688,60 @@ sap.ui.define([
5670
5688
  });
5671
5689
  });
5672
5690
 
5691
+ //*********************************************************************************************
5692
+ [undefined, {"@$ui5.node.parent" : null}].forEach(function (oInitialData, i) {
5693
+ QUnit.test("create: recursive hierarchy, root #" + i, function (assert) {
5694
+ const oBinding = this.bindList("/EMPLOYEES");
5695
+ // Note: autoExpandSelect at model would be required for hierarchyQualifier, but that leads
5696
+ // too far :-(
5697
+ oBinding.mParameters.$$aggregation = {expandTo : 2, hierarchyQualifier : "X"};
5698
+ oBinding.iMaxLength = 42;
5699
+ this.mock(oBinding).expects("fetchResourcePath").withExactArgs()
5700
+ .returns("~oCreatePathPromise~");
5701
+ this.mock(oBinding).expects("getUpdateGroupId").withExactArgs()
5702
+ .returns("~sGroupId~");
5703
+ this.mock(oBinding).expects("getResolvedPath").withExactArgs()
5704
+ .returns("~sResolvedPath~");
5705
+ this.mock(_Helper).expects("uid").withExactArgs().returns("id-1-23");
5706
+ this.mock(oBinding).expects("checkSuspended").withExactArgs();
5707
+ this.mock(_Helper).expects("isDataAggregation")
5708
+ .withExactArgs(sinon.match.same(oBinding.mParameters)).returns(false);
5709
+ this.mock(oBinding).expects("isTransient").twice().withExactArgs().returns(false);
5710
+ this.mock(oBinding).expects("checkDeepCreate").never();
5711
+ this.mock(oBinding).expects("isRelative").never();
5712
+ oBinding.aContexts.push({iIndex : 0}, undefined, {iIndex : 2});
5713
+ this.mock(_Helper).expects("publicClone")
5714
+ .withExactArgs(sinon.match.same(oInitialData), true).returns("~oEntityData~");
5715
+ this.mock(oBinding).expects("lockGroup")
5716
+ .withExactArgs("~sGroupId~", true, true, sinon.match.func).returns("~oGroupLock~");
5717
+ this.mock(oBinding).expects("createInCache")
5718
+ .withExactArgs("~oGroupLock~", "~oCreatePathPromise~", "~sResolvedPath~",
5719
+ sinon.match(rTransientPredicate), "~oEntityData~",
5720
+ false, sinon.match.func, sinon.match.func)
5721
+ .returns(SyncPromise.resolve(Promise.resolve("~oCreatedEntity~")));
5722
+ const oContext = {fetchValue : mustBeMocked};
5723
+ this.mock(Context).expects("create")
5724
+ .withExactArgs(sinon.match.same(this.oModel), sinon.match.same(oBinding),
5725
+ "~sResolvedPath~($uid=id-1-23)", /*iChildIndex*/0,
5726
+ sinon.match.instanceOf(SyncPromise), undefined)
5727
+ .returns(oContext);
5728
+ this.mock(oContext).expects("fetchValue").withExactArgs()
5729
+ .returns(SyncPromise.resolve()); //TODO
5730
+ this.mock(oBinding).expects("_fireChange")
5731
+ .withExactArgs({reason : ChangeReason.Add});
5732
+
5733
+ // code under test
5734
+ assert.strictEqual(oBinding.create(oInitialData, true), oContext);
5735
+
5736
+ assert.strictEqual(oBinding.iActiveContexts, 0, "unchanged");
5737
+ assert.strictEqual(oBinding.iCreatedContexts, 0, "unchanged");
5738
+ assert.strictEqual(oBinding.bFirstCreateAtEnd, false);
5739
+ assert.strictEqual(oBinding.iMaxLength, 43);
5740
+ assert.deepEqual(oBinding.aContexts,
5741
+ [oContext, {iIndex : 1}, undefined, {iIndex : 3}]);
5742
+ });
5743
+ });
5744
+
5673
5745
  //*********************************************************************************************
5674
5746
  QUnit.test("create and delete with bAtEnd varying", function () {
5675
5747
  var oBinding = this.bindList("/EMPLOYEES"),
@@ -8323,16 +8395,18 @@ sap.ui.define([
8323
8395
  oCreatedContext2 = { // in
8324
8396
  getProperty : function () {}
8325
8397
  },
8326
- oContext0 = {}, // in
8327
- oContext1 = {}, // in
8398
+ oContext0 = {getProperty : mustBeMocked}, // in
8399
+ oContext1 = {getProperty : mustBeMocked}, // in
8328
8400
  oPreviousContext0 = { // in
8329
- isEffectivelyKeptAlive : function () {}
8401
+ isEffectivelyKeptAlive : function () {},
8402
+ getProperty : mustBeMocked
8330
8403
  },
8331
8404
  oPreviousContext1 = { // out
8332
8405
  isEffectivelyKeptAlive : function () {}
8333
8406
  },
8334
8407
  oPreviousContext2 = { // in
8335
- isEffectivelyKeptAlive : function () {}
8408
+ isEffectivelyKeptAlive : function () {},
8409
+ getProperty : mustBeMocked
8336
8410
  },
8337
8411
  aResult;
8338
8412
 
@@ -8346,12 +8420,6 @@ sap.ui.define([
8346
8420
  bar : oPreviousContext1,
8347
8421
  baz : oPreviousContext2
8348
8422
  };
8349
- this.mock(oCreatedContext0).expects("getProperty")
8350
- .withExactArgs("@$ui5.context.isTransient").returns(false);
8351
- this.mock(oCreatedContext1).expects("getProperty")
8352
- .withExactArgs("@$ui5.context.isTransient").returns(true);
8353
- this.mock(oCreatedContext2).expects("getProperty")
8354
- .withExactArgs("@$ui5.context.isTransient").returns(false);
8355
8423
  this.mock(oBinding).expects("getCurrentContexts").withExactArgs()
8356
8424
  .returns([oCreatedContext2, oContext0, oContext1, undefined]);
8357
8425
  this.mock(oPreviousContext0).expects("isEffectivelyKeptAlive").withExactArgs()
@@ -8360,6 +8428,20 @@ sap.ui.define([
8360
8428
  .returns(false);
8361
8429
  this.mock(oPreviousContext2).expects("isEffectivelyKeptAlive").withExactArgs()
8362
8430
  .returns(true);
8431
+ this.mock(oCreatedContext0).expects("getProperty")
8432
+ .withExactArgs("@$ui5.context.isTransient").returns(false);
8433
+ this.mock(oCreatedContext1).expects("getProperty")
8434
+ .withExactArgs("@$ui5.context.isTransient").returns(true);
8435
+ this.mock(oCreatedContext2).expects("getProperty")
8436
+ .withExactArgs("@$ui5.context.isTransient").returns(false);
8437
+ this.mock(oPreviousContext0).expects("getProperty")
8438
+ .withExactArgs("@$ui5.context.isTransient").returns(false);
8439
+ this.mock(oPreviousContext2).expects("getProperty")
8440
+ .withExactArgs("@$ui5.context.isTransient").returns(false);
8441
+ this.mock(oContext0).expects("getProperty")
8442
+ .withExactArgs("@$ui5.context.isTransient").returns(false);
8443
+ this.mock(oContext1).expects("getProperty")
8444
+ .withExactArgs("@$ui5.context.isTransient").returns(false);
8363
8445
  this.mock(oBinding).expects("destroyLater").never();
8364
8446
 
8365
8447
  // code under test
@@ -8385,46 +8467,83 @@ sap.ui.define([
8385
8467
  });
8386
8468
 
8387
8469
  //*********************************************************************************************
8388
- QUnit.test("keepOnlyVisibleContexts: destroy others", function (assert) {
8470
+ [false, true].forEach((bTransient) => {
8471
+ var sTitle = "keepOnlyVisibleContexts: destroy others, unless created; transient: "
8472
+ + bTransient;
8473
+
8474
+ QUnit.test(sTitle, function (assert) {
8389
8475
  var oBinding = this.bindList("/Set"),
8390
8476
  oBindingMock = this.mock(oBinding),
8391
8477
  oCreatedContext0 = { // out
8392
8478
  getProperty : function () {},
8393
8479
  iIndex : -1
8394
8480
  },
8395
- oContext0 = {iIndex : 0}, // to be destroyed
8396
- oContext1 = {iIndex : 1}, // to be destroyed
8397
- oContext2 = { // in
8398
- iIndex : 2
8481
+ oContext0 = {iIndex : 0, created : mustBeMocked}, // to be destroyed
8482
+ oContext1 = { // NOT to be destroyed
8483
+ iIndex : 1,
8484
+ created : mustBeMocked,
8485
+ getProperty : mustBeMocked
8399
8486
  },
8487
+ oContext2 = {iIndex : 2, created : mustBeMocked}, // to be destroyed
8400
8488
  oContext3 = { // in
8401
- iIndex : 3
8489
+ iIndex : 3,
8490
+ getProperty : mustBeMocked
8491
+ },
8492
+ oContext4 = { // in
8493
+ iIndex : 4,
8494
+ getProperty : mustBeMocked
8402
8495
  },
8403
- oContext4 = {iIndex : 4}, // to be destroyed
8404
- oContext5 = {iIndex : 5}, // to be destroyed
8496
+ oContext5 = {iIndex : 5, created : mustBeMocked}, // to be destroyed
8497
+ oContext6 = { // NOT to be destroyed
8498
+ iIndex : 6,
8499
+ created : mustBeMocked,
8500
+ getProperty : mustBeMocked
8501
+ },
8502
+ oContext7 = {iIndex : 7, created : mustBeMocked}, // to be destroyed
8405
8503
  aResult;
8406
8504
 
8407
8505
  oBinding.aContexts = [oCreatedContext0, oContext0, oContext1, oContext2, oContext3,
8408
- oContext4, oContext5];
8506
+ oContext4, oContext5, oContext6, oContext7];
8409
8507
  oBinding.iCreatedContexts = 1;
8410
- oBinding.iCurrentBegin = 3;
8411
- oBinding.iCurrentEnd = 5;
8412
- oBindingMock.expects("getCurrentContexts").withExactArgs().returns([oContext2, oContext3]);
8508
+ oBinding.iCurrentBegin = 4;
8509
+ oBinding.iCurrentEnd = 6;
8510
+ oBindingMock.expects("getCurrentContexts").withExactArgs().returns([oContext3, oContext4]);
8413
8511
  this.mock(oCreatedContext0).expects("getProperty")
8414
8512
  .withExactArgs("@$ui5.context.isTransient").returns(true);
8513
+ this.mock(oContext0).expects("created").withExactArgs().returns(undefined);
8514
+ this.mock(oContext1).expects("created").withExactArgs().returns(Promise.resolve());
8515
+ this.mock(oContext2).expects("created").withExactArgs().returns(undefined);
8516
+ this.mock(oContext5).expects("created").withExactArgs().returns(undefined);
8517
+ this.mock(oContext6).expects("created").withExactArgs().returns(Promise.resolve());
8518
+ this.mock(oContext7).expects("created").withExactArgs().returns(undefined);
8415
8519
  oBindingMock.expects("destroyLater").on(oBinding).withArgs(sinon.match.same(oContext0));
8416
- oBindingMock.expects("destroyLater").on(oBinding).withArgs(sinon.match.same(oContext1));
8417
- oBindingMock.expects("destroyLater").on(oBinding).withArgs(sinon.match.same(oContext4));
8520
+ oBindingMock.expects("destroyLater").on(oBinding).withArgs(sinon.match.same(oContext2));
8418
8521
  oBindingMock.expects("destroyLater").on(oBinding).withArgs(sinon.match.same(oContext5));
8522
+ oBindingMock.expects("destroyLater").on(oBinding).withArgs(sinon.match.same(oContext7));
8523
+ this.mock(oContext1).expects("getProperty")
8524
+ .withExactArgs("@$ui5.context.isTransient").returns(bTransient);
8525
+ this.mock(oContext3).expects("getProperty")
8526
+ .withExactArgs("@$ui5.context.isTransient").returns(bTransient);
8527
+ this.mock(oContext4).expects("getProperty")
8528
+ .withExactArgs("@$ui5.context.isTransient").returns(bTransient);
8529
+ this.mock(oContext6).expects("getProperty")
8530
+ .withExactArgs("@$ui5.context.isTransient").returns(bTransient);
8419
8531
 
8420
8532
  // code under test
8421
8533
  aResult = oBinding.keepOnlyVisibleContexts();
8422
8534
 
8423
- assert.deepEqual(aResult, [oContext2, oContext3]);
8424
- assert.strictEqual(aResult[0], oContext2);
8425
- assert.strictEqual(aResult[1], oContext3);
8426
- assert.deepEqual(oBinding.aContexts, [oCreatedContext0,,, oContext2, oContext3]);
8535
+ if (bTransient) { // transient ones cannot be requested
8536
+ assert.deepEqual(aResult, []);
8537
+ } else {
8538
+ assert.deepEqual(aResult, [oContext3, oContext4, oContext1, oContext6]);
8539
+ assert.strictEqual(aResult[0], oContext3);
8540
+ assert.strictEqual(aResult[1], oContext4);
8541
+ assert.strictEqual(aResult[2], oContext1);
8542
+ assert.strictEqual(aResult[3], oContext6);
8543
+ }
8544
+ assert.deepEqual(oBinding.aContexts, [oCreatedContext0,,,, oContext3, oContext4]);
8427
8545
  });
8546
+ });
8428
8547
 
8429
8548
  //*********************************************************************************************
8430
8549
  QUnit.test("keepOnlyVisibleContexts: only created are visible", function (assert) {
@@ -8465,6 +8584,247 @@ sap.ui.define([
8465
8584
  [oCreatedContext0, oCreatedContext1, oCreatedContext2]);
8466
8585
  });
8467
8586
 
8587
+ //*********************************************************************************************
8588
+ QUnit.test("getParent: given node is a root node", function (assert) {
8589
+ const oBinding = this.bindList("/EMPLOYEES");
8590
+ const oNode = {iIndex : 23};
8591
+ // Note: autoExpandSelect at model would be required for hierarchyQualifier, but that leads
8592
+ // too far
8593
+ oBinding.mParameters = {
8594
+ $$aggregation : {
8595
+ expandTo : 1,
8596
+ hierarchyQualifier : "X"
8597
+ }
8598
+ };
8599
+ oBinding.aContexts[23] = oNode;
8600
+ oBinding.oCache = {getParentIndex : mustBeMocked};
8601
+
8602
+ this.mock(oBinding.oCache).expects("getParentIndex").withExactArgs(23)
8603
+ .returns(-1);
8604
+
8605
+ // code under test
8606
+ assert.strictEqual(oBinding.getParent(oNode), null);
8607
+ });
8608
+
8609
+ //*********************************************************************************************
8610
+ QUnit.test("getParent: throws error if expandTo > 1", function (assert) {
8611
+ const oBinding = this.bindList("/EMPLOYEES");
8612
+ // Note: autoExpandSelect at model would be required for hierarchyQualifier, but that leads
8613
+ // too far
8614
+ oBinding.mParameters = {
8615
+ $$aggregation : {
8616
+ expandTo : 2,
8617
+ hierarchyQualifier : "X"
8618
+ }
8619
+ };
8620
+
8621
+ assert.throws(function () {
8622
+ // code under test
8623
+ oBinding.getParent();
8624
+ }, new Error("Unsupported $$aggregation.expandTo: 2"));
8625
+ });
8626
+
8627
+ //*********************************************************************************************
8628
+ QUnit.test("getParent: Missing recursive hierarchy", function (assert) {
8629
+ const oBinding = this.bindList("/EMPLOYEES");
8630
+
8631
+ assert.throws(function () {
8632
+ // code under test
8633
+ oBinding.getParent();
8634
+ }, new Error("Missing recursive hierarchy"));
8635
+
8636
+ oBinding.mParameters = {$$aggregation : {}};
8637
+
8638
+ assert.throws(function () {
8639
+ // code under test
8640
+ oBinding.getParent();
8641
+ }, new Error("Missing recursive hierarchy"));
8642
+ });
8643
+
8644
+ //*********************************************************************************************
8645
+ QUnit.test("getParent: given node is not part of a recursive hierachy", function (assert) {
8646
+ const oBinding = this.bindList("/EMPLOYEES");
8647
+ const oNode = Context.create({/*oModel*/}, oBinding, "/EMPLOYEES('42')", 23);
8648
+ // Note: autoExpandSelect at model would be required for hierarchyQualifier, but that leads
8649
+ // too far
8650
+ oBinding.mParameters = {
8651
+ $$aggregation : {
8652
+ expandTo : 1,
8653
+ hierarchyQualifier : "X"
8654
+ }
8655
+ };
8656
+
8657
+ assert.throws(function () {
8658
+ // code under test
8659
+ oBinding.getParent(oNode);
8660
+ }, new Error("Not currently part of a recursive hierarchy: " + oNode));
8661
+ });
8662
+
8663
+ //*********************************************************************************************
8664
+ QUnit.test("getParent", function (assert) {
8665
+ const oBinding = this.bindList("/EMPLOYEES");
8666
+ const oNode = {iIndex : 42};
8667
+ const oParentContext = {};
8668
+
8669
+ oBinding.aContexts[23] = oParentContext;
8670
+ oBinding.aContexts[42] = oNode;
8671
+ oBinding.oCache = {getParentIndex : mustBeMocked};
8672
+
8673
+ // Note: autoExpandSelect at model would be required for hierarchyQualifier, but that leads
8674
+ // too far
8675
+ oBinding.mParameters = {
8676
+ $$aggregation : {
8677
+ expandTo : 1,
8678
+ hierarchyQualifier : "X"
8679
+ }
8680
+ };
8681
+
8682
+ this.mock(oBinding.oCache).expects("getParentIndex").withExactArgs(42)
8683
+ .returns(23);
8684
+
8685
+ // code under test
8686
+ assert.strictEqual(oBinding.getParent(oNode), oParentContext);
8687
+ });
8688
+
8689
+ //*********************************************************************************************
8690
+ QUnit.test("requestParent: Missing recursive hierarchy", function (assert) {
8691
+ const oBinding = this.bindList("/EMPLOYEES");
8692
+
8693
+ assert.throws(function () {
8694
+ // code under test
8695
+ oBinding.requestParent();
8696
+ }, new Error("Missing recursive hierarchy"));
8697
+
8698
+ oBinding.mParameters = {$$aggregation : {}};
8699
+
8700
+ assert.throws(function () {
8701
+ // code under test
8702
+ oBinding.requestParent();
8703
+ }, new Error("Missing recursive hierarchy"));
8704
+ });
8705
+
8706
+ //*********************************************************************************************
8707
+ QUnit.test("requestParent: throws error if expandTo > 1", function (assert) {
8708
+ const oBinding = this.bindList("/EMPLOYEES");
8709
+ // Note: autoExpandSelect at model would be required for hierarchyQualifier, but that leads
8710
+ // too far
8711
+ oBinding.mParameters = {
8712
+ $$aggregation : {
8713
+ expandTo : 2,
8714
+ hierarchyQualifier : "X"
8715
+ }
8716
+ };
8717
+
8718
+ assert.throws(function () {
8719
+ // code under test
8720
+ oBinding.requestParent();
8721
+ }, new Error("Unsupported $$aggregation.expandTo: 2"));
8722
+ });
8723
+
8724
+ //*********************************************************************************************
8725
+ QUnit.test("requestParent: given node is not part of a recursive hierachy", function (assert) {
8726
+ const oBinding = this.bindList("/EMPLOYEES");
8727
+ const oNode = Context.create({/*oModel*/}, oBinding, "/EMPLOYEES('42')", 23);
8728
+ // Note: autoExpandSelect at model would be required for hierarchyQualifier, but that leads
8729
+ // too far
8730
+ oBinding.mParameters = {
8731
+ $$aggregation : {
8732
+ expandTo : 1,
8733
+ hierarchyQualifier : "X"
8734
+ }
8735
+ };
8736
+
8737
+ assert.throws(function () {
8738
+ // code under test
8739
+ oBinding.requestParent(oNode);
8740
+ }, new Error("Not currently part of a recursive hierarchy: " + oNode));
8741
+ });
8742
+
8743
+ //*********************************************************************************************
8744
+ QUnit.test("requestParent: given node is a root node", async function (assert) {
8745
+ const oBinding = this.bindList("/EMPLOYEES");
8746
+ const oNode = {iIndex : 23};
8747
+ // Note: autoExpandSelect at model would be required for hierarchyQualifier, but that leads
8748
+ // too far
8749
+ oBinding.mParameters = {
8750
+ $$aggregation : {
8751
+ expandTo : 1,
8752
+ hierarchyQualifier : "X"
8753
+ }
8754
+ };
8755
+ oBinding.aContexts[23] = oNode;
8756
+ oBinding.oCache = {getParentIndex : mustBeMocked};
8757
+
8758
+ this.mock(oBinding.oCache).expects("getParentIndex").withExactArgs(23)
8759
+ .returns(-1);
8760
+
8761
+ // code under test
8762
+ const oPromise = oBinding.requestParent(oNode);
8763
+ assert.ok(oPromise instanceof Promise);
8764
+ assert.strictEqual(await oPromise, null);
8765
+ });
8766
+
8767
+ //*********************************************************************************************
8768
+ QUnit.test("requestParent", async function (assert) {
8769
+ const oBinding = this.bindList("/EMPLOYEES");
8770
+ const oNode = {iIndex : 42};
8771
+ const oParentContext = {};
8772
+
8773
+ oBinding.aContexts[42] = oNode;
8774
+ oBinding.oCache = {getParentIndex : mustBeMocked};
8775
+
8776
+ // Note: autoExpandSelect at model would be required for hierarchyQualifier, but that leads
8777
+ // too far
8778
+ oBinding.mParameters = {
8779
+ $$aggregation : {
8780
+ expandTo : 1,
8781
+ hierarchyQualifier : "X"
8782
+ }
8783
+ };
8784
+
8785
+ this.mock(oBinding.oCache).expects("getParentIndex").withExactArgs(42)
8786
+ .returns("~iParentIndex~");
8787
+ this.mock(oBinding).expects("requestContexts").withExactArgs("~iParentIndex~", 1)
8788
+ .resolves([oParentContext]);
8789
+
8790
+ // code under test
8791
+ const oPromise = oBinding.requestParent(oNode);
8792
+ assert.ok(oPromise instanceof Promise);
8793
+ assert.strictEqual(await oPromise, oParentContext);
8794
+ });
8795
+
8796
+ //*********************************************************************************************
8797
+ QUnit.test("requestParent: requestContexts rejects", function (assert) {
8798
+ const oBinding = this.bindList("/EMPLOYEES");
8799
+ const oNode = {iIndex : 42};
8800
+
8801
+ oBinding.aContexts[42] = oNode;
8802
+ oBinding.oCache = {getParentIndex : mustBeMocked};
8803
+
8804
+ // Note: autoExpandSelect at model would be required for hierarchyQualifier, but that leads
8805
+ // too far
8806
+ oBinding.mParameters = {
8807
+ $$aggregation : {
8808
+ expandTo : 1,
8809
+ hierarchyQualifier : "X"
8810
+ }
8811
+ };
8812
+
8813
+ this.mock(oBinding.oCache).expects("getParentIndex").withExactArgs(42)
8814
+ .returns("~iParentIndex~");
8815
+ const oError = new Error();
8816
+ this.mock(oBinding).expects("requestContexts").withExactArgs("~iParentIndex~", 1)
8817
+ .rejects(oError);
8818
+
8819
+ // code under test
8820
+ return oBinding.requestParent(oNode)
8821
+ .then(function () {
8822
+ assert.ok(false);
8823
+ }, function (oReturnedError) {
8824
+ assert.strictEqual(oReturnedError, oError);
8825
+ });
8826
+ });
8827
+
8468
8828
  //*********************************************************************************************
8469
8829
  QUnit.test("getQueryOptions: with system query options", function (assert) {
8470
8830
  var oBinding = this.bindList("/Set");
@@ -8922,8 +9282,9 @@ sap.ui.define([
8922
9282
  [false, true].forEach(function (bSuccess) {
8923
9283
  [false, true].forEach(function (bDataRequested) {
8924
9284
  [0, 3].forEach(function (iCount) { // 0 means collapse before expand has finished
8925
- var sTitle = "expand: success=" + bSuccess + ", data requested=" + bDataRequested
8926
- + ", count=" + iCount;
9285
+ [false, true].forEach((bSilent) => {
9286
+ var sTitle = "expand: success=" + bSuccess + ", data requested=" + bDataRequested
9287
+ + ", count=" + iCount + ", silent=" + bSilent;
8927
9288
 
8928
9289
  if (!bSuccess && !iCount) { // ignore useless combination
8929
9290
  return;
@@ -8937,10 +9298,10 @@ sap.ui.define([
8937
9298
  toString : function () { return "~context~"; }
8938
9299
  },
8939
9300
  oChangeCall,
8940
- aContextsBefore,
8941
9301
  oDataReceivedCall,
8942
9302
  oError = new Error(),
8943
9303
  oExpectation,
9304
+ oGapCall,
8944
9305
  oGroupLock = {},
8945
9306
  oPromise,
8946
9307
  that = this;
@@ -8948,9 +9309,6 @@ sap.ui.define([
8948
9309
  oBinding.oCache = { // simulate an aggregation cache
8949
9310
  expand : function () {}
8950
9311
  };
8951
- oBinding.createContexts(0, createData(2, 0, true, 5));
8952
- oBinding.createContexts(3, createData(2, 3, true, 5));
8953
- aContextsBefore = oBinding.aContexts.slice();
8954
9312
 
8955
9313
  this.mock(oBinding).expects("checkSuspended").withExactArgs();
8956
9314
  this.mock(oBinding).expects("lockGroup").withExactArgs().returns(oGroupLock);
@@ -8965,8 +9323,11 @@ sap.ui.define([
8965
9323
  .returns(Promise.resolve().then(function () {
8966
9324
  if (bSuccess) {
8967
9325
  that.mock(oContext).expects("getModelIndex").exactly(iCount ? 1 : 0)
8968
- .withExactArgs().returns(1);
8969
- oChangeCall = that.mock(oBinding).expects("_fireChange").exactly(iCount ? 1 : 0)
9326
+ .withExactArgs().returns("~iModelIndex~");
9327
+ oGapCall = that.mock(oBinding).expects("insertGap").exactly(iCount ? 1 : 0)
9328
+ .withExactArgs("~iModelIndex~", iCount);
9329
+ oChangeCall = that.mock(oBinding).expects("_fireChange")
9330
+ .exactly(iCount && !bSilent ? 1 : 0)
8970
9331
  .withExactArgs({reason : ChangeReason.Change});
8971
9332
  oDataReceivedCall = that.mock(oBinding).expects("fireDataReceived")
8972
9333
  .exactly(bDataRequested ? 1 : 0).withExactArgs({});
@@ -8980,32 +9341,14 @@ sap.ui.define([
8980
9341
  }));
8981
9342
 
8982
9343
  // code under test
8983
- oPromise = oBinding.expand(oContext).then(function () {
9344
+ oPromise = oBinding.expand(oContext, bSilent).then(function () {
8984
9345
  assert.ok(bSuccess);
8985
- assert.strictEqual(oBinding.getLength(), 5 + iCount);
8986
- assert.strictEqual(oBinding.aContexts.length, 5 + iCount);
8987
- assert.strictEqual(oBinding.aContexts[0], aContextsBefore[0], "0");
8988
- assert.strictEqual(oBinding.aContexts[0].iIndex, 0);
8989
- assert.strictEqual(oBinding.aContexts[1], aContextsBefore[1], "1");
8990
- assert.strictEqual(oBinding.aContexts[1].iIndex, 1);
8991
- assert.notOk(2 in oBinding.aContexts, "2");
8992
- if (iCount) {
8993
- assert.notOk(3 in oBinding.aContexts, "3");
8994
- assert.notOk(4 in oBinding.aContexts, "4");
8995
- assert.notOk(5 in oBinding.aContexts, "5");
8996
- assert.strictEqual(oBinding.aContexts[6], aContextsBefore[3], "6");
8997
- assert.strictEqual(oBinding.aContexts[6].iIndex, 6);
8998
- assert.strictEqual(oBinding.aContexts[7], aContextsBefore[4], "7");
8999
- assert.strictEqual(oBinding.aContexts[7].iIndex, 7);
9000
- } else {
9001
- assert.strictEqual(oBinding.aContexts[3], aContextsBefore[3], "3");
9002
- assert.strictEqual(oBinding.aContexts[3].iIndex, 3);
9003
- assert.strictEqual(oBinding.aContexts[4], aContextsBefore[4], "4");
9004
- assert.strictEqual(oBinding.aContexts[4].iIndex, 4);
9005
- }
9006
-
9007
9346
  if (bDataRequested && iCount) {
9008
- sinon.assert.callOrder(oChangeCall, oDataReceivedCall);
9347
+ if (bSilent) {
9348
+ sinon.assert.callOrder(oGapCall, oDataReceivedCall);
9349
+ } else {
9350
+ sinon.assert.callOrder(oGapCall, oChangeCall, oDataReceivedCall);
9351
+ }
9009
9352
  }
9010
9353
  }, function (oResult) {
9011
9354
  assert.notOk(bSuccess);
@@ -9020,11 +9363,38 @@ sap.ui.define([
9020
9363
 
9021
9364
  return oPromise;
9022
9365
  });
9023
- // TODO aContexts may be sparse
9366
+ });
9024
9367
  });
9025
9368
  });
9026
9369
  });
9027
9370
 
9371
+ //*********************************************************************************************
9372
+ QUnit.test("insertGap", function (assert) {
9373
+ const oBinding = this.bindList("/EMPLOYEES");
9374
+ oBinding.createContexts(0, createData(2, 0, true, 5));
9375
+ oBinding.createContexts(3, createData(2, 3, true, 5));
9376
+ const aContextsBefore = oBinding.aContexts.slice();
9377
+
9378
+ // code under test
9379
+ oBinding.insertGap(1, 3);
9380
+
9381
+ assert.strictEqual(oBinding.getLength(), 5 + 3);
9382
+ assert.strictEqual(oBinding.aContexts.length, 5 + 3);
9383
+ assert.strictEqual(oBinding.aContexts[0], aContextsBefore[0], "0");
9384
+ assert.strictEqual(oBinding.aContexts[0].iIndex, 0);
9385
+ assert.strictEqual(oBinding.aContexts[1], aContextsBefore[1], "1");
9386
+ assert.strictEqual(oBinding.aContexts[1].iIndex, 1);
9387
+ assert.notOk(2 in oBinding.aContexts, "2");
9388
+ assert.notOk(3 in oBinding.aContexts, "3");
9389
+ assert.notOk(4 in oBinding.aContexts, "4");
9390
+ assert.notOk(5 in oBinding.aContexts, "5");
9391
+ assert.strictEqual(oBinding.aContexts[6], aContextsBefore[3], "6");
9392
+ assert.strictEqual(oBinding.aContexts[6].iIndex, 6);
9393
+ assert.strictEqual(oBinding.aContexts[7], aContextsBefore[4], "7");
9394
+ assert.strictEqual(oBinding.aContexts[7].iIndex, 7);
9395
+ });
9396
+ // TODO aContexts may be sparse
9397
+
9028
9398
  //*********************************************************************************************
9029
9399
  [0, 3].forEach((iCount) => {
9030
9400
  [false, true].forEach((bSilent) => {
@@ -9043,6 +9413,9 @@ sap.ui.define([
9043
9413
  function createContextDummy(i) {
9044
9414
  return {
9045
9415
  iIndex : i,
9416
+ created : function () { // every odd context looks "created"
9417
+ return i % 2 ? Promise.resolve() : undefined;
9418
+ },
9046
9419
  getPath : function () {
9047
9420
  return "/EMPLOYEES/" + i;
9048
9421
  }
@@ -9091,7 +9464,7 @@ sap.ui.define([
9091
9464
  });
9092
9465
  assert.deepEqual(oBinding.mPreviousContextsByPath, {
9093
9466
  "/EMPLOYEES/2" : aContextsBefore[2],
9094
- "/EMPLOYEES/3" : aContextsBefore[3],
9467
+ // "/EMPLOYEES/3" : aContextsBefore[3], // "created" not inserted here!
9095
9468
  "/EMPLOYEES/4" : aContextsBefore[4]
9096
9469
  });
9097
9470
  } else {
@@ -10161,6 +10534,69 @@ sap.ui.define([
10161
10534
  assert.strictEqual(oBinding.isFirstCreateAtEnd(), "~foo~");
10162
10535
  });
10163
10536
 
10537
+ //*********************************************************************************************
10538
+ QUnit.test("isAncestorOf: Missing recursive hierarchy", function (assert) {
10539
+ const oBinding1 = this.bindList("/EMPLOYEES");
10540
+ assert.throws(function () {
10541
+ // code under test
10542
+ oBinding1.isAncestorOf();
10543
+ }, new Error("Missing recursive hierarchy"));
10544
+
10545
+ const oBinding2 = this.bindList("/EMPLOYEES", undefined, undefined, undefined,
10546
+ {$$aggregation : {}}); // Note: no hierarchyQualifier!
10547
+ assert.throws(function () {
10548
+ // code under test
10549
+ oBinding2.isAncestorOf();
10550
+ }, new Error("Missing recursive hierarchy"));
10551
+ });
10552
+
10553
+ //*********************************************************************************************
10554
+ [0, 1].forEach((iIndex) => {
10555
+ const sTitle = `isAncestorOf: Not currently part of a recursive hierarchy; iIndex = ${iIndex}`;
10556
+
10557
+ QUnit.test(sTitle, function (assert) {
10558
+ const oBinding = this.bindList("/EMPLOYEES");
10559
+ // Note: autoExpandSelect at model would be required for hierarchyQualifier, but that leads
10560
+ // too far :-(
10561
+ oBinding.mParameters = {$$aggregation : {hierarchyQualifier : "X"}};
10562
+ const oAncestor = {
10563
+ iIndex : iIndex, // 1 is correct
10564
+ toString : () => "~oAncestor~"
10565
+ };
10566
+ oBinding.aContexts[1] = oAncestor;
10567
+ const oDescendant = {
10568
+ iIndex : 42, // 42 always wrong
10569
+ toString : () => "~oDescendant~"
10570
+ };
10571
+
10572
+ assert.throws(function () {
10573
+ // code under test
10574
+ oBinding.isAncestorOf(oAncestor, oDescendant);
10575
+ }, new Error("Not currently part of a recursive hierarchy: "
10576
+ + (iIndex ? "~oDescendant~" : "~oAncestor~")));
10577
+ });
10578
+ });
10579
+
10580
+ //*********************************************************************************************
10581
+ QUnit.test("isAncestorOf", function (assert) {
10582
+ const oBinding = this.bindList("/EMPLOYEES");
10583
+ // Note: autoExpandSelect at model would be required for hierarchyQualifier, but that leads
10584
+ // too far :-(
10585
+ oBinding.mParameters = {$$aggregation : {hierarchyQualifier : "X"}};
10586
+ const oAncestor = {iIndex : 23};
10587
+ oBinding.aContexts[23] = oAncestor;
10588
+ const oDescendant = {iIndex : 42};
10589
+ oBinding.aContexts[42] = oDescendant;
10590
+ oBinding.oCache = {
10591
+ isAncestorOf : mustBeMocked
10592
+ };
10593
+ this.mock(oBinding.oCache).expects("isAncestorOf").withExactArgs(23, 42)
10594
+ .returns("~result~");
10595
+
10596
+ // code under test
10597
+ assert.strictEqual(oBinding.isAncestorOf(oAncestor, oDescendant), "~result~");
10598
+ });
10599
+
10164
10600
  //*********************************************************************************************
10165
10601
  QUnit.test("restoreCreated", function (assert) {
10166
10602
  var oBinding = this.bindList("/EMPLOYEES"),
@@ -10309,8 +10745,9 @@ sap.ui.define([
10309
10745
  [false, true].forEach((bCreated) => {
10310
10746
  [-1, +1, 0].forEach((iDirection) => { // child is before or after parent (or right in place)
10311
10747
  [false, true].forEach((bIsExpanded) => {
10312
- const sTitle = `move: created=${bCreated}, direction=${iDirection},
10313
- expanded=${bIsExpanded}`;
10748
+ [1, 4].forEach((iCount) => {
10749
+ const sTitle = `move: created=${bCreated}, direction=${iDirection},
10750
+ expanded=${bIsExpanded}, child nodes added=${iCount}`;
10314
10751
 
10315
10752
  QUnit.test(sTitle, function (assert) {
10316
10753
  const iParentIndex = 42;
@@ -10331,7 +10768,8 @@ sap.ui.define([
10331
10768
  this.mock(oChildContext).expects("getCanonicalPath").withExactArgs().returns("/~child~");
10332
10769
  const oParentContext = {
10333
10770
  iIndex : iParentIndex,
10334
- getCanonicalPath : mustBeMocked
10771
+ getCanonicalPath : mustBeMocked,
10772
+ getModelIndex : mustBeMocked
10335
10773
  };
10336
10774
  this.mock(oParentContext).expects("getCanonicalPath").withExactArgs().returns("/~parent~");
10337
10775
  const oBinding = this.bindList("/EMPLOYEES");
@@ -10348,6 +10786,10 @@ sap.ui.define([
10348
10786
  .withExactArgs("~oGroupLock~", "~child~", "~parent~")
10349
10787
  .returns(new SyncPromise((resolve) => {
10350
10788
  setTimeout(() => {
10789
+ this.mock(oParentContext).expects("getModelIndex").exactly(iCount > 1 ? 1 : 0)
10790
+ .withExactArgs().returns("~iModelIndex~");
10791
+ this.mock(oBinding).expects("insertGap").exactly(iCount > 1 ? 1 : 0)
10792
+ .withExactArgs("~iModelIndex~", iCount - 1);
10351
10793
  for (let i = 0; i < 100; i += 1) {
10352
10794
  if (i % 5) {
10353
10795
  oBinding.aContexts[i] = {iIndex : i};
@@ -10360,11 +10802,12 @@ sap.ui.define([
10360
10802
  this.mock(oChildContext).expects("setCreatedPersisted")
10361
10803
  .exactly(bCreated ? 0 : 1).withExactArgs();
10362
10804
  this.mock(oBinding).expects("expand").exactly(bIsExpanded ? 1 : 0)
10363
- .withExactArgs(sinon.match.same(oChildContext));
10805
+ .withExactArgs(sinon.match.same(oChildContext))
10806
+ .returns(SyncPromise.resolve());
10364
10807
  this.mock(oBinding).expects("_fireChange").exactly(bIsExpanded ? 0 : 1)
10365
10808
  .withExactArgs({reason : ChangeReason.Change});
10366
10809
 
10367
- resolve("n/a");
10810
+ resolve(iCount);
10368
10811
  }, 0);
10369
10812
  }));
10370
10813
 
@@ -10389,25 +10832,76 @@ sap.ui.define([
10389
10832
  }
10390
10833
  });
10391
10834
  });
10835
+ });
10392
10836
  });
10393
10837
  });
10394
10838
  });
10395
10839
 
10396
10840
  //*********************************************************************************************
10397
- QUnit.test("move: fails", function (assert) {
10841
+ [false, true].forEach((bIsExpanded) => {
10842
+ [false, true].forEach((bExpandFails) => {
10843
+ const sTitle = `move: fails, expanded=${bIsExpanded}, expand fails=${bExpandFails}`;
10844
+
10845
+ if (bExpandFails && !bIsExpanded) {
10846
+ return;
10847
+ }
10848
+
10849
+ QUnit.test(sTitle, function (assert) {
10850
+ const oChildContext = {
10851
+ getCanonicalPath : mustBeMocked,
10852
+ isExpanded : mustBeMocked
10853
+ };
10854
+ this.mock(oChildContext).expects("isExpanded").withExactArgs().returns(bIsExpanded);
10855
+ this.mock(oChildContext).expects("getCanonicalPath").withExactArgs().returns("/~child~");
10856
+ const oParentContext = {
10857
+ getCanonicalPath : mustBeMocked
10858
+ };
10859
+ this.mock(oParentContext).expects("getCanonicalPath").withExactArgs().returns("/~parent~");
10860
+ const oBinding = this.bindList("/EMPLOYEES");
10861
+ this.mock(oBinding).expects("collapse").exactly(bIsExpanded ? 1 : 0)
10862
+ .withExactArgs(sinon.match.same(oChildContext), true);
10863
+ this.mock(oBinding).expects("getUpdateGroupId").withExactArgs().returns("~group~");
10864
+ this.mock(oBinding).expects("lockGroup").withExactArgs("~group~", true, true)
10865
+ .returns("~oGroupLock~");
10866
+ const oCache = {
10867
+ move : mustBeMocked
10868
+ };
10869
+ oBinding.oCache = oCache;
10870
+ this.mock(oCache).expects("move").withExactArgs("~oGroupLock~", "~child~", "~parent~")
10871
+ .returns(SyncPromise.reject("~error~"));
10872
+ this.mock(oBinding).expects("expand").exactly(bIsExpanded ? 1 : 0)
10873
+ .withExactArgs(sinon.match.same(oChildContext), true)
10874
+ .returns(bExpandFails ? SyncPromise.reject("~expandError~") : SyncPromise.resolve());
10875
+
10876
+ // code under test
10877
+ const oSyncPromise = oBinding.move(oChildContext, oParentContext);
10878
+
10879
+ assert.strictEqual(oSyncPromise.isRejected(), true);
10880
+ assert.strictEqual(oSyncPromise.getResult(), bExpandFails ? "~expandError~" : "~error~");
10881
+
10882
+ oSyncPromise.caught(); // avoid "Uncaught (in promise)"
10883
+ });
10884
+ });
10885
+ });
10886
+
10887
+ //*********************************************************************************************
10888
+ QUnit.test("move: expand fails", function (assert) {
10398
10889
  const oChildContext = {
10890
+ iIndex : 43,
10891
+ created : mustBeMocked,
10399
10892
  getCanonicalPath : mustBeMocked,
10400
10893
  isExpanded : mustBeMocked
10401
10894
  };
10402
- this.mock(oChildContext).expects("isExpanded").withExactArgs().returns(false);
10895
+ this.mock(oChildContext).expects("isExpanded").withExactArgs().returns(true);
10403
10896
  this.mock(oChildContext).expects("getCanonicalPath").withExactArgs().returns("/~child~");
10404
10897
  const oParentContext = {
10898
+ iIndex : 42,
10405
10899
  getCanonicalPath : mustBeMocked
10406
10900
  };
10407
10901
  this.mock(oParentContext).expects("getCanonicalPath").withExactArgs().returns("/~parent~");
10408
10902
  const oBinding = this.bindList("/EMPLOYEES");
10409
- this.mock(oBinding).expects("collapse").never();
10410
- this.mock(oBinding).expects("expand").never();
10903
+ this.mock(oBinding).expects("collapse")
10904
+ .withExactArgs(sinon.match.same(oChildContext), true);
10411
10905
  this.mock(oBinding).expects("getUpdateGroupId").withExactArgs().returns("~group~");
10412
10906
  this.mock(oBinding).expects("lockGroup").withExactArgs("~group~", true, true)
10413
10907
  .returns("~oGroupLock~");
@@ -10416,7 +10910,15 @@ sap.ui.define([
10416
10910
  };
10417
10911
  oBinding.oCache = oCache;
10418
10912
  this.mock(oCache).expects("move").withExactArgs("~oGroupLock~", "~child~", "~parent~")
10913
+ .returns(SyncPromise.resolve(1));
10914
+ this.mock(oBinding).expects("insertGap").never();
10915
+ oBinding.aContexts[43] = oChildContext;
10916
+ oBinding.aContexts[42] = oParentContext;
10917
+ this.mock(oChildContext).expects("created").withExactArgs().returns(true);
10918
+ this.mock(oBinding).expects("expand")
10919
+ .withExactArgs(sinon.match.same(oChildContext))
10419
10920
  .returns(SyncPromise.reject("~error~"));
10921
+ this.mock(oBinding).expects("_fireChange").never();
10420
10922
 
10421
10923
  // code under test
10422
10924
  const oSyncPromise = oBinding.move(oChildContext, oParentContext);