@openui5/sap.ui.core 1.94.0 → 1.97.0

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 (417) hide show
  1. package/.eslintrc.json +15 -4
  2. package/.reuse/dep5 +12 -12
  3. package/THIRDPARTY.txt +21 -17
  4. package/package.json +1 -1
  5. package/src/jquery.sap.global.js +1 -1
  6. package/src/jquery.sap.properties.js +1 -1
  7. package/src/jquery.sap.resources.js +2 -2
  8. package/src/jquery.sap.script.js +1 -1
  9. package/src/jquery.sap.storage.js +3 -3
  10. package/src/sap/base/i18n/ResourceBundle.js +6 -2
  11. package/src/sap/base/util/restricted/_CancelablePromise.js +1 -1
  12. package/src/sap/base/util/restricted/_castArray.js +1 -1
  13. package/src/sap/base/util/restricted/_compact.js +1 -1
  14. package/src/sap/base/util/restricted/_curry.js +1 -1
  15. package/src/sap/base/util/restricted/_debounce.js +1 -1
  16. package/src/sap/base/util/restricted/_difference.js +1 -1
  17. package/src/sap/base/util/restricted/_differenceBy.js +1 -1
  18. package/src/sap/base/util/restricted/_differenceWith.js +1 -1
  19. package/src/sap/base/util/restricted/_flatMap.js +1 -1
  20. package/src/sap/base/util/restricted/_flatMapDeep.js +1 -1
  21. package/src/sap/base/util/restricted/_flatMapDepth.js +1 -1
  22. package/src/sap/base/util/restricted/_flatten.js +1 -1
  23. package/src/sap/base/util/restricted/_flattenDeep.js +1 -1
  24. package/src/sap/base/util/restricted/_flattenDepth.js +1 -1
  25. package/src/sap/base/util/restricted/_intersection.js +1 -1
  26. package/src/sap/base/util/restricted/_intersectionBy.js +1 -1
  27. package/src/sap/base/util/restricted/_intersectionWith.js +1 -1
  28. package/src/sap/base/util/restricted/_isEqual.js +1 -1
  29. package/src/sap/base/util/restricted/_isEqualWith.js +1 -1
  30. package/src/sap/base/util/restricted/_isNil.js +1 -1
  31. package/src/sap/base/util/restricted/_max.js +1 -1
  32. package/src/sap/base/util/restricted/_merge.js +1 -1
  33. package/src/sap/base/util/restricted/_mergeWith.js +1 -1
  34. package/src/sap/base/util/restricted/_min.js +1 -1
  35. package/src/sap/base/util/restricted/_omit.js +1 -1
  36. package/src/sap/base/util/restricted/_pick.js +1 -1
  37. package/src/sap/base/util/restricted/_pickBy.js +1 -1
  38. package/src/sap/base/util/restricted/_throttle.js +1 -1
  39. package/src/sap/base/util/restricted/_toArray.js +1 -1
  40. package/src/sap/base/util/restricted/_union.js +1 -1
  41. package/src/sap/base/util/restricted/_unionBy.js +1 -1
  42. package/src/sap/base/util/restricted/_unionWith.js +1 -1
  43. package/src/sap/base/util/restricted/_uniq.js +1 -1
  44. package/src/sap/base/util/restricted/_uniqBy.js +1 -1
  45. package/src/sap/base/util/restricted/_uniqWith.js +1 -1
  46. package/src/sap/base/util/restricted/_without.js +1 -1
  47. package/src/sap/base/util/restricted/_xor.js +1 -1
  48. package/src/sap/base/util/restricted/_xorBy.js +1 -1
  49. package/src/sap/base/util/restricted/_xorWith.js +1 -1
  50. package/src/sap/base/util/restricted/_zipObject.js +1 -1
  51. package/src/sap/base/util/restricted/_zipObjectDeep.js +1 -1
  52. package/src/sap/ui/Device.js +15 -11
  53. package/src/sap/ui/Global.js +13 -17
  54. package/src/sap/ui/base/DataType.js +14 -8
  55. package/src/sap/ui/base/Event.js +1 -1
  56. package/src/sap/ui/base/EventProvider.js +1 -1
  57. package/src/sap/ui/base/Interface.js +1 -1
  58. package/src/sap/ui/base/ManagedObject.js +13 -8
  59. package/src/sap/ui/base/ManagedObjectMetadata.js +2 -2
  60. package/src/sap/ui/base/Metadata.js +1 -3
  61. package/src/sap/ui/base/Object.js +1 -1
  62. package/src/sap/ui/base/ObjectPool.js +1 -1
  63. package/src/sap/ui/core/.library +6 -32
  64. package/src/sap/ui/core/AppCacheBuster.js +8 -8
  65. package/src/sap/ui/core/BusyIndicator.js +1 -1
  66. package/src/sap/ui/core/Component.js +303 -135
  67. package/src/sap/ui/core/ComponentContainer.js +11 -7
  68. package/src/sap/ui/core/ComponentMetadata.js +1 -1
  69. package/src/sap/ui/core/ComponentSupport.js +1 -1
  70. package/src/sap/ui/core/Configuration.js +67 -31
  71. package/src/sap/ui/core/Control.js +2 -2
  72. package/src/sap/ui/core/Core.js +79 -15
  73. package/src/sap/ui/core/CustomData.js +1 -1
  74. package/src/sap/ui/core/DeclarativeSupport.js +1 -1
  75. package/src/sap/ui/core/Element.js +2 -6
  76. package/src/sap/ui/core/ElementMetadata.js +1 -1
  77. package/src/sap/ui/core/EnabledPropagator.js +1 -1
  78. package/src/sap/ui/core/EventBus.js +1 -1
  79. package/src/sap/ui/core/ExtensionPoint.js +6 -13
  80. package/src/sap/ui/core/Fragment.js +30 -32
  81. package/src/sap/ui/core/HTML.js +3 -3
  82. package/src/sap/ui/core/History.js +1 -1
  83. package/src/sap/ui/core/Icon.js +7 -8
  84. package/src/sap/ui/core/IconPool.js +26 -1097
  85. package/src/sap/ui/core/IconRenderer.js +6 -6
  86. package/src/sap/ui/core/IndicationColorSupport.js +1 -1
  87. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  88. package/src/sap/ui/core/InvisibleMessage.js +1 -1
  89. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  90. package/src/sap/ui/core/InvisibleText.js +1 -1
  91. package/src/sap/ui/core/Item.js +1 -1
  92. package/src/sap/ui/core/LabelEnablement.js +1 -1
  93. package/src/sap/ui/core/LayoutData.js +1 -1
  94. package/src/sap/ui/core/ListItem.js +1 -1
  95. package/src/sap/ui/core/LocalBusyIndicator.js +1 -1
  96. package/src/sap/ui/core/Locale.js +26 -4
  97. package/src/sap/ui/core/LocaleData.js +3 -3
  98. package/src/sap/ui/core/Manifest.js +2 -60
  99. package/src/sap/ui/core/Message.js +1 -1
  100. package/src/sap/ui/core/Patcher.js +27 -3
  101. package/src/sap/ui/core/Placeholder.js +4 -4
  102. package/src/sap/ui/core/RenderManager.js +38 -8
  103. package/src/sap/ui/core/Renderer.js +13 -3
  104. package/src/sap/ui/core/ResizeHandler.js +1 -1
  105. package/src/sap/ui/core/ScrollBar.js +4 -3
  106. package/src/sap/ui/core/SeparatorItem.js +1 -1
  107. package/src/sap/ui/core/ShortcutHintsMixin.js +14 -7
  108. package/src/sap/ui/core/ThemeCheck.js +2 -2
  109. package/src/sap/ui/core/Title.js +1 -1
  110. package/src/sap/ui/core/TooltipBase.js +1 -1
  111. package/src/sap/ui/core/UIArea.js +3 -3
  112. package/src/sap/ui/core/UIComponent.js +19 -11
  113. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  114. package/src/sap/ui/core/ValueStateSupport.js +1 -1
  115. package/src/sap/ui/core/VariantLayoutData.js +1 -1
  116. package/src/sap/ui/core/XMLComposite.js +2 -2
  117. package/src/sap/ui/core/XMLCompositeMetadata.js +2 -2
  118. package/src/sap/ui/core/XMLTemplateProcessor.js +132 -43
  119. package/src/sap/ui/core/_IconRegistry.js +1148 -0
  120. package/src/sap/ui/core/cache/LRUPersistentCache.js +4 -2
  121. package/src/sap/ui/core/date/UniversalDateUtils.js +33 -0
  122. package/src/sap/ui/core/delegate/ItemNavigation.js +1 -1
  123. package/src/sap/ui/core/delegate/ScrollEnablement.js +1 -1
  124. package/src/sap/ui/core/dnd/DragDropBase.js +1 -1
  125. package/src/sap/ui/core/dnd/DragDropInfo.js +1 -1
  126. package/src/sap/ui/core/dnd/DragInfo.js +1 -1
  127. package/src/sap/ui/core/dnd/DropInfo.js +1 -1
  128. package/src/sap/ui/core/format/NumberFormat.js +16 -1
  129. package/src/sap/ui/core/hyphenation/Hyphenation.js +61 -80
  130. package/src/sap/ui/core/library.js +5 -5
  131. package/src/sap/ui/core/message/ControlMessageProcessor.js +5 -5
  132. package/src/sap/ui/core/message/Message.js +1 -1
  133. package/src/sap/ui/core/message/MessageManager.js +13 -15
  134. package/src/sap/ui/core/message/MessageParser.js +1 -1
  135. package/src/sap/ui/core/message/MessageProcessor.js +22 -12
  136. package/src/sap/ui/core/messagebundle_de.properties +1 -1
  137. package/src/sap/ui/core/messagebundle_fr.properties +8 -8
  138. package/src/sap/ui/core/messagebundle_it.properties +1 -1
  139. package/src/sap/ui/core/messagebundle_pl.properties +1 -1
  140. package/src/sap/ui/core/messagebundle_ru.properties +21 -21
  141. package/src/sap/ui/core/messagebundle_th.properties +2 -2
  142. package/src/sap/ui/core/mvc/Controller.js +5 -5
  143. package/src/sap/ui/core/mvc/ControllerExtensionProvider.js +30 -32
  144. package/src/sap/ui/core/mvc/ControllerMetadata.js +18 -18
  145. package/src/sap/ui/core/mvc/HTMLView.js +2 -2
  146. package/src/sap/ui/core/mvc/JSONView.js +2 -2
  147. package/src/sap/ui/core/mvc/JSView.js +2 -2
  148. package/src/sap/ui/core/mvc/TemplateView.js +2 -2
  149. package/src/sap/ui/core/mvc/View.js +58 -85
  150. package/src/sap/ui/core/mvc/XMLView.js +2 -2
  151. package/src/sap/ui/core/mvc/XMLViewRenderer.js +17 -20
  152. package/src/sap/ui/core/plugin/DeclarativeSupport.js +1 -1
  153. package/src/sap/ui/core/plugin/LessSupport.js +1 -1
  154. package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
  155. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  156. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  157. package/src/sap/ui/core/routing/Route.js +10 -1
  158. package/src/sap/ui/core/routing/Router.js +16 -6
  159. package/src/sap/ui/core/routing/Targets.js +26 -0
  160. package/src/sap/ui/core/routing/async/Route.js +6 -3
  161. package/src/sap/ui/core/routing/async/Target.js +28 -4
  162. package/src/sap/ui/core/routing/sync/Target.js +15 -0
  163. package/src/sap/ui/core/rules/Misc.support.js +51 -1
  164. package/src/sap/ui/core/rules/Rendering.support.js +1 -4
  165. package/src/sap/ui/core/rules/View.support.js +14 -46
  166. package/src/sap/ui/core/search/OpenSearchProvider.js +1 -1
  167. package/src/sap/ui/core/search/SearchProvider.js +1 -1
  168. package/src/sap/ui/core/service/Service.js +1 -1
  169. package/src/sap/ui/core/service/ServiceFactory.js +1 -1
  170. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  171. package/src/sap/ui/core/support/Plugin.js +2 -2
  172. package/src/sap/ui/core/support/RuleEngineOpaExtension.js +0 -1
  173. package/src/sap/ui/core/support/Support.js +1 -1
  174. package/src/sap/ui/core/support/controls/TreeViewer.js +1 -1
  175. package/src/sap/ui/core/support/plugins/ControlTree.js +37 -43
  176. package/src/sap/ui/core/support/plugins/Interaction.js +1 -1
  177. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  178. package/src/sap/ui/core/support/plugins/Performance.js +1 -2
  179. package/src/sap/ui/core/support/plugins/Selector.js +1 -1
  180. package/src/sap/ui/core/support/plugins/TechInfo.js +1 -1
  181. package/src/sap/ui/core/support/plugins/Trace.js +1 -1
  182. package/src/sap/ui/core/support/plugins/ViewInfo.js +2 -2
  183. package/src/sap/ui/core/support/support.css +2 -8
  184. package/src/sap/ui/core/support/techinfo/TechnicalInfo.fragment.xml +1 -0
  185. package/src/sap/ui/core/support/techinfo/TechnicalInfo.js +150 -73
  186. package/src/sap/ui/core/support/trace/E2eTraceLib.js +3 -3
  187. package/src/sap/ui/core/themes/base/Icon.less +9 -0
  188. package/src/sap/ui/core/themes/base/SAP-icons.css +2 -0
  189. package/src/sap/ui/core/themes/base/SAP-icons.less +10 -0
  190. package/src/sap/ui/core/themes/base/base.less +543 -390
  191. package/src/sap/ui/core/themes/base/fonts/SAP-icons.woff2 +0 -0
  192. package/src/sap/ui/core/themes/base/global.less +38 -0
  193. package/src/sap/ui/core/themes/base/library.source.less +1 -2
  194. package/src/sap/ui/core/themes/sap_hcb/global.less +34 -0
  195. package/src/sap/ui/core/theming/Parameters.js +21 -0
  196. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
  197. package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
  198. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
  199. package/src/sap/ui/core/tmpl/Template.js +1 -1
  200. package/src/sap/ui/core/tmpl/TemplateControl.js +1 -1
  201. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  202. package/src/sap/ui/core/util/Export.js +1 -1
  203. package/src/sap/ui/core/util/ExportCell.js +1 -1
  204. package/src/sap/ui/core/util/ExportColumn.js +1 -1
  205. package/src/sap/ui/core/util/ExportRow.js +1 -1
  206. package/src/sap/ui/core/util/ExportType.js +1 -1
  207. package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
  208. package/src/sap/ui/core/util/File.js +1 -1
  209. package/src/sap/ui/core/util/LibraryInfo.js +1 -1
  210. package/src/sap/ui/core/util/MockServer.js +2 -2
  211. package/src/sap/ui/core/util/PasteHelper.js +1 -1
  212. package/src/sap/ui/core/util/XMLPreprocessor.js +11 -12
  213. package/src/sap/ui/core/util/reflection/JsControlTreeModifier.js +10 -12
  214. package/src/sap/ui/core/util/reflection/XmlTreeModifier.js +6 -3
  215. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  216. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  217. package/src/sap/ui/core/util/serializer/ViewSerializer.js +1 -1
  218. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  219. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  220. package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
  221. package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
  222. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  223. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  224. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  225. package/src/sap/ui/debug/ControlTree.js +1 -1
  226. package/src/sap/ui/debug/DebugEnv.js +1 -1
  227. package/src/sap/ui/debug/Highlighter.js +8 -2
  228. package/src/sap/ui/debug/PropertyList.js +1 -1
  229. package/src/sap/ui/model/Binding.js +174 -118
  230. package/src/sap/ui/model/ChangeReason.js +1 -1
  231. package/src/sap/ui/model/ClientContextBinding.js +1 -1
  232. package/src/sap/ui/model/ClientListBinding.js +8 -3
  233. package/src/sap/ui/model/ClientModel.js +9 -8
  234. package/src/sap/ui/model/ClientPropertyBinding.js +4 -2
  235. package/src/sap/ui/model/ClientTreeBinding.js +15 -9
  236. package/src/sap/ui/model/ClientTreeBindingAdapter.js +28 -23
  237. package/src/sap/ui/model/CompositeBinding.js +98 -77
  238. package/src/sap/ui/model/CompositeDataState.js +2 -2
  239. package/src/sap/ui/model/CompositeType.js +2 -2
  240. package/src/sap/ui/model/Context.js +4 -2
  241. package/src/sap/ui/model/ContextBinding.js +6 -14
  242. package/src/sap/ui/model/DataState.js +2 -2
  243. package/src/sap/ui/model/Filter.js +255 -53
  244. package/src/sap/ui/model/FilterOperator.js +1 -1
  245. package/src/sap/ui/model/FilterProcessor.js +27 -17
  246. package/src/sap/ui/model/FilterType.js +1 -1
  247. package/src/sap/ui/model/ListBinding.js +200 -118
  248. package/src/sap/ui/model/MetaModel.js +4 -9
  249. package/src/sap/ui/model/Model.js +349 -303
  250. package/src/sap/ui/model/PropertyBinding.js +92 -58
  251. package/src/sap/ui/model/SelectionModel.js +2 -2
  252. package/src/sap/ui/model/SimpleType.js +2 -2
  253. package/src/sap/ui/model/Sorter.js +1 -1
  254. package/src/sap/ui/model/SorterProcessor.js +1 -1
  255. package/src/sap/ui/model/StaticBinding.js +1 -1
  256. package/src/sap/ui/model/TreeAutoExpandMode.js +2 -2
  257. package/src/sap/ui/model/TreeBinding.js +1 -1
  258. package/src/sap/ui/model/TreeBindingAdapter.js +249 -100
  259. package/src/sap/ui/model/TreeBindingCompatibilityAdapter.js +16 -9
  260. package/src/sap/ui/model/TreeBindingUtils.js +3 -0
  261. package/src/sap/ui/model/Type.js +1 -1
  262. package/src/sap/ui/model/analytics/AnalyticalBinding.js +20 -10
  263. package/src/sap/ui/model/analytics/AnalyticalTreeBindingAdapter.js +17 -19
  264. package/src/sap/ui/model/analytics/AnalyticalVersionInfo.js +1 -1
  265. package/src/sap/ui/model/analytics/BatchResponseCollector.js +1 -1
  266. package/src/sap/ui/model/analytics/ODataModelAdapter.js +1 -1
  267. package/src/sap/ui/model/analytics/odata4analytics.js +3 -2
  268. package/src/sap/ui/model/base/ManagedObjectModel.js +4 -0
  269. package/src/sap/ui/model/json/JSONListBinding.js +8 -5
  270. package/src/sap/ui/model/json/JSONModel.js +29 -20
  271. package/src/sap/ui/model/json/JSONPropertyBinding.js +5 -4
  272. package/src/sap/ui/model/json/JSONTreeBinding.js +1 -1
  273. package/src/sap/ui/model/message/MessageListBinding.js +6 -3
  274. package/src/sap/ui/model/message/MessageModel.js +25 -17
  275. package/src/sap/ui/model/message/MessagePropertyBinding.js +3 -3
  276. package/src/sap/ui/model/odata/AnnotationHelper.js +3 -3
  277. package/src/sap/ui/model/odata/AnnotationParser.js +5 -3
  278. package/src/sap/ui/model/odata/CountMode.js +1 -1
  279. package/src/sap/ui/model/odata/Filter.js +1 -1
  280. package/src/sap/ui/model/odata/ODataAnnotations.js +2 -2
  281. package/src/sap/ui/model/odata/ODataContextBinding.js +1 -1
  282. package/src/sap/ui/model/odata/ODataListBinding.js +62 -39
  283. package/src/sap/ui/model/odata/ODataMessageParser.js +3 -3
  284. package/src/sap/ui/model/odata/ODataMetaModel.js +6 -4
  285. package/src/sap/ui/model/odata/ODataMetadata.js +137 -86
  286. package/src/sap/ui/model/odata/ODataModel.js +443 -216
  287. package/src/sap/ui/model/odata/ODataPropertyBinding.js +8 -6
  288. package/src/sap/ui/model/odata/ODataTreeBinding.js +65 -33
  289. package/src/sap/ui/model/odata/ODataTreeBindingAdapter.js +28 -18
  290. package/src/sap/ui/model/odata/ODataTreeBindingFlat.js +442 -262
  291. package/src/sap/ui/model/odata/ODataUtils.js +36 -19
  292. package/src/sap/ui/model/odata/OperationMode.js +1 -1
  293. package/src/sap/ui/model/odata/_AnnotationHelperBasics.js +2 -1
  294. package/src/sap/ui/model/odata/_AnnotationHelperExpression.js +11 -9
  295. package/src/sap/ui/model/odata/_ODataMetaModelUtils.js +6 -4
  296. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  297. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  298. package/src/sap/ui/model/odata/type/Currency.js +1 -1
  299. package/src/sap/ui/model/odata/type/Date.js +1 -1
  300. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  301. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  302. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  303. package/src/sap/ui/model/odata/type/Decimal.js +5 -1
  304. package/src/sap/ui/model/odata/type/Double.js +1 -1
  305. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  306. package/src/sap/ui/model/odata/type/Int.js +1 -1
  307. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  308. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  309. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  310. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  311. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  312. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  313. package/src/sap/ui/model/odata/type/Single.js +1 -1
  314. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  315. package/src/sap/ui/model/odata/type/String.js +1 -1
  316. package/src/sap/ui/model/odata/type/Time.js +1 -1
  317. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  318. package/src/sap/ui/model/odata/type/Unit.js +1 -1
  319. package/src/sap/ui/model/odata/type/UnitMixin.js +0 -1
  320. package/src/sap/ui/model/odata/v2/Context.js +98 -17
  321. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +2 -2
  322. package/src/sap/ui/model/odata/v2/ODataContextBinding.js +1 -1
  323. package/src/sap/ui/model/odata/v2/ODataListBinding.js +416 -132
  324. package/src/sap/ui/model/odata/v2/ODataModel.js +465 -250
  325. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +191 -109
  326. package/src/sap/ui/model/odata/v2/_CreatedContextsCache.js +179 -0
  327. package/src/sap/ui/model/odata/v4/Context.js +48 -7
  328. package/src/sap/ui/model/odata/v4/ODataBinding.js +60 -30
  329. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +177 -53
  330. package/src/sap/ui/model/odata/v4/ODataListBinding.js +304 -91
  331. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +32 -20
  332. package/src/sap/ui/model/odata/v4/ODataModel.js +29 -15
  333. package/src/sap/ui/model/odata/v4/ODataParentBinding.js +83 -51
  334. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +13 -9
  335. package/src/sap/ui/model/odata/v4/lib/_Cache.js +115 -19
  336. package/src/sap/ui/model/odata/v4/lib/_Helper.js +35 -5
  337. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +50 -5
  338. package/src/sap/ui/model/resource/ResourceModel.js +6 -2
  339. package/src/sap/ui/model/resource/ResourcePropertyBinding.js +1 -1
  340. package/src/sap/ui/model/type/Boolean.js +2 -2
  341. package/src/sap/ui/model/type/Currency.js +2 -2
  342. package/src/sap/ui/model/type/Date.js +9 -3
  343. package/src/sap/ui/model/type/DateInterval.js +4 -2
  344. package/src/sap/ui/model/type/DateTime.js +2 -2
  345. package/src/sap/ui/model/type/DateTimeInterval.js +2 -2
  346. package/src/sap/ui/model/type/FileSize.js +4 -2
  347. package/src/sap/ui/model/type/Float.js +4 -2
  348. package/src/sap/ui/model/type/Integer.js +4 -2
  349. package/src/sap/ui/model/type/String.js +2 -2
  350. package/src/sap/ui/model/type/Time.js +2 -2
  351. package/src/sap/ui/model/type/TimeInterval.js +2 -2
  352. package/src/sap/ui/model/type/Unit.js +14 -7
  353. package/src/sap/ui/model/xml/XMLListBinding.js +15 -9
  354. package/src/sap/ui/model/xml/XMLModel.js +74 -45
  355. package/src/sap/ui/model/xml/XMLPropertyBinding.js +5 -5
  356. package/src/sap/ui/model/xml/XMLTreeBinding.js +5 -4
  357. package/src/sap/ui/performance/trace/Interaction.js +30 -15
  358. package/src/sap/ui/qunit/QUnitUtils.js +3 -2
  359. package/src/sap/ui/qunit/utils/ControlIterator.js +1 -1
  360. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +9 -11
  361. package/src/sap/ui/test/TestUtils.js +11 -4
  362. package/src/sap/ui/test/actions/Action.js +9 -2
  363. package/src/sap/ui/test/actions/Press.js +28 -1
  364. package/src/sap/ui/test/generic/_EnforceSemanticRendering.js +111 -0
  365. package/src/sap/ui/test/matchers/I18NText.js +29 -11
  366. package/src/sap/ui/test/opaQunit.js +5 -0
  367. package/src/sap/ui/thirdparty/IPv6.js +2 -2
  368. package/src/sap/ui/thirdparty/SecondLevelDomains.js +2 -2
  369. package/src/sap/ui/thirdparty/URI.js +14 -5
  370. package/src/sap/ui/thirdparty/URITemplate.js +2 -2
  371. package/src/sap/ui/thirdparty/hyphenopoly/Hyphenopoly.js +1196 -0
  372. package/src/sap/ui/thirdparty/hyphenopoly/Hyphenopoly_Loader.js +797 -0
  373. package/src/sap/ui/thirdparty/hyphenopoly/hyphenEngine.asm.js +108 -127
  374. package/src/sap/ui/thirdparty/hyphenopoly/hyphenEngine.wasm +0 -0
  375. package/src/sap/ui/thirdparty/hyphenopoly/patterns/bg.hpb +0 -0
  376. package/src/sap/ui/thirdparty/hyphenopoly/patterns/ca.hpb +0 -0
  377. package/src/sap/ui/thirdparty/hyphenopoly/patterns/da.hpb +0 -0
  378. package/src/sap/ui/thirdparty/hyphenopoly/patterns/de.hpb +0 -0
  379. package/src/sap/ui/thirdparty/hyphenopoly/patterns/el-monoton.hpb +0 -0
  380. package/src/sap/ui/thirdparty/hyphenopoly/patterns/en-us.hpb +0 -0
  381. package/src/sap/ui/thirdparty/hyphenopoly/patterns/es.hpb +0 -0
  382. package/src/sap/ui/thirdparty/hyphenopoly/patterns/et.hpb +0 -0
  383. package/src/sap/ui/thirdparty/hyphenopoly/patterns/fi.hpb +0 -0
  384. package/src/sap/ui/thirdparty/hyphenopoly/patterns/fr.hpb +0 -0
  385. package/src/sap/ui/thirdparty/hyphenopoly/patterns/hi.hpb +0 -0
  386. package/src/sap/ui/thirdparty/hyphenopoly/patterns/hr.hpb +0 -0
  387. package/src/sap/ui/thirdparty/hyphenopoly/patterns/hu.hpb +0 -0
  388. package/src/sap/ui/thirdparty/hyphenopoly/patterns/it.hpb +0 -0
  389. package/src/sap/ui/thirdparty/hyphenopoly/patterns/lt.hpb +0 -0
  390. package/src/sap/ui/thirdparty/hyphenopoly/patterns/nb-no.hpb +0 -0
  391. package/src/sap/ui/thirdparty/hyphenopoly/patterns/nl.hpb +0 -0
  392. package/src/sap/ui/thirdparty/hyphenopoly/patterns/pt.hpb +0 -0
  393. package/src/sap/ui/thirdparty/hyphenopoly/patterns/ru.hpb +0 -0
  394. package/src/sap/ui/thirdparty/hyphenopoly/patterns/sl.hpb +0 -0
  395. package/src/sap/ui/thirdparty/hyphenopoly/patterns/sv.hpb +0 -0
  396. package/src/sap/ui/thirdparty/hyphenopoly/patterns/th.hpb +0 -0
  397. package/src/sap/ui/thirdparty/hyphenopoly/patterns/tr.hpb +0 -0
  398. package/src/sap/ui/thirdparty/hyphenopoly/patterns/uk.hpb +0 -0
  399. package/src/sap/ui/thirdparty/jquery.js +9 -1
  400. package/src/sap/ui/thirdparty/qunit-2.js +1 -1
  401. package/src/sap/ui/thirdparty/qunit.js +1 -1
  402. package/src/sap/ui/util/Mobile.js +30 -59
  403. package/src/sap/ui/util/Storage.js +1 -1
  404. package/src/sap/ui/util/isCrossOriginURL.js +16 -6
  405. package/src/ui5loader.js +6 -6
  406. package/ui5.yaml +248 -2
  407. package/src/sap/ui/core/CustomizingConfiguration.js +0 -272
  408. package/src/sap/ui/core/support/plugins/MessageTest.js +0 -96
  409. package/src/sap/ui/thirdparty/baseuri.js +0 -1
  410. package/src/sap/ui/thirdparty/es6-object-assign.js +0 -1
  411. package/src/sap/ui/thirdparty/es6-promise.js +0 -1
  412. package/src/sap/ui/thirdparty/es6-shim-nopromise.js +0 -1
  413. package/src/sap/ui/thirdparty/es6-string-methods.js +0 -1
  414. package/src/sap/ui/thirdparty/flexie.js +0 -1
  415. package/src/sap/ui/thirdparty/hyphenopoly/hyphenopoly.bundle.js +0 -860
  416. package/src/sap/ui/thirdparty/unorm.js +0 -1
  417. package/src/sap/ui/thirdparty/unormdata.js +0 -1
