@openui5/sap.ui.core 1.114.2 → 1.114.4

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 (260) hide show
  1. package/package.json +1 -1
  2. package/src/jquery.sap.global.js +1 -1
  3. package/src/jquery.sap.properties.js +1 -1
  4. package/src/jquery.sap.resources.js +1 -1
  5. package/src/jquery.sap.script.js +1 -1
  6. package/src/jquery.sap.storage.js +3 -3
  7. package/src/sap/base/config.js +1 -1
  8. package/src/sap/base/util/restricted/_CancelablePromise.js +1 -1
  9. package/src/sap/base/util/restricted/_castArray.js +1 -1
  10. package/src/sap/base/util/restricted/_compact.js +1 -1
  11. package/src/sap/base/util/restricted/_curry.js +1 -1
  12. package/src/sap/base/util/restricted/_debounce.js +1 -1
  13. package/src/sap/base/util/restricted/_difference.js +1 -1
  14. package/src/sap/base/util/restricted/_differenceBy.js +1 -1
  15. package/src/sap/base/util/restricted/_differenceWith.js +1 -1
  16. package/src/sap/base/util/restricted/_flatMap.js +1 -1
  17. package/src/sap/base/util/restricted/_flatMapDeep.js +1 -1
  18. package/src/sap/base/util/restricted/_flatMapDepth.js +1 -1
  19. package/src/sap/base/util/restricted/_flatten.js +1 -1
  20. package/src/sap/base/util/restricted/_flattenDeep.js +1 -1
  21. package/src/sap/base/util/restricted/_flattenDepth.js +1 -1
  22. package/src/sap/base/util/restricted/_intersection.js +1 -1
  23. package/src/sap/base/util/restricted/_intersectionBy.js +1 -1
  24. package/src/sap/base/util/restricted/_intersectionWith.js +1 -1
  25. package/src/sap/base/util/restricted/_isEqual.js +1 -1
  26. package/src/sap/base/util/restricted/_isEqualWith.js +1 -1
  27. package/src/sap/base/util/restricted/_isNil.js +1 -1
  28. package/src/sap/base/util/restricted/_max.js +1 -1
  29. package/src/sap/base/util/restricted/_merge.js +1 -1
  30. package/src/sap/base/util/restricted/_mergeWith.js +1 -1
  31. package/src/sap/base/util/restricted/_min.js +1 -1
  32. package/src/sap/base/util/restricted/_omit.js +1 -1
  33. package/src/sap/base/util/restricted/_pick.js +1 -1
  34. package/src/sap/base/util/restricted/_pickBy.js +1 -1
  35. package/src/sap/base/util/restricted/_throttle.js +1 -1
  36. package/src/sap/base/util/restricted/_toArray.js +1 -1
  37. package/src/sap/base/util/restricted/_union.js +1 -1
  38. package/src/sap/base/util/restricted/_unionBy.js +1 -1
  39. package/src/sap/base/util/restricted/_unionWith.js +1 -1
  40. package/src/sap/base/util/restricted/_uniq.js +1 -1
  41. package/src/sap/base/util/restricted/_uniqBy.js +1 -1
  42. package/src/sap/base/util/restricted/_uniqWith.js +1 -1
  43. package/src/sap/base/util/restricted/_without.js +1 -1
  44. package/src/sap/base/util/restricted/_xor.js +1 -1
  45. package/src/sap/base/util/restricted/_xorBy.js +1 -1
  46. package/src/sap/base/util/restricted/_xorWith.js +1 -1
  47. package/src/sap/base/util/restricted/_zipObject.js +1 -1
  48. package/src/sap/base/util/restricted/_zipObjectDeep.js +1 -1
  49. package/src/sap/ui/Device.js +3 -3
  50. package/src/sap/ui/Global.js +4 -4
  51. package/src/sap/ui/base/Event.js +1 -1
  52. package/src/sap/ui/base/EventProvider.js +1 -1
  53. package/src/sap/ui/base/Interface.js +1 -1
  54. package/src/sap/ui/base/ManagedObject.js +1 -1
  55. package/src/sap/ui/base/ManagedObjectMetadata.js +1 -1
  56. package/src/sap/ui/base/Metadata.js +1 -1
  57. package/src/sap/ui/base/Object.js +1 -1
  58. package/src/sap/ui/base/ObjectPool.js +1 -1
  59. package/src/sap/ui/core/.library +1 -1
  60. package/src/sap/ui/core/BusyIndicator.js +1 -1
  61. package/src/sap/ui/core/Component.js +1 -1
  62. package/src/sap/ui/core/ComponentContainer.js +1 -1
  63. package/src/sap/ui/core/ComponentMetadata.js +1 -1
  64. package/src/sap/ui/core/ComponentSupport.js +1 -1
  65. package/src/sap/ui/core/Configuration.js +12 -18
  66. package/src/sap/ui/core/Control.js +1 -1
  67. package/src/sap/ui/core/Core.js +4 -2
  68. package/src/sap/ui/core/CustomData.js +1 -1
  69. package/src/sap/ui/core/DeclarativeSupport.js +1 -1
  70. package/src/sap/ui/core/Element.js +1 -1
  71. package/src/sap/ui/core/ElementMetadata.js +1 -1
  72. package/src/sap/ui/core/EnabledPropagator.js +1 -1
  73. package/src/sap/ui/core/EventBus.js +1 -1
  74. package/src/sap/ui/core/Fragment.js +1 -1
  75. package/src/sap/ui/core/HTML.js +1 -1
  76. package/src/sap/ui/core/History.js +1 -1
  77. package/src/sap/ui/core/Icon.js +1 -1
  78. package/src/sap/ui/core/IconPool.js +1 -2
  79. package/src/sap/ui/core/IndicationColorSupport.js +1 -1
  80. package/src/sap/ui/core/IntervalTrigger.js +1 -1
  81. package/src/sap/ui/core/InvisibleMessage.js +1 -1
  82. package/src/sap/ui/core/InvisibleRenderer.js +1 -1
  83. package/src/sap/ui/core/InvisibleText.js +1 -1
  84. package/src/sap/ui/core/Item.js +1 -1
  85. package/src/sap/ui/core/LabelEnablement.js +1 -1
  86. package/src/sap/ui/core/LayoutData.js +1 -1
  87. package/src/sap/ui/core/ListItem.js +1 -1
  88. package/src/sap/ui/core/LocalBusyIndicator.js +1 -1
  89. package/src/sap/ui/core/Locale.js +1 -1
  90. package/src/sap/ui/core/LocaleData.js +1 -1
  91. package/src/sap/ui/core/Manifest.js +1 -1
  92. package/src/sap/ui/core/Message.js +1 -1
  93. package/src/sap/ui/core/RenderManager.js +1 -1
  94. package/src/sap/ui/core/Renderer.js +1 -1
  95. package/src/sap/ui/core/ResizeHandler.js +1 -1
  96. package/src/sap/ui/core/ScrollBar.js +1 -1
  97. package/src/sap/ui/core/SeparatorItem.js +1 -1
  98. package/src/sap/ui/core/Shortcut.js +11 -9
  99. package/src/sap/ui/core/Title.js +1 -1
  100. package/src/sap/ui/core/TooltipBase.js +1 -1
  101. package/src/sap/ui/core/UIArea.js +1 -1
  102. package/src/sap/ui/core/UIComponent.js +1 -1
  103. package/src/sap/ui/core/UIComponentMetadata.js +1 -1
  104. package/src/sap/ui/core/ValueStateSupport.js +1 -1
  105. package/src/sap/ui/core/VariantLayoutData.js +1 -1
  106. package/src/sap/ui/core/XMLComposite.js +1 -1
  107. package/src/sap/ui/core/XMLCompositeMetadata.js +1 -1
  108. package/src/sap/ui/core/_IconRegistry.js +83 -11
  109. package/src/sap/ui/core/date/UI5Date.js +1 -1
  110. package/src/sap/ui/core/delegate/ItemNavigation.js +1 -1
  111. package/src/sap/ui/core/delegate/ScrollEnablement.js +1 -1
  112. package/src/sap/ui/core/dnd/DragDropBase.js +1 -1
  113. package/src/sap/ui/core/dnd/DragDropInfo.js +1 -1
  114. package/src/sap/ui/core/dnd/DragInfo.js +1 -1
  115. package/src/sap/ui/core/dnd/DropInfo.js +1 -1
  116. package/src/sap/ui/core/format/DateFormat.js +4 -0
  117. package/src/sap/ui/core/format/TimezoneUtil.js +1 -1
  118. package/src/sap/ui/core/hyphenation/Hyphenation.js +1 -1
  119. package/src/sap/ui/core/library.js +3 -3
  120. package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
  121. package/src/sap/ui/core/message/Message.js +1 -1
  122. package/src/sap/ui/core/message/MessageManager.js +1 -1
  123. package/src/sap/ui/core/message/MessageParser.js +1 -1
  124. package/src/sap/ui/core/message/MessageProcessor.js +1 -1
  125. package/src/sap/ui/core/mvc/HTMLView.js +1 -1
  126. package/src/sap/ui/core/mvc/JSONView.js +1 -1
  127. package/src/sap/ui/core/mvc/JSView.js +1 -1
  128. package/src/sap/ui/core/mvc/TemplateView.js +1 -1
  129. package/src/sap/ui/core/mvc/View.js +1 -1
  130. package/src/sap/ui/core/mvc/XMLView.js +1 -1
  131. package/src/sap/ui/core/plugin/DeclarativeSupport.js +1 -1
  132. package/src/sap/ui/core/plugin/LessSupport.js +1 -1
  133. package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
  134. package/src/sap/ui/core/postmessage/Bus.js +1 -1
  135. package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
  136. package/src/sap/ui/core/search/OpenSearchProvider.js +1 -1
  137. package/src/sap/ui/core/search/SearchProvider.js +1 -1
  138. package/src/sap/ui/core/service/Service.js +1 -1
  139. package/src/sap/ui/core/service/ServiceFactory.js +1 -1
  140. package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
  141. package/src/sap/ui/core/support/Plugin.js +1 -1
  142. package/src/sap/ui/core/support/Support.js +1 -1
  143. package/src/sap/ui/core/support/plugins/ControlTree.js +1 -1
  144. package/src/sap/ui/core/support/plugins/Interaction.js +1 -1
  145. package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
  146. package/src/sap/ui/core/support/plugins/Performance.js +1 -1
  147. package/src/sap/ui/core/support/plugins/Selector.js +1 -1
  148. package/src/sap/ui/core/support/plugins/TechInfo.js +1 -1
  149. package/src/sap/ui/core/support/plugins/Trace.js +1 -1
  150. package/src/sap/ui/core/support/plugins/ViewInfo.js +1 -1
  151. package/src/sap/ui/core/themes/base/Icon.less +2 -2
  152. package/src/sap/ui/core/theming/ThemeHelper.js +103 -0
  153. package/src/sap/ui/core/theming/ThemeManager.js +2 -1
  154. package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
  155. package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
  156. package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
  157. package/src/sap/ui/core/tmpl/Template.js +1 -1
  158. package/src/sap/ui/core/tmpl/TemplateControl.js +1 -1
  159. package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
  160. package/src/sap/ui/core/util/Export.js +1 -1
  161. package/src/sap/ui/core/util/ExportCell.js +1 -1
  162. package/src/sap/ui/core/util/ExportColumn.js +1 -1
  163. package/src/sap/ui/core/util/ExportRow.js +1 -1
  164. package/src/sap/ui/core/util/ExportType.js +1 -1
  165. package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
  166. package/src/sap/ui/core/util/File.js +1 -1
  167. package/src/sap/ui/core/util/LibraryInfo.js +1 -1
  168. package/src/sap/ui/core/util/MockServer.js +1 -1
  169. package/src/sap/ui/core/util/PasteHelper.js +1 -1
  170. package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
  171. package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
  172. package/src/sap/ui/core/util/serializer/ViewSerializer.js +1 -1
  173. package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
  174. package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
  175. package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
  176. package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
  177. package/src/sap/ui/core/ws/ReadyState.js +1 -1
  178. package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
  179. package/src/sap/ui/core/ws/WebSocket.js +1 -1
  180. package/src/sap/ui/debug/ControlTree.js +1 -1
  181. package/src/sap/ui/debug/DebugEnv.js +1 -1
  182. package/src/sap/ui/debug/PropertyList.js +1 -1
  183. package/src/sap/ui/model/ClientModel.js +1 -1
  184. package/src/sap/ui/model/CompositeDataState.js +1 -1
  185. package/src/sap/ui/model/CompositeType.js +1 -1
  186. package/src/sap/ui/model/DataState.js +1 -1
  187. package/src/sap/ui/model/MetaModel.js +1 -1
  188. package/src/sap/ui/model/Model.js +1 -1
  189. package/src/sap/ui/model/SelectionModel.js +1 -1
  190. package/src/sap/ui/model/SimpleType.js +1 -1
  191. package/src/sap/ui/model/TreeAutoExpandMode.js +1 -1
  192. package/src/sap/ui/model/Type.js +1 -1
  193. package/src/sap/ui/model/json/JSONModel.js +1 -1
  194. package/src/sap/ui/model/message/MessageModel.js +1 -1
  195. package/src/sap/ui/model/odata/ODataAnnotations.js +1 -1
  196. package/src/sap/ui/model/odata/ODataMessageParser.js +1 -1
  197. package/src/sap/ui/model/odata/ODataMetaModel.js +1 -1
  198. package/src/sap/ui/model/odata/ODataMetadata.js +1 -1
  199. package/src/sap/ui/model/odata/ODataModel.js +1 -1
  200. package/src/sap/ui/model/odata/type/Boolean.js +1 -1
  201. package/src/sap/ui/model/odata/type/Byte.js +1 -1
  202. package/src/sap/ui/model/odata/type/Currency.js +1 -1
  203. package/src/sap/ui/model/odata/type/Date.js +1 -1
  204. package/src/sap/ui/model/odata/type/DateTime.js +1 -1
  205. package/src/sap/ui/model/odata/type/DateTimeBase.js +1 -1
  206. package/src/sap/ui/model/odata/type/DateTimeOffset.js +1 -1
  207. package/src/sap/ui/model/odata/type/DateTimeWithTimezone.js +1 -1
  208. package/src/sap/ui/model/odata/type/Decimal.js +1 -1
  209. package/src/sap/ui/model/odata/type/Double.js +1 -1
  210. package/src/sap/ui/model/odata/type/Guid.js +1 -1
  211. package/src/sap/ui/model/odata/type/Int.js +1 -1
  212. package/src/sap/ui/model/odata/type/Int16.js +1 -1
  213. package/src/sap/ui/model/odata/type/Int32.js +1 -1
  214. package/src/sap/ui/model/odata/type/Int64.js +1 -1
  215. package/src/sap/ui/model/odata/type/ODataType.js +1 -1
  216. package/src/sap/ui/model/odata/type/Raw.js +1 -1
  217. package/src/sap/ui/model/odata/type/SByte.js +1 -1
  218. package/src/sap/ui/model/odata/type/Single.js +1 -1
  219. package/src/sap/ui/model/odata/type/Stream.js +1 -1
  220. package/src/sap/ui/model/odata/type/String.js +1 -1
  221. package/src/sap/ui/model/odata/type/Time.js +1 -1
  222. package/src/sap/ui/model/odata/type/TimeOfDay.js +1 -1
  223. package/src/sap/ui/model/odata/type/Unit.js +1 -1
  224. package/src/sap/ui/model/odata/v2/Context.js +1 -1
  225. package/src/sap/ui/model/odata/v2/ODataAnnotations.js +1 -1
  226. package/src/sap/ui/model/odata/v2/ODataModel.js +1 -1
  227. package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +1 -1
  228. package/src/sap/ui/model/odata/v4/Context.js +3 -3
  229. package/src/sap/ui/model/odata/v4/ODataBinding.js +65 -38
  230. package/src/sap/ui/model/odata/v4/ODataContextBinding.js +5 -4
  231. package/src/sap/ui/model/odata/v4/ODataListBinding.js +7 -6
  232. package/src/sap/ui/model/odata/v4/ODataMetaModel.js +8 -9
  233. package/src/sap/ui/model/odata/v4/ODataModel.js +1 -1
  234. package/src/sap/ui/model/odata/v4/ODataParentBinding.js +58 -27
  235. package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +5 -5
  236. package/src/sap/ui/model/odata/v4/lib/_Cache.js +11 -7
  237. package/src/sap/ui/model/odata/v4/lib/_Helper.js +5 -1
  238. package/src/sap/ui/model/odata/v4/lib/_Requestor.js +1 -1
  239. package/src/sap/ui/model/odata/v4/lib/_V2MetadataConverter.js +4 -4
  240. package/src/sap/ui/model/odata/v4/lib/_V2Requestor.js +1 -1
  241. package/src/sap/ui/model/resource/ResourceModel.js +1 -1
  242. package/src/sap/ui/model/type/Boolean.js +1 -1
  243. package/src/sap/ui/model/type/Currency.js +1 -1
  244. package/src/sap/ui/model/type/Date.js +1 -1
  245. package/src/sap/ui/model/type/DateInterval.js +1 -1
  246. package/src/sap/ui/model/type/DateTime.js +1 -1
  247. package/src/sap/ui/model/type/DateTimeInterval.js +1 -1
  248. package/src/sap/ui/model/type/FileSize.js +1 -1
  249. package/src/sap/ui/model/type/Float.js +1 -1
  250. package/src/sap/ui/model/type/Integer.js +1 -1
  251. package/src/sap/ui/model/type/String.js +1 -1
  252. package/src/sap/ui/model/type/Time.js +1 -1
  253. package/src/sap/ui/model/type/TimeInterval.js +1 -1
  254. package/src/sap/ui/model/type/Unit.js +1 -1
  255. package/src/sap/ui/model/xml/XMLModel.js +1 -1
  256. package/src/sap/ui/qunit/utils/ControlIterator.js +1 -1
  257. package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +1 -1
  258. package/src/sap/ui/test/generic/TestBase.js +1 -1
  259. package/src/sap/ui/util/Mobile.js +10 -6
  260. package/src/sap/ui/util/Storage.js +1 -1
