@openui5/sap.ui.core 1.129.0 → 1.130.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 (425) hide show
  1. package/THIRDPARTY.txt +1 -1
  2. package/package.json +1 -1
  3. package/src/jquery.sap.global.js +7 -7
  4. package/src/jquery.sap.properties.js +1 -1
  5. package/src/jquery.sap.resources.js +1 -1
  6. package/src/jquery.sap.script.js +1 -1
  7. package/src/jquery.sap.storage.js +3 -3
  8. package/src/jquery.sap.trace.js +18 -18
  9. package/src/sap/base/Event.js +1 -1
  10. package/src/sap/base/Eventing.js +1 -1
  11. package/src/sap/base/config.js +1 -1
  12. package/src/sap/base/future.js +10 -2
  13. package/src/sap/base/i18n/LanguageTag.js +1 -1
  14. package/src/sap/base/i18n/date/TimezoneUtils.js +1 -1
  15. package/src/sap/base/util/restricted/_CancelablePromise.js +1 -1
  16. package/src/sap/base/util/restricted/_castArray.js +1 -1
  17. package/src/sap/base/util/restricted/_compact.js +1 -1
  18. package/src/sap/base/util/restricted/_curry.js +1 -1
  19. package/src/sap/base/util/restricted/_debounce.js +1 -1
  20. package/src/sap/base/util/restricted/_difference.js +1 -1
  21. package/src/sap/base/util/restricted/_differenceBy.js +1 -1
  22. package/src/sap/base/util/restricted/_differenceWith.js +1 -1
  23. package/src/sap/base/util/restricted/_flatMap.js +1 -1
  24. package/src/sap/base/util/restricted/_flatMapDeep.js +1 -1
  25. package/src/sap/base/util/restricted/_flatMapDepth.js +1 -1
  26. package/src/sap/base/util/restricted/_flatten.js +1 -1
  27. package/src/sap/base/util/restricted/_flattenDeep.js +1 -1
  28. package/src/sap/base/util/restricted/_flattenDepth.js +1 -1
  29. package/src/sap/base/util/restricted/_intersection.js +1 -1
  30. package/src/sap/base/util/restricted/_intersectionBy.js +1 -1
  31. package/src/sap/base/util/restricted/_intersectionWith.js +1 -1
  32. package/src/sap/base/util/restricted/_isEqual.js +1 -1
  33. package/src/sap/base/util/restricted/_isEqualWith.js +1 -1
  34. package/src/sap/base/util/restricted/_isNil.js +1 -1
  35. package/src/sap/base/util/restricted/_max.js +1 -1
  36. package/src/sap/base/util/restricted/_merge.js +1 -1
  37. package/src/sap/base/util/restricted/_mergeWith.js +1 -1
  38. package/src/sap/base/util/restricted/_min.js +1 -1
  39. package/src/sap/base/util/restricted/_omit.js +1 -1
  40. package/src/sap/base/util/restricted/_pick.js +1 -1
  41. package/src/sap/base/util/restricted/_pickBy.js +1 -1
  42. package/src/sap/base/util/restricted/_throttle.js +1 -1
  43. package/src/sap/base/util/restricted/_toArray.js +1 -1
  44. package/src/sap/base/util/restricted/_union.js +1 -1
  45. package/src/sap/base/util/restricted/_unionBy.js +1 -1
  46. package/src/sap/base/util/restricted/_unionWith.js +1 -1
  47. package/src/sap/base/util/restricted/_uniq.js +1 -1
  48. package/src/sap/base/util/restricted/_uniqBy.js +1 -1
  49. package/src/sap/base/util/restricted/_uniqWith.js +1 -1
  50. package/src/sap/base/util/restricted/_without.js +1 -1
  51. package/src/sap/base/util/restricted/_xor.js +1 -1
  52. package/src/sap/base/util/restricted/_xorBy.js +1 -1
  53. package/src/sap/base/util/restricted/_xorWith.js +1 -1
  54. package/src/sap/base/util/restricted/_zipObject.js +1 -1
  55. package/src/sap/base/util/restricted/_zipObjectDeep.js +1 -1
  56. package/src/sap/ui/Device.js +3 -3
  57. package/src/sap/ui/Global.js +3 -3
  58. package/src/sap/ui/base/BindingParser.js +1 -3
  59. package/src/sap/ui/base/Event.js +1 -1
  60. package/src/sap/ui/base/EventProvider.js +1 -1
  61. package/src/sap/ui/base/Interface.js +1 -1
  62. package/src/sap/ui/base/ManagedObject.js +4 -9
  63. package/src/sap/ui/base/ManagedObjectMetadata.js +1 -1
  64. package/src/sap/ui/base/Metadata.js +1 -1
  65. package/src/sap/ui/base/Object.js +1 -1
  66. package/src/sap/ui/base/ObjectPool.js +1 -1
  67. package/src/sap/ui/core/.library +2 -2
  68. package/src/sap/ui/core/BusyIndicator.js +1 -1
  69. package/src/sap/ui/core/Component.js +32 -130
  70. package/src/sap/ui/core/ComponentContainer.js +2 -2
  71. package/src/sap/ui/core/ComponentHooks.js +174 -0
  72. package/src/sap/ui/core/ComponentMetadata.js +1 -1
  73. package/src/sap/ui/core/ComponentSupport.js +1 -1
  74. package/src/sap/ui/core/Configuration.js +1 -1
  75. package/src/sap/ui/core/Control.js +1 -1
  76. package/src/sap/ui/core/Core.js +2 -2
  77. package/src/sap/ui/core/CustomData.js +1 -1
  78. package/src/sap/ui/core/DeclarativeSupport.js +1 -1
  79. package/src/sap/ui/core/Element.js +6 -2
  80. package/src/sap/ui/core/ElementMetadata.js +1 -1
  81. package/src/sap/ui/core/EnabledPropagator.js +1 -1
  82. package/src/sap/ui/core/EventBus.js +1 -1
  83. package/src/sap/ui/core/Fragment.js +6 -5
  84. package/src/sap/ui/core/HTML.js +1 -1
  85. package/src/sap/ui/core/History.js +1 -1
  86. package/src/sap/ui/core/Icon.js +1 -1
  87. package/src/sap/ui/core/IndicationColorSupport.js +1 -1
  88. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  89. package/src/sap/ui/core/InvisibleMessage.js +1 -1
  90. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  91. package/src/sap/ui/core/InvisibleText.js +1 -1
  92. package/src/sap/ui/core/Item.js +1 -1
  93. package/src/sap/ui/core/LabelEnablement.js +2 -15
  94. package/src/sap/ui/core/LayoutData.js +1 -1
  95. package/src/sap/ui/core/ListItem.js +1 -1
  96. package/src/sap/ui/core/LocalBusyIndicator.js +1 -1
  97. package/src/sap/ui/core/Locale.js +1 -1
  98. package/src/sap/ui/core/LocaleData.js +43 -37
  99. package/src/sap/ui/core/Manifest.js +2 -2
  100. package/src/sap/ui/core/Message.js +1 -1
  101. package/src/sap/ui/core/RenderManager.js +41 -32
  102. package/src/sap/ui/core/Renderer.js +1 -1
  103. package/src/sap/ui/core/ResizeHandler.js +1 -1
  104. package/src/sap/ui/core/ScrollBar.js +1 -1
  105. package/src/sap/ui/core/SeparatorItem.js +1 -1
  106. package/src/sap/ui/core/StaticArea.js +0 -1
  107. package/src/sap/ui/core/Title.js +1 -1
  108. package/src/sap/ui/core/TooltipBase.js +1 -1
  109. package/src/sap/ui/core/UIArea.js +1 -1
  110. package/src/sap/ui/core/UIComponent.js +3 -3
  111. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  112. package/src/sap/ui/core/ValueStateSupport.js +1 -1
  113. package/src/sap/ui/core/VariantLayoutData.js +1 -1
  114. package/src/sap/ui/core/XMLComposite.js +1 -1
  115. package/src/sap/ui/core/XMLCompositeMetadata.js +1 -1
  116. package/src/sap/ui/core/XMLTemplateProcessor.js +3 -3
  117. package/src/sap/ui/core/_IconRegistry.js +1 -1
  118. package/src/sap/ui/core/cldr/ar.json +5 -1
  119. package/src/sap/ui/core/cldr/ar_EG.json +5 -1
  120. package/src/sap/ui/core/cldr/ar_SA.json +5 -1
  121. package/src/sap/ui/core/cldr/bg.json +4 -0
  122. package/src/sap/ui/core/cldr/ca.json +4 -0
  123. package/src/sap/ui/core/cldr/cnr.json +4 -0
  124. package/src/sap/ui/core/cldr/cs.json +4 -0
  125. package/src/sap/ui/core/cldr/cy.json +4 -0
  126. package/src/sap/ui/core/cldr/da.json +4 -0
  127. package/src/sap/ui/core/cldr/de.json +4 -0
  128. package/src/sap/ui/core/cldr/de_AT.json +4 -0
  129. package/src/sap/ui/core/cldr/de_CH.json +4 -0
  130. package/src/sap/ui/core/cldr/el.json +4 -0
  131. package/src/sap/ui/core/cldr/el_CY.json +4 -0
  132. package/src/sap/ui/core/cldr/en.json +4 -0
  133. package/src/sap/ui/core/cldr/en_AU.json +4 -0
  134. package/src/sap/ui/core/cldr/en_GB.json +4 -0
  135. package/src/sap/ui/core/cldr/en_HK.json +5 -1
  136. package/src/sap/ui/core/cldr/en_IE.json +4 -0
  137. package/src/sap/ui/core/cldr/en_IN.json +5 -1
  138. package/src/sap/ui/core/cldr/en_NZ.json +4 -0
  139. package/src/sap/ui/core/cldr/en_PG.json +4 -0
  140. package/src/sap/ui/core/cldr/en_SG.json +5 -1
  141. package/src/sap/ui/core/cldr/en_ZA.json +4 -0
  142. package/src/sap/ui/core/cldr/es.json +4 -0
  143. package/src/sap/ui/core/cldr/es_AR.json +4 -0
  144. package/src/sap/ui/core/cldr/es_BO.json +4 -0
  145. package/src/sap/ui/core/cldr/es_CL.json +4 -0
  146. package/src/sap/ui/core/cldr/es_CO.json +4 -0
  147. package/src/sap/ui/core/cldr/es_MX.json +4 -0
  148. package/src/sap/ui/core/cldr/es_PE.json +4 -0
  149. package/src/sap/ui/core/cldr/es_UY.json +4 -0
  150. package/src/sap/ui/core/cldr/es_VE.json +4 -0
  151. package/src/sap/ui/core/cldr/et.json +4 -0
  152. package/src/sap/ui/core/cldr/fa.json +6 -3
  153. package/src/sap/ui/core/cldr/fi.json +4 -0
  154. package/src/sap/ui/core/cldr/fr.json +4 -0
  155. package/src/sap/ui/core/cldr/fr_BE.json +4 -0
  156. package/src/sap/ui/core/cldr/fr_CA.json +4 -0
  157. package/src/sap/ui/core/cldr/fr_CH.json +4 -0
  158. package/src/sap/ui/core/cldr/fr_LU.json +4 -0
  159. package/src/sap/ui/core/cldr/he.json +6 -3
  160. package/src/sap/ui/core/cldr/hi.json +5 -1
  161. package/src/sap/ui/core/cldr/hr.json +4 -0
  162. package/src/sap/ui/core/cldr/hu.json +4 -0
  163. package/src/sap/ui/core/cldr/id.json +5 -1
  164. package/src/sap/ui/core/cldr/it.json +4 -0
  165. package/src/sap/ui/core/cldr/it_CH.json +4 -0
  166. package/src/sap/ui/core/cldr/ja.json +5 -1
  167. package/src/sap/ui/core/cldr/kk.json +4 -0
  168. package/src/sap/ui/core/cldr/ko.json +5 -1
  169. package/src/sap/ui/core/cldr/lt.json +4 -0
  170. package/src/sap/ui/core/cldr/lv.json +4 -0
  171. package/src/sap/ui/core/cldr/mk.json +4 -0
  172. package/src/sap/ui/core/cldr/ms.json +5 -1
  173. package/src/sap/ui/core/cldr/nb.json +5 -2
  174. package/src/sap/ui/core/cldr/nl.json +4 -0
  175. package/src/sap/ui/core/cldr/nl_BE.json +4 -0
  176. package/src/sap/ui/core/cldr/pl.json +4 -0
  177. package/src/sap/ui/core/cldr/pt.json +4 -0
  178. package/src/sap/ui/core/cldr/pt_PT.json +4 -0
  179. package/src/sap/ui/core/cldr/ro.json +4 -0
  180. package/src/sap/ui/core/cldr/ru.json +4 -0
  181. package/src/sap/ui/core/cldr/ru_UA.json +4 -0
  182. package/src/sap/ui/core/cldr/sk.json +4 -0
  183. package/src/sap/ui/core/cldr/sl.json +4 -0
  184. package/src/sap/ui/core/cldr/sr.json +4 -0
  185. package/src/sap/ui/core/cldr/sr_Latn.json +6 -2
  186. package/src/sap/ui/core/cldr/sv.json +4 -0
  187. package/src/sap/ui/core/cldr/th.json +5 -1
  188. package/src/sap/ui/core/cldr/tr.json +5 -1
  189. package/src/sap/ui/core/cldr/uk.json +4 -0
  190. package/src/sap/ui/core/cldr/vi.json +4 -0
  191. package/src/sap/ui/core/cldr/zh_CN.json +5 -1
  192. package/src/sap/ui/core/cldr/zh_HK.json +6 -3
  193. package/src/sap/ui/core/cldr/zh_SG.json +6 -3
  194. package/src/sap/ui/core/cldr/zh_TW.json +5 -1
  195. package/src/sap/ui/core/date/UI5Date.js +1 -1
  196. package/src/sap/ui/core/delegate/ItemNavigation.js +1 -1
  197. package/src/sap/ui/core/delegate/ScrollEnablement.js +1 -1
  198. package/src/sap/ui/core/dnd/DragDropBase.js +1 -1
  199. package/src/sap/ui/core/dnd/DragDropInfo.js +1 -1
  200. package/src/sap/ui/core/dnd/DragInfo.js +1 -1
  201. package/src/sap/ui/core/dnd/DropInfo.js +1 -1
  202. package/src/sap/ui/core/fieldhelp/FieldHelp.js +5 -7
  203. package/src/sap/ui/core/fieldhelp/FieldHelpCustomData.js +88 -0
  204. package/src/sap/ui/core/fieldhelp/FieldHelpUtil.js +22 -26
  205. package/src/sap/ui/core/format/FormatUtils.js +1 -1
  206. package/src/sap/ui/core/format/NumberFormat.js +16 -27
  207. package/src/sap/ui/core/format/TimezoneUtil.js +1 -1
  208. package/src/sap/ui/core/getCompatibilityVersion.js +1 -1
  209. package/src/sap/ui/core/hyphenation/Hyphenation.js +1 -1
  210. package/src/sap/ui/core/library.js +5 -7
  211. package/src/sap/ui/core/library.support.js +10 -1
  212. package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
  213. package/src/sap/ui/core/message/Message.js +1 -1
  214. package/src/sap/ui/core/message/MessageManager.js +1 -1
  215. package/src/sap/ui/core/message/MessageParser.js +1 -1
  216. package/src/sap/ui/core/message/MessageProcessor.js +1 -1
  217. package/src/sap/ui/core/messagebundle.properties +6 -12
  218. package/src/sap/ui/core/messagebundle_ar.properties +3 -6
  219. package/src/sap/ui/core/messagebundle_bg.properties +3 -6
  220. package/src/sap/ui/core/messagebundle_ca.properties +3 -6
  221. package/src/sap/ui/core/messagebundle_cnr.properties +3 -6
  222. package/src/sap/ui/core/messagebundle_cs.properties +3 -6
  223. package/src/sap/ui/core/messagebundle_cy.properties +3 -6
  224. package/src/sap/ui/core/messagebundle_da.properties +3 -6
  225. package/src/sap/ui/core/messagebundle_de.properties +3 -6
  226. package/src/sap/ui/core/messagebundle_el.properties +3 -6
  227. package/src/sap/ui/core/messagebundle_en.properties +3 -6
  228. package/src/sap/ui/core/messagebundle_en_GB.properties +3 -6
  229. package/src/sap/ui/core/messagebundle_en_US_saprigi.properties +3 -6
  230. package/src/sap/ui/core/messagebundle_es.properties +3 -6
  231. package/src/sap/ui/core/messagebundle_es_MX.properties +3 -6
  232. package/src/sap/ui/core/messagebundle_et.properties +3 -6
  233. package/src/sap/ui/core/messagebundle_fi.properties +3 -6
  234. package/src/sap/ui/core/messagebundle_fr.properties +3 -6
  235. package/src/sap/ui/core/messagebundle_fr_CA.properties +3 -6
  236. package/src/sap/ui/core/messagebundle_hi.properties +3 -6
  237. package/src/sap/ui/core/messagebundle_hr.properties +3 -6
  238. package/src/sap/ui/core/messagebundle_hu.properties +3 -6
  239. package/src/sap/ui/core/messagebundle_id.properties +3 -6
  240. package/src/sap/ui/core/messagebundle_it.properties +53 -56
  241. package/src/sap/ui/core/messagebundle_iw.properties +3 -6
  242. package/src/sap/ui/core/messagebundle_ja.properties +3 -6
  243. package/src/sap/ui/core/messagebundle_kk.properties +3 -6
  244. package/src/sap/ui/core/messagebundle_ko.properties +3 -6
  245. package/src/sap/ui/core/messagebundle_lt.properties +3 -6
  246. package/src/sap/ui/core/messagebundle_lv.properties +3 -6
  247. package/src/sap/ui/core/messagebundle_mk.properties +3 -6
  248. package/src/sap/ui/core/messagebundle_ms.properties +3 -6
  249. package/src/sap/ui/core/messagebundle_nl.properties +3 -6
  250. package/src/sap/ui/core/messagebundle_no.properties +4 -7
  251. package/src/sap/ui/core/messagebundle_pl.properties +3 -6
  252. package/src/sap/ui/core/messagebundle_pt.properties +3 -6
  253. package/src/sap/ui/core/messagebundle_pt_PT.properties +3 -6
  254. package/src/sap/ui/core/messagebundle_ro.properties +3 -6
  255. package/src/sap/ui/core/messagebundle_ru.properties +3 -6
  256. package/src/sap/ui/core/messagebundle_sh.properties +3 -6
  257. package/src/sap/ui/core/messagebundle_sk.properties +3 -6
  258. package/src/sap/ui/core/messagebundle_sl.properties +3 -6
  259. package/src/sap/ui/core/messagebundle_sr.properties +3 -6
  260. package/src/sap/ui/core/messagebundle_sv.properties +3 -6
  261. package/src/sap/ui/core/messagebundle_th.properties +3 -6
  262. package/src/sap/ui/core/messagebundle_tr.properties +3 -6
  263. package/src/sap/ui/core/messagebundle_uk.properties +3 -6
  264. package/src/sap/ui/core/messagebundle_vi.properties +3 -6
  265. package/src/sap/ui/core/messagebundle_zh_CN.properties +3 -6
  266. package/src/sap/ui/core/messagebundle_zh_TW.properties +3 -6
  267. package/src/sap/ui/core/mvc/Controller.js +2 -2
  268. package/src/sap/ui/core/mvc/HTMLView.js +1 -1
  269. package/src/sap/ui/core/mvc/JSONView.js +1 -1
  270. package/src/sap/ui/core/mvc/JSView.js +1 -1
  271. package/src/sap/ui/core/mvc/TemplateView.js +1 -1
  272. package/src/sap/ui/core/mvc/View.js +3 -3
  273. package/src/sap/ui/core/mvc/XMLView.js +2 -2
  274. package/src/sap/ui/core/plugin/DeclarativeSupport.js +1 -1
  275. package/src/sap/ui/core/plugin/LessSupport.js +1 -1
  276. package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
  277. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  278. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  279. package/src/sap/ui/core/routing/Route.js +4 -4
  280. package/src/sap/ui/core/routing/Router.js +5 -5
  281. package/src/sap/ui/core/routing/Targets.js +3 -3
  282. package/src/sap/ui/core/routing/async/Target.js +1 -1
  283. package/src/sap/ui/core/routing/async/Targets.js +2 -2
  284. package/src/sap/ui/core/rules/App.support.js +13 -2
  285. package/src/sap/ui/core/search/OpenSearchProvider.js +1 -1
  286. package/src/sap/ui/core/search/SearchProvider.js +1 -1
  287. package/src/sap/ui/core/service/Service.js +1 -1
  288. package/src/sap/ui/core/service/ServiceFactory.js +1 -1
  289. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  290. package/src/sap/ui/core/support/Plugin.js +1 -1
  291. package/src/sap/ui/core/support/Support.js +1 -1
  292. package/src/sap/ui/core/support/plugins/ControlTree.js +1 -1
  293. package/src/sap/ui/core/support/plugins/Interaction.js +1 -1
  294. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  295. package/src/sap/ui/core/support/plugins/Performance.js +1 -1
  296. package/src/sap/ui/core/support/plugins/Selector.js +1 -1
  297. package/src/sap/ui/core/support/plugins/TechInfo.js +1 -1
  298. package/src/sap/ui/core/support/plugins/Trace.js +1 -1
  299. package/src/sap/ui/core/support/plugins/ViewInfo.js +1 -1
  300. package/src/sap/ui/core/theming/Parameters.js +6 -6
  301. package/src/sap/ui/core/theming/ThemeHelper.js +16 -13
  302. package/src/sap/ui/core/theming/ThemeManager.js +1 -1
  303. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
  304. package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
  305. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
  306. package/src/sap/ui/core/tmpl/Template.js +1 -1
  307. package/src/sap/ui/core/tmpl/TemplateControl.js +1 -1
  308. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  309. package/src/sap/ui/core/util/Export.js +1 -1
  310. package/src/sap/ui/core/util/ExportCell.js +1 -1
  311. package/src/sap/ui/core/util/ExportColumn.js +1 -1
  312. package/src/sap/ui/core/util/ExportRow.js +1 -1
  313. package/src/sap/ui/core/util/ExportType.js +1 -1
  314. package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
  315. package/src/sap/ui/core/util/File.js +1 -1
  316. package/src/sap/ui/core/util/LibraryInfo.js +1 -1
  317. package/src/sap/ui/core/util/MockServer.js +1 -1
  318. package/src/sap/ui/core/util/PasteHelper.js +1 -1
  319. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  320. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  321. package/src/sap/ui/core/util/serializer/ViewSerializer.js +1 -1
  322. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  323. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  324. package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
  325. package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
  326. package/src/sap/ui/core/webc/WebComponent.js +1 -1
  327. package/src/sap/ui/core/webc/WebComponentMetadata.js +1 -1
  328. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  329. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  330. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  331. package/src/sap/ui/debug/ControlTree.js +1 -1
  332. package/src/sap/ui/debug/DebugEnv.js +1 -1
  333. package/src/sap/ui/debug/PropertyList.js +1 -1
  334. package/src/sap/ui/dom/findTabbable.js +10 -1
  335. package/src/sap/ui/model/ClientModel.js +1 -1
  336. package/src/sap/ui/model/ClientTreeBinding.js +32 -19
  337. package/src/sap/ui/model/CompositeDataState.js +1 -1
  338. package/src/sap/ui/model/CompositeType.js +1 -1
  339. package/src/sap/ui/model/Context.js +0 -2
  340. package/src/sap/ui/model/DataState.js +1 -1
  341. package/src/sap/ui/model/ListBinding.js +19 -0
  342. package/src/sap/ui/model/MetaModel.js +1 -1
  343. package/src/sap/ui/model/Model.js +1 -1
  344. package/src/sap/ui/model/SelectionModel.js +1 -1
  345. package/src/sap/ui/model/SimpleType.js +1 -1
  346. package/src/sap/ui/model/TreeAutoExpandMode.js +1 -1
  347. package/src/sap/ui/model/TreeBinding.js +21 -17
  348. package/src/sap/ui/model/Type.js +1 -1
  349. package/src/sap/ui/model/analytics/AnalyticalBinding.js +4 -4
  350. package/src/sap/ui/model/json/JSONModel.js +12 -1
  351. package/src/sap/ui/model/message/MessageModel.js +1 -1
  352. package/src/sap/ui/model/odata/ODataAnnotations.js +1 -1
  353. package/src/sap/ui/model/odata/ODataMessageParser.js +1 -1
  354. package/src/sap/ui/model/odata/ODataMetaModel.js +1 -1
  355. package/src/sap/ui/model/odata/ODataMetadata.js +1 -1
  356. package/src/sap/ui/model/odata/ODataModel.js +1 -1
  357. package/src/sap/ui/model/odata/ODataTreeBindingFlat.js +106 -19
  358. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  359. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  360. package/src/sap/ui/model/odata/type/Currency.js +1 -1
  361. package/src/sap/ui/model/odata/type/Date.js +1 -1
  362. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  363. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  364. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  365. package/src/sap/ui/model/odata/type/DateTimeWithTimezone.js +1 -1
  366. package/src/sap/ui/model/odata/type/Decimal.js +1 -1
  367. package/src/sap/ui/model/odata/type/Double.js +1 -1
  368. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  369. package/src/sap/ui/model/odata/type/Int.js +1 -1
  370. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  371. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  372. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  373. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  374. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  375. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  376. package/src/sap/ui/model/odata/type/Single.js +1 -1
  377. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  378. package/src/sap/ui/model/odata/type/String.js +1 -1
  379. package/src/sap/ui/model/odata/type/Time.js +1 -1
  380. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  381. package/src/sap/ui/model/odata/type/Unit.js +1 -1
  382. package/src/sap/ui/model/odata/v2/Context.js +1 -1
  383. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +1 -1
  384. package/src/sap/ui/model/odata/v2/ODataModel.js +33 -2
  385. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +1 -1
  386. package/src/sap/ui/model/odata/v4/Context.js +62 -13
  387. package/src/sap/ui/model/odata/v4/ODataBinding.js +4 -0
  388. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +1 -1
  389. package/src/sap/ui/model/odata/v4/ODataListBinding.js +58 -81
  390. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +20 -10
  391. package/src/sap/ui/model/odata/v4/ODataModel.js +65 -11
  392. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +1 -1
  393. package/src/sap/ui/model/odata/v4/lib/_AggregationCache.js +75 -8
  394. package/src/sap/ui/model/odata/v4/lib/_AggregationHelper.js +13 -4
  395. package/src/sap/ui/model/odata/v4/lib/_Cache.js +106 -10
  396. package/src/sap/ui/model/odata/v4/lib/_Helper.js +62 -4
  397. package/src/sap/ui/model/odata/v4/lib/_MetadataRequestor.js +49 -31
  398. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +22 -28
  399. package/src/sap/ui/model/odata/v4/lib/_TreeState.js +51 -30
  400. package/src/sap/ui/model/resource/ResourceModel.js +1 -1
  401. package/src/sap/ui/model/type/Boolean.js +1 -1
  402. package/src/sap/ui/model/type/Currency.js +1 -1
  403. package/src/sap/ui/model/type/Date.js +3 -2
  404. package/src/sap/ui/model/type/DateInterval.js +3 -2
  405. package/src/sap/ui/model/type/DateTime.js +1 -1
  406. package/src/sap/ui/model/type/DateTimeInterval.js +1 -1
  407. package/src/sap/ui/model/type/FileSize.js +1 -1
  408. package/src/sap/ui/model/type/Float.js +1 -1
  409. package/src/sap/ui/model/type/Integer.js +1 -1
  410. package/src/sap/ui/model/type/String.js +1 -1
  411. package/src/sap/ui/model/type/Time.js +1 -1
  412. package/src/sap/ui/model/type/TimeInterval.js +1 -1
  413. package/src/sap/ui/model/type/Unit.js +1 -1
  414. package/src/sap/ui/model/xml/XMLModel.js +1 -1
  415. package/src/sap/ui/performance/trace/FESR.js +19 -10
  416. package/src/sap/ui/performance/trace/Interaction.js +45 -659
  417. package/src/sap/ui/performance/trace/_InteractionImpl.js +705 -0
  418. package/src/sap/ui/qunit/utils/ControlIterator.js +1 -1
  419. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +1 -1
  420. package/src/sap/ui/test/TestUtils.js +6 -5
  421. package/src/sap/ui/test/generic/TestBase.js +1 -1
  422. package/src/sap/ui/test/gherkin/opa5TestHarness.js +6 -2
  423. package/src/sap/ui/util/Storage.js +1 -1
  424. package/src/sap/ui/util/_enforceNoReturnValue.js +1 -1
  425. package/src/ui5loader.js +1 -1