@@ -228,7 +228,7 @@ sap.ui.define([
228
228
  * @extends sap.ui.base.ManagedObject
229
229
  * @abstract
230
230
  * @author SAP SE
231
- * @version 1.94.0
231
+ * @version 1.97.0
232
232
  * @alias sap.ui.core.Component
233
233
  * @since 1.9.2
234
234
  */
@@ -383,6 +383,64 @@ sap.ui.define([
383
383
  }
384
384
  });
385
385
 
386
+ /**
387
+ * Helper function to retrieve owner (extension) component holding the customizing configuration.
388
+ * @param {string|sap.ui.core.Component|sap.ui.base.ManagedObject} vObject Component Id, component instance or ManagedObject
389
+ * @throws {Error} If 'getExtensionComponent' function is given, but does not return an instance.
390
+ * @returns {sap.ui.core.Component|undefined} The owner component or <code>undefined</code>
391
+ */
392
+ function getCustomizingComponent(vObject) {
393
+ var oComponent, sComponentId;
394
+
395
+ if (!sap.ui.getCore().getConfiguration().getDisableCustomizing()) {
396
+ if (typeof vObject === "string") {
397
+ sComponentId = vObject;
398
+ } else if (vObject && typeof vObject.isA === "function" && !vObject.isA("sap.ui.core.Component")) {
399
+ sComponentId = Component.getOwnerIdFor(vObject);
400
+ } else {
401
+ oComponent = vObject;
402
+ }
403
+
404
+ if (sComponentId) {
405
+ oComponent = Component.get(sComponentId);
406
+ }
407
+
408
+ if (oComponent) {
409
+ if (oComponent.getExtensionComponent) {
410
+ oComponent = oComponent.getExtensionComponent();
411
+ if (!oComponent) {
412
+ throw new Error("getExtensionComponent() must return an instance.");
413
+ }
414
+ }
415
+ }
416
+ }
417
+ return oComponent;
418
+ }
419
+
420
+ /**
421
+ * @param {string|sap.ui.base.ManagedObject|sap.ui.core.Component} vObject Either Component Id, ManagedObject or component instance
422
+ * @param {object} mOptions Info object to retrieve the customizing config
423
+ * @param {object} mOptions.type Either <code>sap.ui.viewExtension</code>, <code>sap.ui.controllerReplacement</code>, <code>sap.ui.viewReplacement</code>, <code>sap.ui.viewModification</code> or <code>sap.ui.controllerExtension</code>
424
+ * @param {object} mOptions.name Name of the customizing configuration
425
+ * @param {object} [mOptions.extensionName] If type <code>sap.ui.viewExtension</code>, the extension name must be provided
426
+ * @param {object} oExtInfo Config object containing the view/fragment and extension name
427
+ * @throws {Error} If 'getExtensionComponent' function is given, but does not return an instance.
428
+ * @returns {object|undefined} Object containing the customizing config or <code>undefined</code>
429
+ * @static
430
+ * @private ui5-restricted sap.ui.core
431
+ */
432
+ Component.getCustomizing = function(vObject, mOptions) {
433
+ var sType = mOptions.type,
434
+ sPath = "/sap.ui5/extends/extensions/" + sType + "/" + mOptions.name;
435
+
436
+ if (sType === "sap.ui.viewExtensions") {
437
+ sPath += "/" + mOptions.extensionName;
438
+ }
439
+
440
+ var oComponent = getCustomizingComponent(vObject);
441
+ return oComponent ? oComponent._getManifestEntry(sPath, true) : undefined;
442
+ };
443
+
386
444
  /**
387
445
  * Returns the metadata for the Component class.
388
446
  *
@@ -874,10 +932,18 @@ sap.ui.define([
874
932
  * @private
875
933
  */
876
934
  Component.prototype._initComponentModels = function(mModels, mDataSources, mCacheTokens) {
935
+ var sComponentName = this.getManifestObject().getComponentName();
877
936
 
878
- var mAllModelConfigurations = Component._createManifestModelConfigurations({
937
+ var mAllModelConfigs = Component._findManifestModelClasses({
879
938
  models: mModels,
880
939
  dataSources: mDataSources,
940
+ componentName: sComponentName
941
+ });
942
+ Component._loadManifestModelClasses(mAllModelConfigs, sComponentName);
943
+
944
+ var mAllModelConfigurations = Component._createManifestModelConfigurations({
945
+ models: mAllModelConfigs,
946
+ dataSources: mDataSources,
881
947
  component: this,
882
948
  mergeParent: true,
883
949
  cacheTokens: mCacheTokens,
@@ -898,7 +964,7 @@ sap.ui.define([
898
964
  }
899
965
 
900
966
  // create all models which are not created, yet.
901
- var mCreatedModels = Component._createManifestModels(mModelConfigurations, this.toString());
967
+ var mCreatedModels = Component._createManifestModels(mModelConfigurations, sComponentName);
902
968
  for (sModelName in mCreatedModels) {
903
969
  // keep the model instance to be able to destroy the created models on component destroy
904
970
  this._mManifestModels[sModelName] = mCreatedModels[sModelName];
@@ -1305,8 +1371,7 @@ sap.ui.define([
1305
1371
  if (mConfig.async === true) {
1306
1372
  return Component.create(mConfig);
1307
1373
  } else {
1308
- // use deprecated factory for sync use case only
1309
- return sap.ui.component(mConfig);
1374
+ return sap.ui.component(mConfig); // legacy-relevant: use deprecated factory for sync use case only
1310
1375
  }
1311
1376
  }
1312
1377
 
@@ -1373,6 +1438,102 @@ sap.ui.define([
1373
1438
 
1374
1439
  };
1375
1440
 
1441
+ Component._findManifestModelClasses = function(mOptions) {
1442
+ if (!mOptions.models) {
1443
+ // skipping model creation because of missing sap.ui5 models manifest entry
1444
+ return null;
1445
+ }
1446
+
1447
+ var mConfig = {
1448
+
1449
+ // ui5 model definitions
1450
+ models: mOptions.models,
1451
+
1452
+ // optional dataSources from "sap.app" manifest
1453
+ dataSources: mOptions.dataSources || {},
1454
+
1455
+ // to identify where the dataSources/models have been originally defined
1456
+ origin: {
1457
+ dataSources: {},
1458
+ models: {}
1459
+ }
1460
+ };
1461
+
1462
+ var sLogComponentName = mOptions.componentName;
1463
+ var mModelConfigurations = {};
1464
+
1465
+ // create a model for each ["sap.ui5"]["models"] entry
1466
+ for (var sModelName in mConfig.models) {
1467
+
1468
+ var oModelConfig = mConfig.models[sModelName];
1469
+
1470
+ // normalize dataSource shorthand, e.g.
1471
+ // "myModel": "myDataSource" => "myModel": { dataSource: "myDataSource" }
1472
+ if (typeof oModelConfig === 'string') {
1473
+ oModelConfig = {
1474
+ dataSource: oModelConfig
1475
+ };
1476
+ }
1477
+
1478
+ // check for referenced dataSource entry and read out settings/uri/type
1479
+ // if not already provided in model config
1480
+ if (oModelConfig.dataSource) {
1481
+
1482
+ var oDataSource = mConfig.dataSources && mConfig.dataSources[oModelConfig.dataSource];
1483
+ if (typeof oDataSource === 'object') {
1484
+
1485
+ // default type is OData
1486
+ if (oDataSource.type === undefined) {
1487
+ oDataSource.type = 'OData';
1488
+ }
1489
+
1490
+ var sODataVersion;
1491
+
1492
+ // read out type and translate to model class
1493
+ // (only if no model type was set to allow overriding)
1494
+ if (!oModelConfig.type) {
1495
+ switch (oDataSource.type) {
1496
+ case 'OData':
1497
+ sODataVersion = oDataSource.settings && oDataSource.settings.odataVersion;
1498
+ if (sODataVersion === "4.0") {
1499
+ oModelConfig.type = 'sap.ui.model.odata.v4.ODataModel';
1500
+ } else if (!sODataVersion || sODataVersion === "2.0") {
1501
+ // 2.0 is the default in case no version is provided
1502
+ oModelConfig.type = 'sap.ui.model.odata.v2.ODataModel';
1503
+ } else {
1504
+ Log.error('Component Manifest: Provided OData version "' + sODataVersion + '" in ' +
1505
+ 'dataSource "' + oModelConfig.dataSource + '" for model "' + sModelName + '" is unknown. ' +
1506
+ 'Falling back to default model type "sap.ui.model.odata.v2.ODataModel".',
1507
+ '["sap.app"]["dataSources"]["' + oModelConfig.dataSource + '"]', sLogComponentName);
1508
+ oModelConfig.type = 'sap.ui.model.odata.v2.ODataModel';
1509
+ }
1510
+ break;
1511
+ case 'JSON':
1512
+ oModelConfig.type = 'sap.ui.model.json.JSONModel';
1513
+ break;
1514
+ case 'XML':
1515
+ oModelConfig.type = 'sap.ui.model.xml.XMLModel';
1516
+ break;
1517
+ default:
1518
+ // for custom dataSource types, the class should already be specified in the sap.ui5 models config
1519
+ }
1520
+ }
1521
+ }
1522
+ }
1523
+
1524
+ // model type is required!
1525
+ if (!oModelConfig.type) {
1526
+ Log.error("Component Manifest: Missing \"type\" for model \"" + sModelName + "\"", "[\"sap.ui5\"][\"models\"][\"" + sModelName + "\"]", sLogComponentName);
1527
+ continue;
1528
+ }
1529
+
1530
+ // Add final configuration to result map
1531
+ mModelConfigurations[sModelName] = oModelConfig;
1532
+ }
1533
+
1534
+ return mModelConfigurations;
1535
+ };
1536
+
1376
1537
  /**
1377
1538
  * Creates model configurations by processing "/sap.app/dataSources" and "/sap.ui5/models" manifest entries.
1378
1539
  * Result can be handed over to {@link sap.ui.core.Component._createManifestModels} in order to create instances.
@@ -1393,7 +1554,7 @@ sap.ui.define([
1393
1554
  var oManifest = mOptions.manifest || oComponent.getManifestObject();
1394
1555
  var bMergeParent = mOptions.mergeParent;
1395
1556
  var mCacheTokens = mOptions.cacheTokens || {};
1396
- var sLogComponentName = oComponent ? oComponent.toString() : oManifest.getComponentName();
1557
+ var sLogComponentName = oComponent ? oComponent.getMetadata().getComponentName() : oManifest.getComponentName();
1397
1558
  var oConfig = sap.ui.getCore().getConfiguration();
1398
1559
  var aActiveTerminologies = mOptions.activeTerminologies;
1399
1560
 
@@ -1439,6 +1600,22 @@ sap.ui.define([
1439
1600
  for (var sModelName in mConfig.models) {
1440
1601
 
1441
1602
  var oModelConfig = mConfig.models[sModelName];
1603
+ var fnClass = sap.ui.require(oModelConfig.type.replace(/\./g, "/"));
1604
+ if (!fnClass) {
1605
+ fnClass = ObjectPath.get(oModelConfig.type);
1606
+ }
1607
+ // class could not be loaded by _loadManifestModelClasses
1608
+ if (!fnClass) {
1609
+ Log.error("Component Manifest: Class \"" + oModelConfig.type + "\" for model \"" + sModelName + "\" could not be found", "[\"sap.ui5\"][\"models\"][\"" + sModelName + "\"]", sLogComponentName);
1610
+ continue;
1611
+ }
1612
+ var oClassMetadata = fnClass.getMetadata();
1613
+
1614
+ var bIsV1Model = oClassMetadata.isA("sap.ui.model.odata.ODataModel");
1615
+ var bIsV2Model = oClassMetadata.isA("sap.ui.model.odata.v2.ODataModel");
1616
+ var bIsV4Model = oClassMetadata.isA("sap.ui.model.odata.v4.ODataModel");
1617
+ var bIsResourceModel = oClassMetadata.isA("sap.ui.model.resource.ResourceModel");
1618
+
1442
1619
  var bIsDataSourceUri = false;
1443
1620
  var mMetadataUrlParams = null;
1444
1621
 
@@ -1462,42 +1639,8 @@ sap.ui.define([
1462
1639
  oDataSource.type = 'OData';
1463
1640
  }
1464
1641
 
1465
- var sODataVersion;
1466
-
1467
- // read out type and translate to model class
1468
- // (only if no model type was set to allow overriding)
1469
- if (!oModelConfig.type) {
1470
- switch (oDataSource.type) {
1471
- case 'OData':
1472
- sODataVersion = oDataSource.settings && oDataSource.settings.odataVersion;
1473
- if (sODataVersion === "4.0") {
1474
- oModelConfig.type = 'sap.ui.model.odata.v4.ODataModel';
1475
- } else if (!sODataVersion || sODataVersion === "2.0") {
1476
- // 2.0 is the default in case no version is provided
1477
- oModelConfig.type = 'sap.ui.model.odata.v2.ODataModel';
1478
- } else {
1479
- Log.error('Component Manifest: Provided OData version "' + sODataVersion + '" in ' +
1480
- 'dataSource "' + oModelConfig.dataSource + '" for model "' + sModelName + '" is unknown. ' +
1481
- 'Falling back to default model type "sap.ui.model.odata.v2.ODataModel".',
1482
- '["sap.app"]["dataSources"]["' + oModelConfig.dataSource + '"]', sLogComponentName);
1483
- oModelConfig.type = 'sap.ui.model.odata.v2.ODataModel';
1484
- }
1485
- break;
1486
- case 'JSON':
1487
- oModelConfig.type = 'sap.ui.model.json.JSONModel';
1488
- break;
1489
- case 'XML':
1490
- oModelConfig.type = 'sap.ui.model.xml.XMLModel';
1491
- break;
1492
- default:
1493
- // for custom dataSource types, the class should already be specified in the sap.ui5 models config
1494
- }
1495
- }
1496
-
1497
1642
  // pass OData service version (e.g. "2.0"), if specified, to the OData V4 model
1498
- if (oModelConfig.type === 'sap.ui.model.odata.v4.ODataModel'
1499
- && oDataSource.settings
1500
- && oDataSource.settings.odataVersion) {
1643
+ if (bIsV4Model && oDataSource.settings && oDataSource.settings.odataVersion) {
1501
1644
  oModelConfig.settings = oModelConfig.settings || {};
1502
1645
  oModelConfig.settings.odataVersion = oDataSource.settings.odataVersion;
1503
1646
  }
@@ -1542,20 +1685,16 @@ sap.ui.define([
1542
1685
 
1543
1686
  var oAnnotationUri = new URI(oAnnotation.uri);
1544
1687
 
1545
- if (oModelConfig.type === 'sap.ui.model.odata.v2.ODataModel' ||
1546
- oModelConfig.type === 'sap.ui.model.odata.v4.ODataModel') {
1688
+ if (bIsV2Model || bIsV4Model) {
1689
+ /* eslint-disable no-loop-func */
1690
+ ["sap-language", "sap-client"].forEach(function(sName) {
1691
+ if (!oAnnotationUri.hasQuery(sName) && oConfig.getSAPParam(sName)) {
1692
+ oAnnotationUri.setQuery(sName, oConfig.getSAPParam(sName));
1693
+ }
1694
+ });
1695
+ /* eslint-enable no-loop-func */
1547
1696
 
1548
1697
  var sCacheTokenForAnnotation = mCacheTokens.dataSources && mCacheTokens.dataSources[oAnnotation.uri];
1549
- if (sCacheTokenForAnnotation || oModelConfig.type === 'sap.ui.model.odata.v2.ODataModel') {
1550
- /* eslint-disable no-loop-func */
1551
- ["sap-language", "sap-client"].forEach(function(sName) {
1552
- if (!oAnnotationUri.hasQuery(sName) && oConfig.getSAPParam(sName)) {
1553
- oAnnotationUri.setQuery(sName, oConfig.getSAPParam(sName));
1554
- }
1555
- });
1556
- /* eslint-enable no-loop-func */
1557
- }
1558
-
1559
1698
  if (sCacheTokenForAnnotation) {
1560
1699
  Component._applyCacheToken(oAnnotationUri, {
1561
1700
  cacheToken: sCacheTokenForAnnotation,
@@ -1582,24 +1721,16 @@ sap.ui.define([
1582
1721
  }
1583
1722
  }
1584
1723
 
1585
- // model type is required!
1586
- if (!oModelConfig.type) {
1587
- Log.error("Component Manifest: Missing \"type\" for model \"" + sModelName + "\"", "[\"sap.ui5\"][\"models\"][\"" + sModelName + "\"]", sLogComponentName);
1588
- continue;
1589
- }
1590
-
1591
1724
  // set mode of old ODataModel to "json" (default is xml).
1592
1725
  // as the automatic model creation is a new feature, this is not incompatible here
1593
- if (oModelConfig.type === 'sap.ui.model.odata.ODataModel' &&
1594
- (!oModelConfig.settings || oModelConfig.settings.json === undefined)) {
1726
+ if (bIsV1Model && (!oModelConfig.settings || oModelConfig.settings.json === undefined)) {
1595
1727
  // do not overwrite the flag if it was explicitly defined!
1596
-
1597
1728
  oModelConfig.settings = oModelConfig.settings || {};
1598
1729
  oModelConfig.settings.json = true;
1599
1730
  }
1600
1731
 
1601
1732
  // Check resource models for bundleUrl configuration
1602
- if (oModelConfig.type === "sap.ui.model.resource.ResourceModel") {
1733
+ if (bIsResourceModel) {
1603
1734
  if (oModelConfig.uri && oModelConfig.settings && oModelConfig.settings.bundleUrl) {
1604
1735
  Log.warning("Defining both model uri and bundleUrl is not supported. Only model uri will be resolved.");
1605
1736
  }
@@ -1627,8 +1758,7 @@ sap.ui.define([
1627
1758
  if (oModelConfig.dataSource) {
1628
1759
  addSapParams(oUri);
1629
1760
 
1630
- if (oModelConfig.type === 'sap.ui.model.odata.v2.ODataModel' ||
1631
- oModelConfig.type === 'sap.ui.model.odata.v4.ODataModel') {
1761
+ if (bIsV2Model || bIsV4Model) {
1632
1762
 
1633
1763
  var oModelDataSource = mConfig.dataSources && mConfig.dataSources[oModelConfig.dataSource];
1634
1764
  var sCacheToken = mCacheTokens.dataSources && mCacheTokens.dataSources[oModelDataSource.uri];
@@ -1639,7 +1769,7 @@ sap.ui.define([
1639
1769
  && !oUri.hasQuery('sap-language')
1640
1770
  && oConfig.getSAPParam('sap-language');
1641
1771
 
1642
- if ((bNeedsLanguage && oModelConfig.type === 'sap.ui.model.odata.v2.ODataModel') || sCacheToken) {
1772
+ if (bNeedsLanguage || sCacheToken) {
1643
1773
  // Lazy initialize settings and metadataUrlParams objects
1644
1774
  oModelConfig.settings = oModelConfig.settings || {};
1645
1775
  mMetadataUrlParams = oModelConfig.settings.metadataUrlParams = oModelConfig.settings.metadataUrlParams || {};
@@ -1667,17 +1797,12 @@ sap.ui.define([
1667
1797
  // set model specific "uri" property names which should be used to map "uri" to model specific constructor
1668
1798
  // (only if it wasn't specified before)
1669
1799
  if (oModelConfig.uriSettingName === undefined) {
1670
- switch (oModelConfig.type) {
1671
- case 'sap.ui.model.odata.ODataModel':
1672
- case 'sap.ui.model.odata.v2.ODataModel':
1673
- case 'sap.ui.model.odata.v4.ODataModel':
1674
- oModelConfig.uriSettingName = 'serviceUrl';
1675
- break;
1676
- case 'sap.ui.model.resource.ResourceModel':
1677
- oModelConfig.uriSettingName = 'bundleUrl';
1678
- break;
1679
- default:
1680
- // default 'undefined' is already set in this case
1800
+ if (bIsV1Model || bIsV2Model || bIsV4Model) {
1801
+ oModelConfig.uriSettingName = 'serviceUrl';
1802
+ } else if (bIsResourceModel) {
1803
+ oModelConfig.uriSettingName = 'bundleUrl';
1804
+ } else {
1805
+ // default 'undefined' is already set in this case
1681
1806
  }
1682
1807
  }
1683
1808
 
@@ -1698,9 +1823,9 @@ sap.ui.define([
1698
1823
  // lazy load the ODataUtils if systemParameter is given
1699
1824
  var bAddOrigin = false;
1700
1825
  var ODataUtils;
1701
- if (sSystemParameter && ["sap.ui.model.odata.ODataModel", "sap.ui.model.odata.v2.ODataModel"].indexOf(oModelConfig.type) != -1) {
1826
+ if (sSystemParameter && (bIsV1Model || bIsV2Model)) {
1702
1827
  bAddOrigin = true;
1703
- ODataUtils = sap.ui.requireSync("sap/ui/model/odata/ODataUtils");
1828
+ ODataUtils = sap.ui.require("sap/ui/model/odata/ODataUtils");
1704
1829
  }
1705
1830
 
1706
1831
  // include "uri" property in "settings" object, depending on "uriSettingName"
@@ -1757,7 +1882,7 @@ sap.ui.define([
1757
1882
  // resolve the bundleUrl of the enhancing resource bundle relative to
1758
1883
  // the component (default) or relative to manifest, e.g.:
1759
1884
  // bundleUrlRelativeTo: 'component|manifest'
1760
- if (oModelConfig.type === 'sap.ui.model.resource.ResourceModel' && oModelConfig.settings) {
1885
+ if (bIsResourceModel && oModelConfig.settings) {
1761
1886
  if (aActiveTerminologies) {
1762
1887
  oModelConfig.settings.activeTerminologies = aActiveTerminologies;
1763
1888
  }
@@ -1784,6 +1909,21 @@ sap.ui.define([
1784
1909
  return mModelConfigurations;
1785
1910
  };
1786
1911
 
1912
+ Component._loadManifestModelClasses = function(mModelConfigurations, sLogComponentName) {
1913
+ for (var sModelName in mModelConfigurations) {
1914
+ var oModelConfig = mModelConfigurations[sModelName];
1915
+
1916
+ // load model class and log error message if it couldn't be loaded.
1917
+ // error gets caught to continue creating the other models and not breaking the execution here
1918
+ try {
1919
+ sap.ui.requireSync(oModelConfig.type.replace(/\./g, "/"));
1920
+ } catch (oError) {
1921
+ Log.error("Component Manifest: Class \"" + oModelConfig.type + "\" for model \"" + sModelName + "\" could not be loaded. " + oError, "[\"sap.ui5\"][\"models\"][\"" + sModelName + "\"]", sLogComponentName);
1922
+ continue;
1923
+ }
1924
+ }
1925
+ };
1926
+
1787
1927
  /**
1788
1928
  * Creates model instances using a configuration provided by {@link sap.ui.core.Component._createManifestModelConfigurations}.
1789
1929
  *
@@ -1797,24 +1937,9 @@ sap.ui.define([
1797
1937
  for (var sModelName in mModelConfigurations) {
1798
1938
  var oModelConfig = mModelConfigurations[sModelName];
1799
1939
 
1800
- // load model class and log error message if it couldn't be loaded.
1801
- // error gets caught to continue creating the other models and not breaking the execution here
1802
- try {
1803
- sap.ui.requireSync(oModelConfig.type.replace(/\./g, "/"));
1804
- } catch (oError) {
1805
- Log.error("Component Manifest: Class \"" + oModelConfig.type + "\" for model \"" + sModelName + "\" could not be loaded. " + oError, "[\"sap.ui5\"][\"models\"][\"" + sModelName + "\"]", sLogComponentName);
1806
- continue;
1807
- }
1808
-
1809
- // TODO: We don't use the return value of sap.ui.requireSync here yet.
1810
1940
  // The tests for the Model creation make use of a constructor stub,
1811
1941
  // and this only works from the global namespace export.
1812
1942
  var fnModelClass = ObjectPath.get(oModelConfig.type);
1813
- if (!fnModelClass) {
1814
- // this could be the case if the required module doesn't register itself in the defined namespace
1815
- Log.error("Component Manifest: Class \"" + oModelConfig.type + "\" for model \"" + sModelName + "\" could not be found", "[\"sap.ui5\"][\"models\"][\"" + sModelName + "\"]", sLogComponentName);
1816
- continue;
1817
- }
1818
1943
 
1819
1944
  // create arguments array with leading "null" value so that it can be passed to the apply function
1820
1945
  var aArgs = [null].concat(oModelConfig.settings || []);
@@ -1851,7 +1976,7 @@ sap.ui.define([
1851
1976
  * @param {string[]} [aActiveTerminologies] optional list of active terminologies
1852
1977
  * @returns {object} object with two maps, see above
1853
1978
  */
1854
- function getPreloadModelConfigsFromManifest(oManifest, oComponentData, mCacheTokens, aActiveTerminologies) {
1979
+ function getPreloadModelConfigsFromManifest(oManifest) {
1855
1980
  var mModelConfigs = {
1856
1981
  afterManifest: {},
1857
1982
  afterPreload: {}
@@ -1860,14 +1985,11 @@ sap.ui.define([
1860
1985
  // deep clone is needed as manifest only returns a read-only copy (frozen object)
1861
1986
  var oManifestDataSources = merge({}, oManifest.getEntry("/sap.app/dataSources"));
1862
1987
  var oManifestModels = merge({}, oManifest.getEntry("/sap.ui5/models"));
1863
-
1864
- var mAllModelConfigurations = Component._createManifestModelConfigurations({
1988
+ var sComponentName = oManifest.getComponentName();
1989
+ var mAllModelConfigurations = Component._findManifestModelClasses({
1865
1990
  models: oManifestModels,
1866
1991
  dataSources: oManifestDataSources,
1867
- manifest: oManifest,
1868
- componentData: oComponentData,
1869
- cacheTokens: mCacheTokens,
1870
- activeTerminologies: aActiveTerminologies
1992
+ componentName: sComponentName
1871
1993
  });
1872
1994
 
1873
1995
  // Read internal URI parameter to enable model preload for testing purposes
@@ -1886,14 +2008,13 @@ sap.ui.define([
1886
2008
  if (!mModelConfig.preload && aPreloadModels && aPreloadModels.indexOf(sModelName) > -1 ) {
1887
2009
  mModelConfig.preload = true;
1888
2010
  Log.warning("FOR TESTING ONLY!!! Activating preload for model \"" + sModelName + "\" (" + mModelConfig.type + ")",
1889
- oManifest.getComponentName(), "sap.ui.core.Component");
2011
+ sComponentName, "sap.ui.core.Component");
1890
2012
  }
1891
2013
 
1892
2014
  // ResourceModels with async=false should be always loaded beforehand to get rid of sync requests under the hood (regardless of the "preload" flag)
1893
2015
  if (mModelConfig.type === "sap.ui.model.resource.ResourceModel" &&
1894
- Array.isArray(mModelConfig.settings) &&
1895
- mModelConfig.settings.length > 0 &&
1896
- mModelConfig.settings[0].async !== true
2016
+ (!mModelConfig.settings ||
2017
+ mModelConfig.settings.async !== true)
1897
2018
  ) {
1898
2019
  // Use separate config object for ResourceModels as the resourceBundle might be
1899
2020
  // part of the Component-preload which isn't available when the regular "preloaded"-models are created
@@ -1902,11 +2023,14 @@ sap.ui.define([
1902
2023
  // Only create models:
1903
2024
  // - which are flagged for preload (mModelConfig.preload) or configured via internal URI param (see above)
1904
2025
  // - in case the model class is already loaded (otherwise log a warning)
2026
+ // We check for the moduleState here instead of a simple sap.ui.require probing, because it captures the following cases:
2027
+ // - modules defined in a preload (via predefine) are "available, but not executed"
2028
+ // - modules which are already loaded/executed
1905
2029
  if (sap.ui.loader._.getModuleState(mModelConfig.type.replace(/\./g, "/") + ".js")) {
1906
2030
  mModelConfigs.afterManifest[sModelName] = mModelConfig;
1907
2031
  } else {
1908
2032
  Log.warning("Can not preload model \"" + sModelName + "\" as required class has not been loaded: \"" + mModelConfig.type + "\"",
1909
- oManifest.getComponentName(), "sap.ui.core.Component");
2033
+ sComponentName, "sap.ui.core.Component");
1910
2034
  }
1911
2035
  }
1912
2036
 
@@ -2260,9 +2384,9 @@ sap.ui.define([
2260
2384
  if (typeof vConfig === 'string') {
2261
2385
  Log.warning("Do not use deprecated function 'sap.ui.component' (" + vConfig + ") + for Component instance lookup. " +
2262
2386
  "Use 'Component.get' instead", "sap.ui.component", null, fnLogProperties.bind(null, vConfig));
2263
- // when only a string is given then this function behaves like a
2387
+ // when only a string is given, then this function behaves like a
2264
2388
  // getter and returns an existing component instance
2265
- return sap.ui.getCore().getComponent(vConfig);
2389
+ return Component.get(vConfig);
2266
2390
  }
2267
2391
 
2268
2392
  if (vConfig.async) {
@@ -2505,7 +2629,7 @@ sap.ui.define([
2505
2629
  */
2506
2630
  Component.get = function (sId) {
2507
2631
  // lookup and return the component
2508
- return sap.ui.getCore().getComponent(sId);
2632
+ return Component.registry.get(sId);
2509
2633
  };
2510
2634
 
2511
2635
  /**
@@ -2597,7 +2721,7 @@ sap.ui.define([
2597
2721
  sManifestUrl,
2598
2722
  oManifest,
2599
2723
  mModels,
2600
- mModelConfigs,
2724
+ mPreloadModelConfigs,
2601
2725
  fnCallLoadComponentCallback;
2602
2726
 
2603
2727
  function createSanitizedManifest( oRawManifestJSON, mOptions ) {
@@ -2806,7 +2930,18 @@ sap.ui.define([
2806
2930
  http2 = sap.ui.getCore().getConfiguration().getDepCache(),
2807
2931
  sPreloadName,
2808
2932
  oTransitiveDependencies,
2809
- aLibs;
2933
+ aLibs,
2934
+ errorLogging = function (sPreloadName, bAsync) {
2935
+ return function (e) {
2936
+ var sErrorMessage = "Component-preload for this component does not exist.";
2937
+ Log.warning(
2938
+ "Couldn't preload component from " + sPreloadName + ": " + ((e && e.message) || e),
2939
+ !bAsync ? sErrorMessage : sErrorMessage + " If the component is part of a library or another component, the configuration 'sap.app/embeddedBy' is not maintained. " +
2940
+ " The 'sap.app/embeddedBy' property must be relative path inside the deployment unit (library or component).",
2941
+ "sap.ui.core.Component#preload"
2942
+ );
2943
+ };
2944
+ };
2810
2945
 
2811
2946
  // only load the Component-preload file if the Component module is not yet available
2812
2947
  if ( bComponentPreload && sComponentName != null && !sap.ui.loader._.getModuleState(sController.replace(/\./g, "/") + ".js") ) {
@@ -2821,10 +2956,10 @@ sap.ui.define([
2821
2956
  Array.prototype.push.apply(aLibs, oTransitiveDependencies.dependencies);
2822
2957
 
2823
2958
  // load library preload for every transitive dependency
2824
- return sap.ui.getCore().loadLibraries( aLibs, { preloadOnly: true } );
2959
+ return sap.ui.getCore().loadLibraries( aLibs, { preloadOnly: true } ).catch(errorLogging(oTransitiveDependencies.library, true));
2825
2960
  } else {
2826
2961
  sPreloadName = sController.replace(/\./g, "/") + (http2 ? '-h2-preload.js' : '-preload.js'); // URN
2827
- return sap.ui.loader._.loadJSResourceAsync(sPreloadName, true);
2962
+ return sap.ui.loader._.loadJSResourceAsync(sPreloadName).catch(errorLogging(sPreloadName, true));
2828
2963
  }
2829
2964
  }
2830
2965
 
@@ -2832,7 +2967,7 @@ sap.ui.define([
2832
2967
  sPreloadName = sController + '-preload'; // Module name
2833
2968
  sap.ui.requireSync(sPreloadName.replace(/\./g, "/"));
2834
2969
  } catch (e) {
2835
- Log.warning("couldn't preload component from " + sPreloadName + ": " + ((e && e.message) || e));
2970
+ errorLogging(sPreloadName, false)(e);
2836
2971
  }
2837
2972
  } else if (bAsync) {
2838
2973
  return Promise.resolve();
@@ -3004,14 +3139,26 @@ sap.ui.define([
3004
3139
  // create "afterPreload" models in parallel to loading the component preload (below)
3005
3140
  if (mOptions.createModels) {
3006
3141
  collect(oManifest.then(function(oManifest) {
3142
+ var sComponentName = oManifest.getComponentName();
3007
3143
  // Calculate configurations of preloaded models once the manifest is available
3008
- mModelConfigs = getPreloadModelConfigsFromManifest(oManifest, oConfig.componentData, hints.cacheTokens, aActiveTerminologies);
3144
+ mPreloadModelConfigs = getPreloadModelConfigsFromManifest(oManifest);
3009
3145
 
3010
- return oManifest;
3011
- }).then(function(oManifest) {
3012
3146
  // Create preloaded models directly after the manifest has been loaded
3013
- if (Object.keys(mModelConfigs.afterManifest).length > 0) {
3014
- mModels = Component._createManifestModels(mModelConfigs.afterManifest, oManifest.getComponentName());
3147
+ if (Object.keys(mPreloadModelConfigs.afterManifest).length > 0) {
3148
+ Component._loadManifestModelClasses(mPreloadModelConfigs.afterManifest, sComponentName);
3149
+
3150
+ // deep clone is needed as manifest only returns a read-only copy (frozen object)
3151
+ var oManifestDataSources = merge({}, oManifest.getEntry("/sap.app/dataSources"));
3152
+ var mAllModelConfigurations = Component._createManifestModelConfigurations({
3153
+ models: mPreloadModelConfigs.afterManifest,
3154
+ dataSources: oManifestDataSources,
3155
+ manifest: oManifest,
3156
+ componentData: oConfig.componentData,
3157
+ cacheTokens: hints.cacheTokens,
3158
+ activeTerminologies: aActiveTerminologies
3159
+ });
3160
+
3161
+ mModels = Component._createManifestModels(mAllModelConfigurations, sComponentName);
3015
3162
  }
3016
3163
 
3017
3164
  return oManifest;
@@ -3023,11 +3170,21 @@ sap.ui.define([
3023
3170
  collect(oManifest.then(function(oManifest) {
3024
3171
 
3025
3172
  // preload the component only if not embedded in a library
3026
- // if the component is embedded in a lib. we expect a matching dependency in the manifest
3027
- // this way the cascading dependency loading later on will make sure the component itself is available
3173
+ // If the Component controller is not preloaded, the Component.js file is loaded as a single request later on.
3174
+ // This situation should be fixed by the factory caller, so we log it as a warning.
3028
3175
  var pPreload = Promise.resolve();
3029
- if (!oManifest.getEntry("/sap.app/embeddedBy")) {
3030
- pPreload = preload(oManifest.getComponentName(), true);
3176
+ var sEmbeddedBy = oManifest.getEntry("/sap.app/embeddedBy");
3177
+ var sComponentName = oManifest.getComponentName();
3178
+ if (!sEmbeddedBy) {
3179
+ pPreload = preload(sComponentName, true);
3180
+ } else if (!sap.ui.loader._.getModuleState(getControllerModuleName() + ".js")) {
3181
+ Log.warning(
3182
+ "Component '" + sComponentName + "' is defined to be embedded in a library or another component" +
3183
+ "The relatively given preload for the embedding resource was not loaded before hand. " +
3184
+ "Please make sure to load the embedding resource containing this Component before instantiating.",
3185
+ undefined,
3186
+ "sap.ui.core.Component#embeddedBy"
3187
+ );
3031
3188
  }
3032
3189
 
3033
3190
  return pPreload.then(function() {
@@ -3040,7 +3197,7 @@ sap.ui.define([
3040
3197
  return null;
3041
3198
  }
3042
3199
 
3043
- var aResourceModelNames = Object.keys(mModelConfigs.afterPreload);
3200
+ var aResourceModelNames = Object.keys(mPreloadModelConfigs.afterPreload);
3044
3201
 
3045
3202
  if (aResourceModelNames.length === 0) {
3046
3203
  return null;
@@ -3055,8 +3212,20 @@ sap.ui.define([
3055
3212
  resolve(ResourceModel);
3056
3213
  }, reject);
3057
3214
  }).then(function(ResourceModel) {
3215
+
3216
+ // deep clone is needed as manifest only returns a read-only copy (frozen object)
3217
+ var oManifestDataSources = merge({}, oManifest.getEntry("/sap.app/dataSources"));
3218
+ var mAfterPreloadModelConfigurations = Component._createManifestModelConfigurations({
3219
+ models: mPreloadModelConfigs.afterPreload,
3220
+ dataSources: oManifestDataSources,
3221
+ manifest: oManifest,
3222
+ componentData: oConfig.componentData,
3223
+ cacheTokens: hints.cacheTokens,
3224
+ activeTerminologies: aActiveTerminologies
3225
+ });
3226
+
3058
3227
  function loadResourceBundle(sModelName) {
3059
- var mModelConfig = mModelConfigs.afterPreload[sModelName];
3228
+ var mModelConfig = mAfterPreloadModelConfigurations[sModelName];
3060
3229
  if (Array.isArray(mModelConfig.settings) && mModelConfig.settings.length > 0) {
3061
3230
  var mModelSettings = mModelConfig.settings[0]; // first argument is the config map
3062
3231
 
@@ -3087,19 +3256,19 @@ sap.ui.define([
3087
3256
 
3088
3257
  // If the resource bundle can't be loaded, the resource model will be skipped.
3089
3258
  // But once the component instance gets created, the model will be tried to created again.
3090
- delete mModelConfigs.afterPreload[sModelName];
3259
+ delete mAfterPreloadModelConfigurations[sModelName];
3091
3260
  });
3092
3261
  } else {
3093
3262
  // Can't load bundle as no settings are defined.
3094
- // Should not happen as those models won't be part of "mModelConfigs.afterPreload"
3263
+ // Should not happen as those models won't be part of "afterPreload"
3095
3264
  return Promise.resolve();
3096
3265
  }
3097
3266
  }
3098
3267
 
3099
3268
  // Load all ResourceBundles for all models in parallel
3100
3269
  return Promise.all(aResourceModelNames.map(loadResourceBundle)).then(function() {
3101
- if (Object.keys(mModelConfigs.afterPreload).length > 0) {
3102
- var mResourceModels = Component._createManifestModels(mModelConfigs.afterPreload, oManifest.getComponentName());
3270
+ if (Object.keys(mAfterPreloadModelConfigurations).length > 0) {
3271
+ var mResourceModels = Component._createManifestModels(mAfterPreloadModelConfigurations, oManifest.getComponentName());
3103
3272
  if (!mModels) {
3104
3273
  mModels = {};
3105
3274
  }
@@ -3275,12 +3444,10 @@ sap.ui.define([
3275
3444
  // lookup model classes
3276
3445
  var mManifestModels = merge({}, oManifest.getEntry("/sap.ui5/models"));
3277
3446
  var mManifestDataSources = merge({}, oManifest.getEntry("/sap.app/dataSources"));
3278
- var mAllModelConfigurations = Component._createManifestModelConfigurations({
3447
+ var mAllModelConfigurations = Component._findManifestModelClasses({
3279
3448
  models: mManifestModels,
3280
3449
  dataSources: mManifestDataSources,
3281
- manifest: oManifest,
3282
- cacheTokens: hints.cacheTokens,
3283
- activeTerminologies: aActiveTerminologies
3450
+ componentName: oManifest.getComponentName()
3284
3451
  });
3285
3452
  for (var mModelName in mAllModelConfigurations) {
3286
3453
  if (!mAllModelConfigurations.hasOwnProperty(mModelName)) {
@@ -3369,7 +3536,7 @@ sap.ui.define([
3369
3536
 
3370
3537
  // synchronously load the controller class, prepare and return it
3371
3538
  return prepareControllerClass(
3372
- sap.ui.requireSync( getControllerModuleName() )
3539
+ sap.ui.requireSync( getControllerModuleName() ) // legacy-relevant: Sync path
3373
3540
  );
3374
3541
  }
3375
3542
 
@@ -3384,6 +3551,7 @@ sap.ui.define([
3384
3551
  *
3385
3552
  * @namespace sap.ui.core.Component.registry
3386
3553
  * @public
3554
+ * @since 1.67
3387
3555
  */
3388
3556
 
3389
3557
  /**