@@ -31,6 +31,7 @@ sap.ui.define([
31
31
  this.mAggregatedQueryOptions = {};
32
32
  // whether the aggregated query options are processed the first time
33
33
  this.bAggregatedQueryOptionsInitial = true;
34
+ this.mCanUseCachePromiseByChildPath = {};
34
35
  // auto-$expand/$select: promises to wait until child bindings have provided
35
36
  // their path and query options
36
37
  this.aChildCanUseCachePromises = [];
@@ -215,7 +216,7 @@ sap.ui.define([
215
216
  * @param {object} mQueryOptions - The query options to be merged
216
217
  * @param {string} sBaseMetaPath - This binding's meta path
217
218
  * @param {boolean} bCacheImmutable - Whether the cache of this binding is immutable
218
- * @param {boolean} bIsProperty - Whether the child is a property binding
219
+ * @param {boolean} [bIsProperty] - Whether the child is a property binding
219
220
  * @returns {boolean} Whether the query options can be fulfilled by this binding
220
221
  *
221
222
  * @private
@@ -229,14 +230,19 @@ sap.ui.define([
229
230
  /*
230
231
  * Recursively merges the given query options into the given aggregated query options.
231
232
  *
232
- * @param {object} mAggregatedQueryOptions The aggregated query options
233
- * @param {object} mQueryOptions0 The query options to merge into the aggregated query
234
- * options
235
- * @param {string} sMetaPath The meta path for the current $expand
236
- * @param {boolean} [bInsideExpand] Whether the given query options are inside a $expand
237
- * @param {boolean} [bAdd] Whether to add the given query options because they are in a
238
- * $expand that has not been aggregated yet
239
- * @returns {boolean} Whether the query options can be fulfilled by this binding
233
+ * @param {object} mAggregatedQueryOptions
234
+ * The aggregated query options
235
+ * @param {object} mQueryOptions0
236
+ * The query options to merge into the aggregated query options
237
+ * @param {string} [sMetaPath]
238
+ * The meta path for the current $expand (only used if cache is immutable)
239
+ * @param {boolean} [bInsideExpand]
240
+ * Whether the given query options are inside a $expand
241
+ * @param {boolean} [bAdd]
242
+ * Whether to add the given query options because they are in a $expand that has not been
243
+ * aggregated yet
244
+ * @returns {boolean}
245
+ * Whether the query options can be fulfilled by this binding
240
246
  */
241
247
  function merge(mAggregatedQueryOptions, mQueryOptions0, sMetaPath, bInsideExpand, bAdd) {
242
248
  /*
@@ -306,10 +312,13 @@ sap.ui.define([
306
312
  }
307
313
 
308
314
  if (merge(mAggregatedQueryOptionsClone, mQueryOptions, sBaseMetaPath)) {
309
- if (!bCacheImmutable) {
310
- this.mAggregatedQueryOptions = mAggregatedQueryOptionsClone;
311
- } else {
315
+ if (bCacheImmutable) {
312
316
  this.mLateQueryOptions = mAggregatedQueryOptionsClone;
317
+ } else {
318
+ this.mAggregatedQueryOptions = mAggregatedQueryOptionsClone;
319
+ if (this.mLateQueryOptions) {
320
+ merge(this.mLateQueryOptions, mQueryOptions);
321
+ }
313
322
  }
314
323
  return true;
315
324
  }
@@ -704,14 +713,14 @@ sap.ui.define([
704
713
  * @param {sap.ui.model.odata.v4.Context} oContext
705
714
  * A context of this binding which is the direct or indirect parent of the child binding.
706
715
  * Initially it is the child binding's parent context (See
707
- * {@link sap.ui.model.odata.v4.ODataBinding#fetchQueryOptionsForOwnCache}). When a binding
708
- * delegates up to its parent binding, it passes its own parent context adjusting
716
+ * {@link sap.ui.model.odata.v4.ODataBinding#fetchOrGetQueryOptionsForOwnCache}). When a
717
+ * binding delegates up to its parent binding, it passes its own parent context adjusting
709
718
  * <code>sChildPath</code> accordingly.
710
719
  * @param {string} sChildPath
711
720
  * The child binding's binding path relative to <code>oContext</code>
712
- * @param {object|sap.ui.base.SyncPromise} vChildQueryOptions
713
- * The child binding's (aggregated) query options or a promise resolving with them
714
- * @param {boolean} bIsProperty
721
+ * @param {object|sap.ui.base.SyncPromise} [vChildQueryOptions={}]
722
+ * The child binding's (aggregated) query options (if any) or a promise resolving with them
723
+ * @param {boolean} [bIsProperty]
715
724
  * Whether the child is a property binding
716
725
  * @returns {sap.ui.base.SyncPromise}
717
726
  * A promise resolved with the reduced path for the child binding if the child binding can use
@@ -726,7 +735,7 @@ sap.ui.define([
726
735
  // getBaseForPathReduction must be called early, because the (virtual) parent context may be
727
736
  // lost again when the path is needed
728
737
  var sBaseForPathReduction = this.getBaseForPathReduction(),
729
- sBaseMetaPath = _Helper.getMetaPath(oContext.getPath()),
738
+ sBaseMetaPath,
730
739
  bCacheImmutable,
731
740
  oCanUseCachePromise,
732
741
  // whether this binding is an operation or depends on one
@@ -781,6 +790,23 @@ sap.ui.define([
781
790
  return SyncPromise.resolve(sResolvedChildPath);
782
791
  }
783
792
 
793
+ oCanUseCachePromise = this.mCanUseCachePromiseByChildPath[sChildPath];
794
+ if (oCanUseCachePromise && bIsProperty) {
795
+ return oCanUseCachePromise.then(function (sOldReducedPath) {
796
+ if (!sOldReducedPath) {
797
+ return undefined;
798
+ }
799
+ // Note: sResolvedChildPath could be "/SalesOrderList('42')/SO_2_SOITEM/0/Note"
800
+ // w/ index (thus getMetaPath helps), but getStrippedMetaPath makes no difference
801
+ if (!sChildPath.includes("/")
802
+ || _Helper.getMetaPath(sOldReducedPath)
803
+ === _Helper.getMetaPath(sResolvedChildPath)) {
804
+ return sResolvedChildPath;
805
+ }
806
+ return oMetaModel.getReducedPath(sResolvedChildPath, sBaseForPathReduction);
807
+ });
808
+ }
809
+
784
810
  // Note: this.oCachePromise exists for all bindings except operation bindings; it might
785
811
  // become pending again
786
812
  bCacheImmutable = this.oCachePromise.isRejected()
@@ -788,16 +814,17 @@ sap.ui.define([
788
814
  || oContext.isKeepAlive() // kept-alive contexts have no index when not in aContexts
789
815
  || this.oCache === null
790
816
  || this.oCache && this.oCache.hasSentRequest();
817
+ sBaseMetaPath = _Helper.getMetaPath(oContext.getPath());
791
818
  aPromises = [
792
- this.doFetchQueryOptions(this.oContext),
819
+ this.doFetchOrGetQueryOptions(this.oContext),
793
820
  // After access to complete meta path of property, the metadata of all prefix paths
794
821
  // is loaded so that synchronous access in wrapChildQueryOptions via getObject is
795
- // possible
822
+ // possible - as well as #getReducedPath
796
823
  fetchPropertyAndType(),
797
824
  vChildQueryOptions
798
825
  ];
799
826
  oCanUseCachePromise = SyncPromise.all(aPromises).then(function (aResult) {
800
- var mChildQueryOptions = aResult[2],
827
+ var mChildQueryOptions = aResult[2] || {},
801
828
  mWrappedChildQueryOptions,
802
829
  mLocalQueryOptions = aResult[0],
803
830
  oProperty = aResult[1],
@@ -818,7 +845,7 @@ sap.ui.define([
818
845
  that.bHasPathReductionToParent = true;
819
846
  return that.oContext.getBinding().fetchIfChildCanUseCache(that.oContext,
820
847
  _Helper.getRelativePath(sResolvedChildPath, that.oContext.getPath()),
821
- vChildQueryOptions);
848
+ mChildQueryOptions, bIsProperty);
822
849
  }
823
850
 
824
851
  if (bDependsOnOperation || sReducedChildMetaPath === "$count"
@@ -867,8 +894,8 @@ sap.ui.define([
867
894
  if (that.oCache) {
868
895
  that.oCache.setLateQueryOptions(that.mLateQueryOptions);
869
896
  } else if (that.oCache === null) {
870
- return that.oContext.getBinding().fetchIfChildCanUseCache(that.oContext,
871
- that.sPath, SyncPromise.resolve(that.mLateQueryOptions))
897
+ return that.oContext.getBinding()
898
+ .fetchIfChildCanUseCache(that.oContext, that.sPath, that.mLateQueryOptions)
872
899
  .then(function (sPath) {
873
900
  return sPath && sReducedPath;
874
901
  });
@@ -876,6 +903,9 @@ sap.ui.define([
876
903
  }
877
904
  return sReducedPath;
878
905
  });
906
+ if (bIsProperty && !oContext.getPath().includes("($uid=")) {
907
+ this.mCanUseCachePromiseByChildPath[sChildPath] = oCanUseCachePromise;
908
+ }
879
909
  this.aChildCanUseCachePromises.push(oCanUseCachePromise);
880
910
  this.oCachePromise = SyncPromise.all([this.oCachePromise, oCanUseCachePromise])
881
911
  .then(function (aResult) {
@@ -901,6 +931,7 @@ sap.ui.define([
901
931
  that.oModel.reportError(that + ": Failed to enhance query options for "
902
932
  + "auto-$expand/$select for child " + sChildPath, sClassName, oError);
903
933
  });
934
+
904
935
  return oCanUseCachePromise;
905
936
  };
906
937
 
@@ -1024,7 +1055,7 @@ sap.ui.define([
1024
1055
  * @private
1025
1056
  */
1026
1057
  ODataParentBinding.prototype.getQueryOptionsForPath = function (sPath, oContext) {
1027
- if (Object.keys(this.mParameters).length) {
1058
+ if (!_Helper.isEmptyObject(this.mParameters)) {
1028
1059
  // binding has parameters -> all query options need to be defined at the binding
1029
1060
  return _Helper.getQueryOptionsForPath(this.getQueryOptionsFromParameters(), sPath);
1030
1061
  }
@@ -1053,8 +1084,8 @@ sap.ui.define([
1053
1084
  * @function
1054
1085
  * @name sap.ui.model.odata.v4.ODataParentBinding.getQueryOptionsFromParameters
1055
1086
  * @private
1056
- * @see sap.ui.model.odata.v4.ODataBinding#fetchQueryOptionsForOwnCache
1057
- * @see sap.ui.model.odata.v4.ODataBinding#doFetchQueryOptions
1087
+ * @see sap.ui.model.odata.v4.ODataBinding#fetchOrGetQueryOptionsForOwnCache
1088
+ * @see sap.ui.model.odata.v4.ODataBinding#doFetchOrGetQueryOptions
1058
1089
  */
1059
1090
 
1060
1091
  /**
@@ -42,7 +42,7 @@ sap.ui.define([
42
42
  * @mixes sap.ui.model.odata.v4.ODataBinding
43
43
  * @public
44
44
  * @since 1.37.0
45
- * @version 1.114.2
45
+ * @version 1.114.4
46
46
  * @borrows sap.ui.model.odata.v4.ODataBinding#getGroupId as #getGroupId
47
47
  * @borrows sap.ui.model.odata.v4.ODataBinding#getRootBinding as #getRootBinding
48
48
  * @borrows sap.ui.model.odata.v4.ODataBinding#getUpdateGroupId as #getUpdateGroupId
@@ -103,7 +103,7 @@ sap.ui.define([
103
103
  this.mQueryOptions = this.oModel.buildQueryOptions(_Helper.clone(mParameters),
104
104
  /*bSystemQueryOptionsAllowed*/sPath.endsWith("$count"));
105
105
  this.vValue = undefined;
106
- // BEWARE: #doFetchQueryOptions uses #isRoot which relies on this.oContext!
106
+ // BEWARE: #doFetchOrGetQueryOptions uses #isRoot which relies on this.oContext!
107
107
  this.fetchCache(oContext);
108
108
  oModel.bindingCreated(this);
109
109
  }
@@ -401,10 +401,10 @@ sap.ui.define([
401
401
 
402
402
  /**
403
403
  * @override
404
- * @see sap.ui.model.odata.v4.ODataBinding#doFetchQueryOptions
404
+ * @see sap.ui.model.odata.v4.ODataBinding#doFetchOrGetQueryOptions
405
405
  */
406
- ODataPropertyBinding.prototype.doFetchQueryOptions = function () {
407
- return this.isRoot() ? SyncPromise.resolve(this.mQueryOptions) : SyncPromise.resolve({});
406
+ ODataPropertyBinding.prototype.doFetchOrGetQueryOptions = function () {
407
+ return this.isRoot() ? this.mQueryOptions : undefined;
408
408
  };
409
409
 
410
410
  /**
@@ -10,10 +10,9 @@ sap.ui.define([
10
10
  "./_Helper",
11
11
  "./_Requestor",
12
12
  "sap/base/Log",
13
- "sap/base/util/isEmptyObject",
14
13
  "sap/ui/base/SyncPromise",
15
14
  "sap/ui/model/odata/ODataUtils"
16
- ], function (_GroupLock, _Helper, _Requestor, Log, isEmptyObject, SyncPromise, ODataUtils) {
15
+ ], function (_GroupLock, _Helper, _Requestor, Log, SyncPromise, ODataUtils) {
17
16
  "use strict";
18
17
  /*eslint max-nested-callbacks: 0 */
19
18
 
@@ -1038,7 +1037,7 @@ sap.ui.define([
1038
1037
  }
1039
1038
  }
1040
1039
 
1041
- if (!this.mLateQueryOptions) {
1040
+ if (!(this.mLateQueryOptions || this.mQueryOptions && this.mQueryOptions.$select)) {
1042
1041
  return false; // no autoExpandSelect
1043
1042
  }
1044
1043
 
@@ -1051,10 +1050,15 @@ sap.ui.define([
1051
1050
  aUpdateProperties = [sRequestedPropertyPath];
1052
1051
 
1053
1052
  sFullResourceMetaPath = _Helper.buildPath(this.sMetaPath, sResourceMetaPath);
1053
+ mQueryOptions = this.mLateQueryOptions
1054
+ || { // ensure that $select precedes $expand in the resulting query
1055
+ $select : this.mQueryOptions.$select,
1056
+ $expand : this.mQueryOptions.$expand
1057
+ };
1054
1058
  // sRequestedPropertyPath is also a metapath because the binding does not accept a path with
1055
1059
  // a collection-valued navigation property for a late property
1056
1060
  mQueryOptions = _Helper.intersectQueryOptions(
1057
- _Helper.getQueryOptionsForPath(this.mLateQueryOptions, sResourcePath),
1061
+ _Helper.getQueryOptionsForPath(mQueryOptions, sResourcePath),
1058
1062
  [sRequestedPropertyPath], this.oRequestor.getModelInterface().fetchMetadata,
1059
1063
  sFullResourceMetaPath);
1060
1064
  if (!mQueryOptions) {
@@ -1327,7 +1331,7 @@ sap.ui.define([
1327
1331
  /**
1328
1332
  * Returns this cache's query options.
1329
1333
  *
1330
- * @returns {object} The query options
1334
+ * @returns {object|undefined} The query options, if any
1331
1335
  *
1332
1336
  * @public
1333
1337
  * @see #setQueryOptions
@@ -1373,7 +1377,7 @@ sap.ui.define([
1373
1377
  * @see #registerChangeListener
1374
1378
  */
1375
1379
  _Cache.prototype.hasChangeListeners = function () {
1376
- return !isEmptyObject(this.mChangeListeners);
1380
+ return !_Helper.isEmptyObject(this.mChangeListeners);
1377
1381
  };
1378
1382
 
1379
1383
  /**
@@ -4071,7 +4075,7 @@ sap.ui.define([
4071
4075
  if (oData) {
4072
4076
  sHttpMethod = oData["X-HTTP-Method"] || sHttpMethod;
4073
4077
  delete oData["X-HTTP-Method"];
4074
- if (this.oRequestor.isActionBodyOptional() && !Object.keys(oData).length) {
4078
+ if (this.oRequestor.isActionBodyOptional() && _Helper.isEmptyObject(oData)) {
4075
4079
  oData = undefined;
4076
4080
  }
4077
4081
  }
@@ -1840,6 +1840,10 @@ sap.ui.define([
1840
1840
  && !mParameters.$$aggregation.hierarchyQualifier;
1841
1841
  },
1842
1842
 
1843
+ // Trampoline property to allow for mocking function module in unit tests.
1844
+ // @see sap.base.util.isEmptyObject
1845
+ isEmptyObject : isEmptyObject,
1846
+
1843
1847
  /**
1844
1848
  * Returns whether the given property is missing in vEntityOrCollection. This is the case if
1845
1849
  * there is no value for it. It is not missing if a parent has a <code>null</code> value. In
@@ -2726,7 +2730,7 @@ sap.ui.define([
2726
2730
  }
2727
2731
  }
2728
2732
  if (!oProperty || oProperty.$kind === "Property") {
2729
- if (Object.keys(mChildQueryOptions).length > 0) {
2733
+ if (!isEmptyObject(mChildQueryOptions)) {
2730
2734
  Log.error("Failed to enhance query options for auto-$expand/$select as the"
2731
2735
  + " child binding has query options, but its path '" + sChildMetaPath
2732
2736
  + "' points to a structural property",
@@ -486,7 +486,7 @@ sap.ui.define([
486
486
  _Requestor.prototype.checkForOpenRequests = function () {
487
487
  var that = this;
488
488
 
489
- if (Object.keys(this.mRunningChangeRequests).length // running change requests
489
+ if (!_Helper.isEmptyObject(this.mRunningChangeRequests) // running change requests
490
490
  || Object.keys(this.mBatchQueue).some(function (sGroupId) { // pending requests
491
491
  return that.mBatchQueue[sGroupId].some(function (vRequest) {
492
492
  return Array.isArray(vRequest) ? vRequest.length : true;
@@ -611,7 +611,7 @@ sap.ui.define([
611
611
  sClassName);
612
612
  }
613
613
  });
614
- if (aResult.length > 0) {
614
+ if (aResult.length) {
615
615
  oSemantics.type = {EnumMember : aResult.join(" ")};
616
616
  }
617
617
  }
@@ -690,19 +690,19 @@ sap.ui.define([
690
690
  sTarget = sEntityContainerName + "/" + sEntitySetName;
691
691
  mAnnotations = _Helper.merge(this.convertedV2Annotations[sTarget] || {},
692
692
  this.mEntityType2EntitySetAnnotation[oEntitySet.$Type]);
693
- if (Object.keys(mAnnotations).length) {
693
+ if (!_Helper.isEmptyObject(mAnnotations)) {
694
694
  this.convertedV2Annotations[sTarget] = mAnnotations;
695
695
  }
696
696
  }
697
697
  }
698
698
 
699
699
  if (this.bIgnoreAnnotations) {
700
- if (Object.keys(this.convertedV2Annotations).length) {
700
+ if (!_Helper.isEmptyObject(this.convertedV2Annotations)) {
701
701
  this.schema.$Annotations = {};
702
702
  }
703
703
  } else if (this.schema.$Annotations) {
704
704
  this.mergeAnnotations(this.convertedV2Annotations, this.schema.$Annotations);
705
- } else if (Object.keys(this.convertedV2Annotations).length > 0) {
705
+ } else if (!_Helper.isEmptyObject(this.convertedV2Annotations)) {
706
706
  this.schema.$Annotations = this.convertedV2Annotations;
707
707
  }
708
708
  this.convertedV2Annotations = {}; // reset schema annotations for next schema
@@ -763,7 +763,7 @@ sap.ui.define([
763
763
 
764
764
  // only if all (nested) query options are processed, all selects are known
765
765
  aSelects = Object.keys(mSelects);
766
- if (aSelects.length > 0) {
766
+ if (aSelects.length) {
767
767
  if (!mQueryOptions.$select) {
768
768
  aSelects.push("*");
769
769
  }
@@ -229,7 +229,7 @@ sap.ui.define([
229
229
  *
230
230
  * @extends sap.ui.model.Model
231
231
  * @public
232
- * @version 1.114.2
232
+ * @version 1.114.4
233
233
  */
234
234
  var ResourceModel = Model.extend("sap.ui.model.resource.ResourceModel", /** @lends sap.ui.model.resource.ResourceModel.prototype */ {
235
235
 
@@ -19,7 +19,7 @@ sap.ui.define(['sap/ui/model/SimpleType', 'sap/ui/model/FormatException', 'sap/u
19
19
  * @extends sap.ui.model.SimpleType
20
20
  *
21
21
  * @author SAP SE
22
- * @version 1.114.2
22
+ * @version 1.114.4
23
23
  *
24
24
  * @public
25
25
  * @param {object} [oFormatOptions]
@@ -32,7 +32,7 @@ sap.ui.define([
32
32
  * @extends sap.ui.model.CompositeType
33
33
  *
34
34
  * @author SAP SE
35
- * @version 1.114.2
35
+ * @version 1.114.4
36
36
  *
37
37
  * @public
38
38
  * @param {object} [oFormatOptions]
@@ -27,7 +27,7 @@ sap.ui.define([
27
27
  * @extends sap.ui.model.SimpleType
28
28
  *
29
29
  * @author SAP SE
30
- * @version 1.114.2
30
+ * @version 1.114.4
31
31
  *
32
32
  * @public
33
33
  * @param {object} [oFormatOptions] Formatting options. For a list of all available options, see {@link sap.ui.core.format.DateFormat.getDateInstance DateFormat}.
@@ -24,7 +24,7 @@ sap.ui.define([
24
24
  * @extends sap.ui.model.CompositeType
25
25
  *
26
26
  * @author SAP SE
27
- * @version 1.114.2
27
+ * @version 1.114.4
28
28
  *
29
29
  * @alias sap.ui.model.type.DateInterval
30
30
  * @param {object} [oFormatOptions]
@@ -19,7 +19,7 @@ sap.ui.define(['./Date', 'sap/ui/core/format/DateFormat'],
19
19
  * @extends sap.ui.model.type.Date
20
20
  *
21
21
  * @author SAP SE
22
- * @version 1.114.2
22
+ * @version 1.114.4
23
23
  *
24
24
  * @public
25
25
  * @param {object} [oFormatOptions] Formatting options. For a list of all available options, see {@link sap.ui.core.format.DateFormat.getDateTimeInstance DateFormat}.
@@ -19,7 +19,7 @@ sap.ui.define(['./DateInterval', 'sap/ui/core/format/DateFormat'],
19
19
  * @extends sap.ui.model.type.DateInterval
20
20
  *
21
21
  * @author SAP SE
22
- * @version 1.114.2
22
+ * @version 1.114.4
23
23
  *
24
24
  * @public
25
25
  * @param {object} [oFormatOptions] Formatting options. For a list of all available options, see {@link sap.ui.core.format.DateFormat.getDateTimeInstance DateFormat}.
@@ -24,7 +24,7 @@ sap.ui.define([
24
24
  * @extends sap.ui.model.SimpleType
25
25
  *
26
26
  * @author SAP SE
27
- * @version 1.114.2
27
+ * @version 1.114.4
28
28
  *
29
29
  * @public
30
30
  * @param {object} [oFormatOptions]
@@ -26,7 +26,7 @@ sap.ui.define([
26
26
  * @extends sap.ui.model.SimpleType
27
27
  *
28
28
  * @author SAP SE
29
- * @version 1.114.2
29
+ * @version 1.114.4
30
30
  *
31
31
  * @public
32
32
  * @param {object} [oFormatOptions]
@@ -26,7 +26,7 @@ sap.ui.define([
26
26
  * @extends sap.ui.model.SimpleType
27
27
  *
28
28
  * @author SAP SE
29
- * @version 1.114.2
29
+ * @version 1.114.4
30
30
  *
31
31
  * @public
32
32
  * @param {object} [oFormatOptions]
@@ -24,7 +24,7 @@ sap.ui.define([
24
24
  * @extends sap.ui.model.SimpleType
25
25
  *
26
26
  * @author SAP SE
27
- * @version 1.114.2
27
+ * @version 1.114.4
28
28
  *
29
29
  * @alias sap.ui.model.type.String
30
30
  * @param {object} [oFormatOptions]
@@ -19,7 +19,7 @@ sap.ui.define(['./Date', 'sap/ui/core/format/DateFormat'],
19
19
  * @extends sap.ui.model.type.Date
20
20
  *
21
21
  * @author SAP SE
22
- * @version 1.114.2
22
+ * @version 1.114.4
23
23
  *
24
24
  * @public
25
25
  * @param {object} [oFormatOptions] Formatting options. For a list of all available options, see {@link sap.ui.core.format.DateFormat.getTimeInstance DateFormat}.
@@ -19,7 +19,7 @@ sap.ui.define(['./DateInterval', 'sap/ui/core/format/DateFormat'],
19
19
  * @extends sap.ui.model.type.DateInterval
20
20
  *
21
21
  * @author SAP SE
22
- * @version 1.114.2
22
+ * @version 1.114.4
23
23
  *
24
24
  * @public
25
25
  * @param {object} [oFormatOptions] Formatting options. For a list of all available options, see {@link sap.ui.core.format.DateFormat.getTimeInstance DateFormat}.
@@ -48,7 +48,7 @@ sap.ui.define([
48
48
  *
49
49
  *
50
50
  * @author SAP SE
51
- * @version 1.114.2
51
+ * @version 1.114.4
52
52
  *
53
53
  * @public
54
54
  * @param {object} [oFormatOptions]
@@ -47,7 +47,7 @@ sap.ui.define([
47
47
  * @extends sap.ui.model.ClientModel
48
48
  *
49
49
  * @author SAP SE
50
- * @version 1.114.2
50
+ * @version 1.114.4
51
51
  *
52
52
  * @param {XMLDocument|string} oData
53
53
  * Either the URL where to load the XML from or an XML document
@@ -53,7 +53,7 @@ sap.ui.define(['sap/ui/core/Core', "sap/ui/VersionInfo"],
53
53
  * @namespace
54
54
  *
55
55
  * @author SAP SE
56
- * @version 1.114.2
56
+ * @version 1.114.4
57
57
  *
58
58
  * @public
59
59
  * @since 1.48.0
@@ -27,7 +27,7 @@ sap.ui.define([ 'sap/ui/core/Element', 'sap/ui/core/Control', 'sap/ui/core/Core'
27
27
  * @namespace
28
28
  *
29
29
  * @author SAP SE
30
- * @version 1.114.2
30
+ * @version 1.114.4
31
31
  *
32
32
  * @public
33
33
  * @since 1.48.0
@@ -26,7 +26,7 @@ sap.ui.define([
26
26
  * @extends sap.ui.base.Object
27
27
  * @abstract
28
28
  * @author SAP SE
29
- * @version 1.114.2
29
+ * @version 1.114.4
30
30
  * @since 1.100
31
31
  */
32
32
  return BaseObject.extend("sap.ui.test.generic.TestBase", {
@@ -105,6 +105,8 @@ sap.ui.define(['sap/ui/Device', 'sap/base/Log', 'sap/base/util/extend', 'sap/ui/
105
105
  mobileWebAppCapable: "default"
106
106
  }, options);
107
107
 
108
+ var bAppleMobileDevice = Device.os.ios || (Device.os.macintosh && Device.browser.mobile);
109
+
108
110
  // en-/disable automatic link generation for phone numbers
109
111
  if (options.preventPhoneNumberDetection) {
110
112
  // iOS specific meta tag
@@ -126,15 +128,17 @@ sap.ui.define(['sap/ui/Device', 'sap/base/Log', 'sap/base/util/extend', 'sap/ui/
126
128
  // UI) and auto zoom (browser zooms in the UI automatically under some circumtances, for example when an
127
129
  // input gets the focus and the font-size of the input is less than 16px on iOS) functionalities on the
128
130
  // mobile platform, but there's some difference between the mobile platforms:
129
- // * iOS: This does not disable manual zoom in Safari and it only disables the auto zoom function. In
130
- // Chrome browser on iOS, it does disable the manual zoom but since Chrome on iOS isn't in the support
131
- // matrix, we can ignore this.
131
+ // * Apple mobile device: This does not disable manual zoom in Safari and it only disables the auto
132
+ // zoom function. In Chrome browser on iOS, it does disable the manual zoom but since Chrome on iOS
133
+ // isn't in the support matrix, we can ignore this. The "Request Desktop Website" is turned on by
134
+ // default on iPad, therefore we need to check the (macintosh + touch) combination to detect the iPad
135
+ // with "Request Desktop Website" turned on to disable the auto zoom.
132
136
  // * other mobile platform: it does disable the manual zoom option but there's no auto zoom function.
133
- // So we need to remove the maximum-scale=1.0:
137
+ // So we need to remove the maximum-scale=1.0:
134
138
  //
135
139
  // Therefore we need to add the additional settings (maximum-scale and user-scalable) only for iOS
136
140
  // platform
137
- if (Device.os.ios) {
141
+ if (bAppleMobileDevice) {
138
142
  sMeta += ", maximum-scale=1.0, user-scalable=no";
139
143
  }
140
144
 
@@ -155,7 +159,7 @@ sap.ui.define(['sap/ui/Device', 'sap/base/Log', 'sap/base/util/extend', 'sap/ui/
155
159
  });
156
160
  }
157
161
 
158
- if (options.preventScroll && (Device.os.ios || (Device.os.mac && Device.browser.mobile))) {
162
+ if (options.preventScroll && bAppleMobileDevice) {
159
163
  _ready().then(function() {
160
164
  document.documentElement.style.position = "fixed";
161
165
  document.documentElement.style.overflow = "hidden";
@@ -277,7 +277,7 @@ sap.ui.define(["sap/base/assert"], function (assert) {
277
277
  *
278
278
  * @enum {string}
279
279
  * @public
280
- * @version 1.114.2
280
+ * @version 1.114.4
281
281
  */
282
282
  Storage.Type = {
283
283
  /**