@@ -3,54 +3,12 @@
3
3
  * (c) Copyright 2009-2024 SAP SE or an SAP affiliate company.
4
4
  * Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
5
5
  */
6
-
7
- /*global HTMLScriptElement */
8
6
  sap.ui.define([
9
- "sap/ui/performance/Measurement",
10
- "sap/ui/performance/XHRInterceptor",
11
- "sap/ui/performance/trace/FESRHelper",
12
- "sap/base/util/LoaderExtensions",
13
- "sap/base/util/now",
14
- "sap/base/util/uid",
15
- "sap/base/Log",
16
- "sap/ui/thirdparty/URI"
17
- ], function(Measurement, XHRInterceptor, FESRHelper, LoaderExtensions, now, uid, Log, URI) {
18
-
7
+ ], function() {
19
8
  "use strict";
20
9
 
21
-
22
- var HOST = window.location.host, // static per session
23
- INTERACTION = "INTERACTION",
24
- isNavigation = false,
25
- aInteractions = [],
26
- oPendingInteraction,
27
- mCompressedMimeTypes = {
28
- "application/zip": true,
29
- "application/vnd.rar": true,
30
- "application/gzip": true,
31
- "application/x-tar": true,
32
- "application/java-archive": true,
33
- "image/jpeg": true,
34
- "application/pdf": true
35
- },
36
- sCompressedExtensions = "zip,rar,arj,z,gz,tar,lzh,cab,hqx,ace,jar,ear,war,jpg,jpeg,pdf,gzip";
37
- let bInitialized = false,
38
- iResetCurrentBrowserEventTimer;
39
-
40
- function isCORSRequest(sUrl) {
41
- var sHost = new URI(sUrl.toString()).host();
42
- // url is relative or with same host
43
- return sHost && sHost !== HOST;
44
- }
45
-
46
- function hexToAscii(sValue) {
47
- var hex = sValue.toString();
48
- var str = '';
49
- for (var n = 0; n < hex.length; n += 2) {
50
- str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));
51
- }
52
- return str.trim();
53
- }
10
+ let bInteractionActive = false;
11
+ let oInteractionImpl;
54
12
 
55
13
  /**
56
14
  * The SAP Statistics for OData
@@ -99,324 +57,6 @@ sap.ui.define([
99
57
  * @property {string} rootId The root context ID
100
58
  */
101
59
 
102
- function createMeasurement(iTime) {
103
- return {
104
- event: "startup", // event which triggered interaction - default is startup interaction
105
- trigger: "undetermined", // control which triggered interaction
106
- component: "undetermined", // component or app identifier
107
- appVersion: "undetermined", // application version as from app descriptor
108
- start: iTime || performance.timeOrigin, // interaction start - page timeOrigin if initial
109
- end: 0, // interaction end
110
- navigation: 0, // sum over all navigation times
111
- roundtrip: 0, // time from first request sent to last received response end - without gaps and ignored overlap
112
- processing: 0, // client processing time
113
- duration: 0, // interaction duration
114
- requests: [], // Performance API requests during interaction
115
- measurements: [], // Measurements
116
- sapStatistics: [], // SAP Statistics for OData
117
- requestTime: 0, // sum over all requests in the interaction (oPendingInteraction.requests[0].responseEnd-oPendingInteraction.requests[0].requestStart)
118
- networkTime: 0, // request time minus server time from the header
119
- bytesSent: 0, // sum over all requests bytes
120
- bytesReceived: 0, // sum over all response bytes
121
- requestCompression: "X", // ok per default, if compression does not match SAP rules we report an empty string
122
- busyDuration: 0, // summed GlobalBusyIndicator duration during this interaction
123
- id: uid(), //Interaction ID
124
- passportAction: "undetermined_startup_0", //default PassportAction for startup
125
- rootId: undefined // root context ID
126
- };
127
- }
128
-
129
- function isCompleteMeasurement(oMeasurement) {
130
- if (oMeasurement.start > oPendingInteraction.start && oMeasurement.end < oPendingInteraction.end) {
131
- return oMeasurement;
132
- }
133
- }
134
-
135
- /**
136
- * Check if request is initiated by XHR, comleted and timeframe of request is within timeframe of current interaction
137
- *
138
- * @param {object} oRequestTiming PerformanceResourceTiming as retrieved by performance.getEntryByType("resource")
139
- * @return {boolean} true if the request is a completed XHR with started and ended within the current interaction
140
- * @private
141
- */
142
- function isValidInteractionXHR(oRequestTiming) {
143
- // if the request has been completed it has complete timing figures)
144
- var bComplete = oRequestTiming.startTime > 0 &&
145
- oRequestTiming.startTime <= oRequestTiming.requestStart &&
146
- oRequestTiming.requestStart <= oRequestTiming.responseEnd;
147
-
148
- var bPartOfInteraction = oPendingInteraction.start <= (performance.timeOrigin + oRequestTiming.requestStart) &&
149
- oPendingInteraction.end >= (performance.timeOrigin + oRequestTiming.responseEnd);
150
-
151
- return bPartOfInteraction && bComplete && oRequestTiming.initiatorType === "xmlhttprequest";
152
- }
153
-
154
- function aggregateRequestTiming(oRequest) {
155
- // aggregate navigation and roundtrip with respect to requests overlapping and times w/o requests (gaps)
156
- this.end = oRequest.responseEnd > this.end ? oRequest.responseEnd : this.end;
157
- // sum up request time as a grand total over all requests
158
- oPendingInteraction.requestTime += (oRequest.responseEnd - oRequest.startTime);
159
-
160
- // if there is a gap between requests we add the times to the aggrgate and shift the lower limits
161
- if (this.roundtripHigherLimit <= oRequest.startTime) {
162
- oPendingInteraction.navigation += (this.navigationHigherLimit - this.navigationLowerLimit);
163
- oPendingInteraction.roundtrip += (this.roundtripHigherLimit - this.roundtripLowerLimit);
164
- this.navigationLowerLimit = oRequest.startTime;
165
- this.roundtripLowerLimit = oRequest.startTime;
166
- }
167
-
168
- // shift the limits if this request was completed later than the earlier requests
169
- if (oRequest.responseEnd > this.roundtripHigherLimit) {
170
- this.roundtripHigherLimit = oRequest.responseEnd;
171
- }
172
- if (oRequest.requestStart > this.navigationHigherLimit) {
173
- this.navigationHigherLimit = oRequest.requestStart;
174
- }
175
- }
176
-
177
- function aggregateRequestTimings(aRequests) {
178
- var oTimings = {
179
- start: aRequests[0].startTime,
180
- end: aRequests[0].responseEnd,
181
- navigationLowerLimit: aRequests[0].startTime,
182
- navigationHigherLimit: aRequests[0].requestStart,
183
- roundtripLowerLimit: aRequests[0].startTime,
184
- roundtripHigherLimit: aRequests[0].responseEnd
185
- };
186
-
187
- // aggregate all timings by operating on the oTimings object
188
- aRequests.forEach(aggregateRequestTiming, oTimings);
189
- oPendingInteraction.navigation += (oTimings.navigationHigherLimit - oTimings.navigationLowerLimit);
190
- oPendingInteraction.roundtrip += (oTimings.roundtripHigherLimit - oTimings.roundtripLowerLimit);
191
-
192
- // calculate average network time per request
193
- if (oPendingInteraction.networkTime) {
194
- var iTotalNetworkTime = oPendingInteraction.requestTime - oPendingInteraction.networkTime;
195
- oPendingInteraction.networkTime = iTotalNetworkTime / aRequests.length;
196
- } else {
197
- oPendingInteraction.networkTime = 0;
198
- }
199
- }
200
-
201
- function finalizeInteraction(iTime) {
202
- if (oPendingInteraction) {
203
- var aAllRequestTimings = performance.getEntriesByType("resource");
204
- var oFinshedInteraction;
205
- oPendingInteraction.end = iTime;
206
- oPendingInteraction.processing = iTime - oPendingInteraction.start;
207
- oPendingInteraction.duration = oPendingInteraction.processing;
208
- oPendingInteraction.requests = aAllRequestTimings.filter(isValidInteractionXHR);
209
- oPendingInteraction.completeRoundtrips = 0;
210
- oPendingInteraction.measurements = Measurement.filterMeasurements(isCompleteMeasurement, true);
211
- if (oPendingInteraction.requests.length > 0) {
212
- aggregateRequestTimings(oPendingInteraction.requests);
213
- }
214
- oPendingInteraction.completeRoundtrips = oPendingInteraction.requests.length;
215
-
216
- // calculate real processing time if any processing took place
217
- // cannot be negative as then requests took longer than processing
218
- var iProcessing = oPendingInteraction.processing - oPendingInteraction.navigation - oPendingInteraction.roundtrip;
219
- oPendingInteraction.processing = iProcessing > -1 ? iProcessing : 0;
220
-
221
- oPendingInteraction.completed = true;
222
-
223
- // Duration threshold 2 in order to filter not performance relevant interactions such as liveChange
224
- if (oPendingInteraction.semanticStepName || oPendingInteraction.duration >= 2 || oPendingInteraction.requests.length > 0 || isNavigation) {
225
- aInteractions.push(oPendingInteraction);
226
- oFinshedInteraction = aInteractions[aInteractions.length - 1];
227
- if (Log.isLoggable()) {
228
- Log.debug("Interaction step finished: trigger: " + oPendingInteraction.trigger + "; duration: " + oPendingInteraction.duration + "; requests: " + oPendingInteraction.requests.length, "Interaction.js");
229
- }
230
- }
231
- // Execute onInteractionFinished always in case function exist to enable cleanup in FESR independent of filtering
232
- if (Interaction.onInteractionFinished) {
233
- Interaction.onInteractionFinished(oFinshedInteraction);
234
- }
235
- Object.freeze(oPendingInteraction);
236
- oPendingInteraction = null;
237
- oCurrentBrowserEvent = null;
238
- isNavigation = false;
239
- bMatched = false;
240
- bPerfectMatch = false;
241
- clearTimeout(iResetCurrentBrowserEventTimer);
242
- }
243
- }
244
-
245
- // component determination - heuristic
246
- function createOwnerComponentInfo(oSrcElement) {
247
- var sId, sVersion;
248
- if (oSrcElement) {
249
- var Component, oComponent;
250
- Component = sap.ui.require("sap/ui/core/Component");
251
- if (Component) {
252
- while (oSrcElement && oSrcElement.getParent) {
253
- oComponent = Component.getOwnerComponentFor(oSrcElement);
254
- if (oComponent || oSrcElement instanceof Component) {
255
- oComponent = oComponent || oSrcElement;
256
- var oApp = oComponent.getManifestEntry("sap.app");
257
- // get app id or module name for FESR
258
- sId = oApp && oApp.id || oComponent.getMetadata().getName();
259
- sVersion = oApp && oApp.applicationVersion && oApp.applicationVersion.version;
260
- }
261
- oSrcElement = oSrcElement.getParent();
262
- }
263
- }
264
- }
265
- return {
266
- id: sId ? sId : "undetermined",
267
- version: sVersion ? sVersion : ""
268
- };
269
- }
270
-
271
- var bInteractionActive = false,
272
- oCurrentBrowserEvent,
273
- oBrowserElement,
274
- bMatched = false,
275
- bPerfectMatch = false,
276
- iInteractionStepTimer,
277
- bIdle = false,
278
- bSuspended = false,
279
- iInteractionCounter = 0,
280
- descScriptSrc = Object.getOwnPropertyDescriptor(HTMLScriptElement.prototype, "src");
281
-
282
- /* As UI5 resources gets also loaded via script tags we need to
283
- * intercept this kind of loading as well. We assume that changing the
284
- * 'src' property indicates a resource loading via a script tag. In some cases
285
- * the src property will be updated multiple times, so we should intercept
286
- * the same script tag only once (dataset.sapUiCoreInteractionHandled)
287
- */
288
- function interceptScripts() {
289
- Object.defineProperty(HTMLScriptElement.prototype, "src", {
290
- set: function(val) {
291
- var fnDone;
292
-
293
- if (!this.dataset.sapUiCoreInteractionHandled) {
294
- fnDone = Interaction.notifyAsyncStep();
295
- this.addEventListener("load", function() {
296
- fnDone();
297
- });
298
- this.addEventListener("error" , function() {
299
- fnDone();
300
- });
301
- this.dataset.sapUiCoreInteractionHandled = "true";
302
- }
303
- descScriptSrc.set.call(this, val);
304
- },
305
- get: descScriptSrc.get
306
- });
307
- }
308
-
309
- function registerXHROverrides() {
310
- // store the byte size of the body
311
- XHRInterceptor.register(INTERACTION, "send" ,function() {
312
- if (this.pendingInteraction) {
313
- // double string length for byte length as in js characters are stored as 16 bit ints
314
- this.pendingInteraction.bytesSent += arguments[0] ? arguments[0].length : 0;
315
- }
316
- });
317
-
318
- // store request header size
319
- XHRInterceptor.register(INTERACTION, "setRequestHeader", function(sHeader, sValue) {
320
- // count request header length consistent to what getAllResponseHeaders().length would return
321
- if (!this.requestHeaderLength) {
322
- this.requestHeaderLength = 0;
323
- }
324
- // assume request header byte size
325
- this.requestHeaderLength += (sHeader + "").length + (sValue + "").length;
326
-
327
- });
328
-
329
- // register the response handler for data collection
330
- XHRInterceptor.register(INTERACTION, "open", function (sMethod, sUrl, bAsync) {
331
- var sEpp,
332
- sAction,
333
- sRootContextID;
334
-
335
- function handleInteraction(fnDone) {
336
- if (this.readyState === 4) {
337
- fnDone();
338
- }
339
- }
340
- // we only need to take care of requests when we have a running interaction
341
- if (oPendingInteraction) {
342
- var bIsNoCorsRequest = !isCORSRequest(sUrl);
343
- // only use Interaction for non CORS requests
344
- if (bIsNoCorsRequest) {
345
- //only track if FESR.clientID == EPP.Action && FESR.rootContextID == EPP.rootContextID
346
- sEpp = Interaction.passportHeader.get(this);
347
- if (sEpp && sEpp.length >= 370) {
348
- sAction = hexToAscii(sEpp.substring(150, 230));
349
- if (parseInt(sEpp.substring(8, 10), 16) > 2) { // version number > 2 --> extended passport
350
- sRootContextID = sEpp.substring(372, 404);
351
- }
352
- }
353
- if (!sEpp || sAction && sRootContextID && oPendingInteraction.passportAction.endsWith(sAction)) {
354
- this.addEventListener("readystatechange", handleResponse.bind(this, oPendingInteraction.id));
355
- }
356
- }
357
- // arguments at position 2 is indicatior whether request is async or not
358
- // readystatechange must not be used for sync CORS request since it does not work properly
359
- // this is especially necessary in case request was not started by LoaderExtension
360
- // bAsync is by default true, therefore we need to check eplicitly for value 'false'
361
- if (bIsNoCorsRequest || bAsync !== false) {
362
- // notify async step for all XHRs (even CORS requests)
363
- this.addEventListener("readystatechange", handleInteraction.bind(this, Interaction.notifyAsyncStep()));
364
- }
365
- // assign the current interaction to the xhr for later response header retrieval.
366
- this.pendingInteraction = oPendingInteraction;
367
- }
368
- });
369
-
370
- }
371
-
372
- // check if SAP compression rules are fulfilled
373
- function checkCompression(sURL, sContentEncoding, sContentType, sContentLength) {
374
- //remove hashes and queries + find extension (last . segment)
375
- var fileExtension = sURL.split('.').pop().split(/\#|\?/)[0];
376
-
377
- if (sContentEncoding === 'gzip' ||
378
- sContentEncoding === 'br' ||
379
- sContentType in mCompressedMimeTypes ||
380
- (fileExtension && sCompressedExtensions.indexOf(fileExtension) !== -1) ||
381
- sContentLength < 1024) {
382
- return true;
383
- } else {
384
- return false;
385
- }
386
- }
387
-
388
- // response handler which uses the custom properties we added to the xhr to retrieve information from the response headers
389
- function handleResponse(sId) {
390
- if (this.readyState === 4) {
391
- if (this.pendingInteraction && !this.pendingInteraction.completed && oPendingInteraction.id === sId) {
392
- // enrich interaction with information
393
- var sContentLength = this.getResponseHeader("content-length"),
394
- bCompressed = checkCompression(this.responseURL, this.getResponseHeader("content-encoding"), this.getResponseHeader("content-type"), sContentLength),
395
- sFesrec = this.getResponseHeader("sap-perf-fesrec");
396
- this.pendingInteraction.bytesReceived += sContentLength ? parseInt(sContentLength) : 0;
397
- this.pendingInteraction.bytesReceived += this.getAllResponseHeaders().length;
398
- this.pendingInteraction.bytesSent += this.requestHeaderLength || 0;
399
- // this should be true only if all responses are compressed
400
- this.pendingInteraction.requestCompression = bCompressed && (this.pendingInteraction.requestCompression !== false);
401
- // sap-perf-fesrec header contains milliseconds
402
- this.pendingInteraction.networkTime += sFesrec ? Math.round(parseFloat(sFesrec, 10) / 1000) : 0;
403
- var sSapStatistics = this.getResponseHeader("sap-statistics");
404
- if (sSapStatistics) {
405
- var aTimings = performance.getEntriesByType("resource");
406
- this.pendingInteraction.sapStatistics.push({
407
- // add response url for mapping purposes
408
- url: this.responseURL,
409
- statistics: sSapStatistics,
410
- timing: aTimings ? aTimings[aTimings.length - 1] : undefined
411
- });
412
- }
413
- delete this.requestHeaderLength;
414
- delete this.pendingInteraction;
415
- }
416
- }
417
- }
418
-
419
-
420
60
  /**
421
61
  * Provides base functionality for interaction detection heuristics & API.
422
62
 
@@ -449,11 +89,7 @@ sap.ui.define([
449
89
  * @since 1.76
450
90
  */
451
91
  getAll : function(bFinalize) {
452
- if (bFinalize) {
453
- // force the finalization of the currently pending interaction
454
- Interaction.end(true);
455
- }
456
- return aInteractions;
92
+ return [];
457
93
  },
458
94
 
459
95
  /**
@@ -472,15 +108,7 @@ sap.ui.define([
472
108
  * @since 1.76
473
109
  */
474
110
  filter : function(fnFilter) {
475
- var aFilteredInteractions = [];
476
- if (fnFilter) {
477
- for (var i = 0, l = aInteractions.length; i < l; i++) {
478
- if (fnFilter(aInteractions[i])) {
479
- aFilteredInteractions.push(aInteractions[i]);
480
- }
481
- }
482
- }
483
- return aFilteredInteractions;
111
+ return [];
484
112
  },
485
113
  /**
486
114
  * Gets the incomplete pending interaction.
@@ -490,7 +118,7 @@ sap.ui.define([
490
118
  * @private
491
119
  */
492
120
  getPending : function() {
493
- return oPendingInteraction;
121
+ return undefined;
494
122
  },
495
123
 
496
124
  /**
@@ -498,9 +126,7 @@ sap.ui.define([
498
126
  *
499
127
  * @private
500
128
  */
501
- clear : function() {
502
- aInteractions = [];
503
- },
129
+ clear : function() {},
504
130
 
505
131
  /**
506
132
  * Start an interaction measurements.
@@ -510,44 +136,7 @@ sap.ui.define([
510
136
  * @static
511
137
  * @private
512
138
  */
513
- start : function(sType, oSrcElement) {
514
- var iTime = now();
515
-
516
- if (oPendingInteraction) {
517
- finalizeInteraction(iTime);
518
- }
519
-
520
- //reset async counter/timer
521
- if (iInteractionStepTimer) {
522
- clearTimeout(iInteractionStepTimer);
523
- }
524
- iInteractionCounter = 0;
525
-
526
- // clear request timings for new interaction
527
- if (performance.clearResourceTimings) {
528
- performance.clearResourceTimings();
529
- }
530
-
531
- var oComponentInfo = createOwnerComponentInfo(oSrcElement);
532
-
533
- // setup new pending interaction
534
- oPendingInteraction = createMeasurement(bInitialized ? iTime : undefined);
535
- oPendingInteraction.event = sType;
536
- oPendingInteraction.component = oComponentInfo.id;
537
- oPendingInteraction.appVersion = oComponentInfo.version;
538
- if (oSrcElement && oSrcElement.getId) {
539
- oPendingInteraction.trigger = oSrcElement.getId();
540
- oPendingInteraction.semanticStepName = FESRHelper.getSemanticStepname(oSrcElement, sType);
541
- }
542
- /*eslint-disable no-console */
543
- if (Log.isLoggable(null, "sap.ui.Performance")) {
544
- console.time("INTERACTION: " + oPendingInteraction.trigger + " - " + oPendingInteraction.event);
545
- }
546
- /*eslint-enable no-console */
547
- if (Log.isLoggable()) {
548
- Log.debug("Interaction step started: trigger: " + oPendingInteraction.trigger + "; type: " + oPendingInteraction.event, "Interaction.js");
549
- }
550
- },
139
+ start : function(sType, oSrcElement) {},
551
140
 
552
141
  /**
553
142
  * End an interaction measurements.
@@ -556,24 +145,7 @@ sap.ui.define([
556
145
  * @static
557
146
  * @private
558
147
  */
559
- end : function(bForce) {
560
- if (oPendingInteraction) {
561
- if (bForce) {
562
- /*eslint-disable no-console */
563
- if (Log.isLoggable(null, "sap.ui.Performance")) {
564
- console.timeEnd("INTERACTION: " + oPendingInteraction.trigger + " - " + oPendingInteraction.event);
565
- }
566
- /*eslint-enable no-console */
567
- finalizeInteraction(oPendingInteraction.preliminaryEnd || now());
568
- if (Log.isLoggable()) {
569
- Log.debug("Interaction ended...");
570
- }
571
- } else {
572
- // set provisionary processing time from start to end and calculate later
573
- oPendingInteraction.preliminaryEnd = now();
574
- }
575
- }
576
- },
148
+ end : function(bForce) {},
577
149
 
578
150
  /**
579
151
  * Returns true if the interaction detection was enabled explicitly, or implicitly along with fesr.
@@ -591,25 +163,28 @@ sap.ui.define([
591
163
  * Enables the interaction tracking.
592
164
  *
593
165
  * @param {boolean} bActive State of the interaction detection
594
- *
166
+ * @returns {Promise} Resolves when FESR is active
595
167
  * @static
596
168
  * @public
597
169
  * @since 1.76
598
170
  */
599
- setActive : function(bActive) {
171
+ setActive : async function(bActive) {
600
172
  bInteractionActive = bActive;
601
173
  if (bActive) {
602
- if (!bInitialized) {
603
- registerXHROverrides();
604
- interceptScripts();
605
- //intercept resource loading from preloads
606
- LoaderExtensions.notifyResourceLoading = Interaction.notifyAsyncStep;
607
- }
608
- Interaction.notifyStepStart("startup", "startup", true);
609
- // The following line must happen after 'notifyStepStart' because we determine
610
- // if we should intially use the performance timing API or afterwords the
611
- // current timestamp
612
- bInitialized = true;
174
+ await new Promise((resolve, reject) => {
175
+ sap.ui.require([
176
+ "sap/ui/performance/trace/_InteractionImpl"
177
+ ], (
178
+ _InteractionImpl
179
+ ) => {
180
+ Object.assign(Interaction, _InteractionImpl);
181
+ oInteractionImpl = _InteractionImpl;
182
+ oInteractionImpl._setActive(bActive);
183
+ resolve();
184
+ }, reject);
185
+ });
186
+ } else {
187
+ oInteractionImpl?._setActive(bActive);
613
188
  }
614
189
  },
615
190
 
@@ -617,33 +192,21 @@ sap.ui.define([
617
192
  * Mark interaction as navigation related
618
193
  * @private
619
194
  */
620
- notifyNavigation: function() {
621
- isNavigation = true;
622
- },
195
+ notifyNavigation: function() {},
623
196
 
624
197
  /**
625
198
  * Start tracking busy time for a Control
626
- * @param {sap.ui.core.Control} oControl
199
+ * @param {sap.ui.core.Control} oControl Start tracking of busy duration for the given control
627
200
  * @private
628
201
  */
629
- notifyShowBusyIndicator : function(oControl) {
630
- oControl._sapui_fesr_fDelayedStartTime = now() + oControl.getBusyIndicatorDelay();
631
- },
202
+ notifyShowBusyIndicator : function(oControl) {},
632
203
 
633
204
  /**
634
205
  * End tracking busy time for a Control
635
- * @param {sap.ui.core.Control} oControl
206
+ * @param {sap.ui.core.Control} oControl End tracking of busy duration for the given control
636
207
  * @private
637
208
  */
638
- notifyHideBusyIndicator : function(oControl) {
639
- if (oControl._sapui_fesr_fDelayedStartTime) {
640
- // The busy indicator shown duration d is calculated with:
641
- // d = "time busy indicator was hidden" - "time busy indicator was requested" - "busy indicator delay"
642
- var fBusyIndicatorShownDuration = now() - oControl._sapui_fesr_fDelayedStartTime;
643
- Interaction.addBusyDuration((fBusyIndicatorShownDuration > 0) ? fBusyIndicatorShownDuration : 0);
644
- delete oControl._sapui_fesr_fDelayedStartTime;
645
- }
646
- },
209
+ notifyHideBusyIndicator : function(oControl) {},
647
210
 
648
211
  /**
649
212
  * This method starts the actual interaction measurement when all criteria are met. As it is the starting point
@@ -656,94 +219,7 @@ sap.ui.define([
656
219
  * @static
657
220
  * @private
658
221
  */
659
- notifyStepStart : function(sEventId, oElement, bForce) {
660
- if (bInteractionActive) {
661
- var sType,
662
- elem,
663
- sClosestSemanticStepName;
664
-
665
- if ((!oPendingInteraction && oCurrentBrowserEvent) || bForce) {
666
- if (bForce) {
667
- sType = "startup";
668
- } else {
669
- sType = sEventId;
670
- }
671
- Interaction.start(sType, oElement);
672
- oPendingInteraction = Interaction.getPending();
673
-
674
- // update pending interaction infos
675
- if (oPendingInteraction && !oPendingInteraction.completed && Interaction.onInteractionStarted) {
676
- oPendingInteraction.passportAction = Interaction.onInteractionStarted(oPendingInteraction, bForce);
677
- }
678
- // Interaction.start will delete oCurrentBrowserEvent in case there is an oPendingInteraction
679
- // (notifyStepStart is called with parameter bForce)
680
- // Conscious decision to not move the coding because this shouldn't be a productive scenario
681
- if (oCurrentBrowserEvent) {
682
- oBrowserElement = oCurrentBrowserEvent.srcControl;
683
- }
684
- // if browser event matches the first control event we take it for trigger/event determination (step name)
685
- sClosestSemanticStepName = FESRHelper.getSemanticStepname(oBrowserElement, sEventId);
686
- if (oElement && oElement.getId && oBrowserElement && oElement.getId() === oBrowserElement.getId()) {
687
- bPerfectMatch = true;
688
- } else if (sClosestSemanticStepName) {
689
- oPendingInteraction.trigger = oBrowserElement.getId();
690
- oPendingInteraction.semanticStepName = sClosestSemanticStepName;
691
- bPerfectMatch = true;
692
- } else {
693
- elem = oBrowserElement;
694
- while (elem && elem.getParent()) {
695
- elem = elem.getParent();
696
- if (oElement.getId() === elem.getId()) {
697
- // Stop looking for better fitting control in case the current browser event source control
698
- // is already child of the control event which triggers the interaction because all other
699
- // control events most likely does not suit better.
700
- // Example: Click on image of an button will not pass the previous if
701
- // (oElement.getId() !== oBrowserElement.getId() ==> btn !== btn-img).
702
- // In case the button is part of an popover and the click on the button closes the popover,
703
- // the coding below overwrites the button control id with the popover control id in case we
704
- // don't stop here.
705
- // Only look for better fitting control in case browser and control event does not fit at all
706
- bMatched = true;
707
- break;
708
- }
709
- }
710
- }
711
- oCurrentBrowserEvent = null;
712
- isNavigation = false;
713
- iResetCurrentBrowserEventTimer = setTimeout(function() {
714
- //cleanup internal registry after actual call stack.
715
- oCurrentBrowserEvent = null;
716
- }, 0);
717
- bIdle = false;
718
- Interaction.notifyStepEnd(true); // Start timer to end Interaction in case there is no timing relevant action e.g. rendering, request
719
- } else if (oPendingInteraction && oBrowserElement && !bPerfectMatch) {
720
- // if browser event matches one of the next control events we take it for trigger/event determination (step name)
721
- elem = oBrowserElement;
722
- sClosestSemanticStepName = FESRHelper.getSemanticStepname(oBrowserElement, sEventId);
723
- if (elem && oElement.getId() === elem.getId()) {
724
- oPendingInteraction.trigger = oElement.getId();
725
- oPendingInteraction.semanticStepName = sClosestSemanticStepName;
726
- oPendingInteraction.event = sEventId;
727
- bPerfectMatch = true;
728
- } else if (sClosestSemanticStepName) {
729
- oPendingInteraction.trigger = oBrowserElement.getId();
730
- oPendingInteraction.semanticStepName = sClosestSemanticStepName;
731
- bPerfectMatch = true;
732
- } else if (!bMatched) {
733
- while (elem && elem.getParent()) {
734
- elem = elem.getParent();
735
- if (oElement.getId() === elem.getId()) {
736
- oPendingInteraction.trigger = oElement.getId();
737
- oPendingInteraction.semanticStepName = FESRHelper.getSemanticStepname(oElement, sEventId);
738
- oPendingInteraction.event = sEventId;
739
- //if we find no direct match we consider the last control event for the trigger/event (step name)
740
- break;
741
- }
742
- }
743
- }
744
- }
745
- }
746
- },
222
+ notifyStepStart : function(sEventId, oElement, bForce) {},
747
223
 
748
224
  /**
749
225
  * Register async operation, that is relevant for a running interaction.
@@ -754,26 +230,7 @@ sap.ui.define([
754
230
  * @private
755
231
  */
756
232
  notifyAsyncStep : function(sStepName) {
757
- if (oPendingInteraction) {
758
- /*eslint-disable no-console */
759
- if (Log.isLoggable(null, "sap.ui.Performance") && sStepName) {
760
- console.time(sStepName);
761
- }
762
- /*eslint-enable no-console */
763
- var sInteractionId = oPendingInteraction.id;
764
- delete oPendingInteraction.preliminaryEnd; // Delete prelimanry end to force current timestamp of finalization
765
- Interaction.notifyAsyncStepStart();
766
- return function() {
767
- Interaction.notifyAsyncStepEnd(sInteractionId);
768
- /*eslint-disable no-console */
769
- if (Log.isLoggable(null, "sap.ui.Performance") && sStepName) {
770
- console.timeEnd(sStepName);
771
- }
772
- /*eslint-enable no-console */
773
- };
774
- } else {
775
- return function() {};
776
- }
233
+ return () => {};
777
234
  },
778
235
 
779
236
  /**
@@ -781,64 +238,24 @@ sap.ui.define([
781
238
  *
782
239
  * @private
783
240
  */
784
- notifyAsyncStepStart : function() {
785
- if (oPendingInteraction) {
786
- iInteractionCounter++;
787
- clearTimeout(iInteractionStepTimer);
788
- bIdle = false;
789
- if (Log.isLoggable()) {
790
- Log.debug("Interaction relevant step started - Number of pending steps: " + iInteractionCounter);
791
- }
792
- }
793
- },
241
+ notifyAsyncStepStart : function() {},
794
242
 
795
243
  /**
796
244
  * Ends a running interaction relevant step by decreasing the internal count.
797
245
  *
246
+ * @param {string} [sId] An internal step Id used for logging.
798
247
  * @private
799
248
  */
800
- notifyAsyncStepEnd : function(sId) {
801
- if (oPendingInteraction && sId === oPendingInteraction.id) {
802
- iInteractionCounter--;
803
- Interaction.notifyStepEnd(true);
804
- if (Log.isLoggable()) {
805
- Log.debug("Interaction relevant step stopped - Number of pending steps: " + iInteractionCounter);
806
- }
807
- }
808
- },
249
+ notifyAsyncStepEnd : function(sId) {},
809
250
 
810
251
  /**
811
252
  * This method ends the started interaction measurement.
812
253
  *
813
254
  * @static
255
+ * @param {boolean} bCheckIdle Whether cheking for idle time or not
814
256
  * @private
815
257
  */
816
- notifyStepEnd : function(bCheckIdle) {
817
- if (bInteractionActive && !bSuspended) {
818
- if (iInteractionCounter === 0 || !bCheckIdle) {
819
- if (bIdle || !bCheckIdle) {
820
- Interaction.end(true);
821
- if (Log.isLoggable()) {
822
- Log.debug("Interaction stopped");
823
- }
824
- bIdle = false;
825
- } else {
826
- Interaction.end(); //set preliminary end time
827
- bIdle = true;
828
- if (iInteractionStepTimer) {
829
- clearTimeout(iInteractionStepTimer);
830
- }
831
- // There are control events using a debouncing mechanism for e.g. suggest event (see sap.m.Input)
832
- // A common debounce treshhold (also used by sap.m.Input) is 300ms therefore we use setTimeout
833
- // with 301ms to end the Interaction after execution of the debounced event
834
- iInteractionStepTimer = setTimeout(Interaction.notifyStepEnd, 301);
835
- if (Log.isLoggable()) {
836
- Log.debug("Interaction check for idle time - Number of pending steps: " + iInteractionCounter);
837
- }
838
- }
839
- }
840
- }
841
- },
258
+ notifyStepEnd : function(bCheckIdle) {},
842
259
 
843
260
  /**
844
261
  * This method notifies if a relevant event has been triggered.
@@ -847,9 +264,7 @@ sap.ui.define([
847
264
  * @static
848
265
  * @private
849
266
  */
850
- notifyEventStart : function(oEvent) {
851
- oCurrentBrowserEvent = bInteractionActive ? oEvent : null;
852
- },
267
+ notifyEventStart : function(oEvent) {},
853
268
 
854
269
  /**
855
270
  * This method notifies if a scroll event has been triggered. Some controls require this special treatment,
@@ -869,30 +284,7 @@ sap.ui.define([
869
284
  * @static
870
285
  * @private
871
286
  */
872
- notifyEventEnd : function() {
873
- if (oCurrentBrowserEvent) {
874
- // End interaction when a new potential interaction starts
875
- if (oCurrentBrowserEvent.type.match(/^(mousedown|touchstart|keydown)$/)) {
876
- Interaction.end(/*bForce*/true);
877
- }
878
- // Clean up oCurrentBrowserEvent at the end to prevent dangling events
879
- // Since oCurrentBrowser event is prerequisite to start an event we need to
880
- // clean dangling browser events to avoid creating interactions based on these events
881
- // e.g. The user clicks first somewhere on the UI on a control without press handler.
882
- // After that the user scrolls in a table and triggers implicit requests via paging.
883
- // This combination will create an interaction based on the first browser event,
884
- // created and not cleaned up by the first click within the UI
885
- if (this.eventEndTimer) {
886
- clearTimeout(this.eventEndTimer);
887
- }
888
- this.eventEndTimer = setTimeout(function() {
889
- oCurrentBrowserEvent = null;
890
- delete this.eventEndTimer;
891
- // There are events fired within a timeout with delay. Cleanup after 10ms
892
- // to hopefully prevent cleaning up to early (before control event was fired)
893
- }.bind(this), 10);
894
- }
895
- },
287
+ notifyEventEnd : function() {},
896
288
 
897
289
  /**
898
290
  * A hook which is called when an interaction is started.
@@ -916,26 +308,20 @@ sap.ui.define([
916
308
  * from the actual owner component of the trigger control, which is still the previous component.
917
309
  *
918
310
  * @static
311
+ * @param {string} sComponentName The name of the component for the actual step.
919
312
  * @private
920
313
  */
921
- setStepComponent : function(sComponentName) {
922
- if (bInteractionActive && oPendingInteraction && sComponentName && !oPendingInteraction.stepComponent) {
923
- oPendingInteraction.stepComponent = sComponentName;
924
- }
925
- },
314
+ setStepComponent : function(sComponentName) {},
926
315
 
927
316
  /**
928
317
  * @param {float} iDuration Increase busy duration of pending interaction by this value
929
318
  * @static
930
319
  * @private
931
320
  */
932
- addBusyDuration : function (iDuration) {
933
- if (bInteractionActive && oPendingInteraction) {
934
- if (!oPendingInteraction.busyDuration) {
935
- oPendingInteraction.busyDuration = 0;
936
- }
937
- oPendingInteraction.busyDuration += iDuration;
938
- }
321
+ addBusyDuration : function (iDuration) {},
322
+
323
+ setFESR : function(oFESR) {
324
+ oInteractionImpl?._setFESR(oFESR);
939
325
  }
940
326
  };
941
327