@qooxdoo/framework 7.7.2 → 7.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/Manifest.json +2 -2
  2. package/lib/compiler/compile-info.json +91 -89
  3. package/lib/compiler/index.js +2517 -1488
  4. package/lib/resource/qx/tool/schema/compile-1-0-0.json +13 -0
  5. package/lib/resource/qx/tool/website/build/404.html +3 -25
  6. package/lib/resource/qx/tool/website/build/about.html +3 -25
  7. package/lib/resource/qx/tool/website/build/assets/common.js +20 -0
  8. package/lib/resource/qx/tool/website/build/diagnostics/dependson.html +3 -25
  9. package/lib/resource/qx/tool/website/build/diagnostics/requiredby.html +3 -22
  10. package/lib/resource/qx/tool/website/build/index.html +3 -25
  11. package/lib/resource/qx/tool/website/partials/footer.html +3 -21
  12. package/lib/resource/qx/tool/website/partials/head.html +0 -1
  13. package/package.json +2 -2
  14. package/source/class/qx/Bootstrap.js +6 -3
  15. package/source/class/qx/Promise.js +93 -6964
  16. package/source/class/qx/bom/Label.js +82 -2
  17. package/source/class/qx/bom/webfonts/WebFont.js +1 -0
  18. package/source/class/qx/core/Environment.js +83 -1
  19. package/source/class/qx/data/controller/List.js +50 -21
  20. package/source/class/qx/data/controller/MSelection.js +45 -12
  21. package/source/class/qx/data/marshal/Json.js +64 -11
  22. package/source/class/qx/dev/unit/AsyncWrapper.js +8 -0
  23. package/source/class/qx/event/Manager.js +163 -124
  24. package/source/class/qx/io/ImageLoader.js +6 -3
  25. package/source/class/qx/io/exception/Transport.js +1 -0
  26. package/source/class/qx/io/jsonrpc/Client.js +64 -8
  27. package/source/class/qx/io/jsonrpc/protocol/Request.js +10 -6
  28. package/source/class/qx/lang/Type.js +36 -3
  29. package/source/class/qx/promise/BluebirdImpl.js +6918 -0
  30. package/source/class/qx/promise/NativeWrapper.js +738 -0
  31. package/source/class/qx/test/Promise.js +1145 -22
  32. package/source/class/qx/test/bom/client/Pdfjs.js +4 -0
  33. package/source/class/qx/test/bom/element/AnimationJs.js +3 -0
  34. package/source/class/qx/test/bom/element/Style.js +1 -0
  35. package/source/class/qx/test/bom/media/MediaTestCase.js +6 -0
  36. package/source/class/qx/test/core/Environment.js +44 -0
  37. package/source/class/qx/test/data/controller/List.js +6 -0
  38. package/source/class/qx/test/data/marshal/Json.js +29 -0
  39. package/source/class/qx/test/io/MAssert.js +94 -0
  40. package/source/class/qx/test/io/TestMAssert.js +47 -0
  41. package/source/class/qx/test/io/jsonrpc/Client.js +79 -19
  42. package/source/class/qx/test/io/jsonrpc/PostMessageClient.js +152 -0
  43. package/source/class/qx/test/io/jsonrpc/Protocol.js +1 -5
  44. package/source/class/qx/test/io/request/Xhr.js +16 -0
  45. package/source/class/qx/test/lang/Type.js +151 -0
  46. package/source/class/qx/test/ui/embed/Iframe.js +1 -1
  47. package/source/class/qx/test/ui/form/TextArea.js +4 -0
  48. package/source/class/qx/test/util/DeferredCall.js +6 -0
  49. package/source/class/qx/test/util/Function.js +2 -2
  50. package/source/class/qx/theme/indigo/ColorDark.js +1 -1
  51. package/source/class/qx/tool/cli/api/Test.js +22 -0
  52. package/source/class/qx/tool/cli/commands/Compile.js +17 -4
  53. package/source/class/qx/tool/cli/commands/Test.js +7 -1
  54. package/source/class/qx/tool/compiler/Analyser.js +7 -0
  55. package/source/class/qx/tool/compiler/ClassFile.js +3 -2
  56. package/source/class/qx/tool/compiler/MetaExtraction.js +0 -5
  57. package/source/class/qx/tool/compiler/targets/meta/Browserify.js +8 -2
  58. package/source/class/qx/ui/basic/Image.js +72 -8
  59. package/source/class/qx/ui/basic/Label.js +4 -6
  60. package/source/class/qx/ui/control/DateChooser.js +4 -6
  61. package/source/class/qx/ui/core/Blocker.js +4 -6
  62. package/source/class/qx/ui/core/LayoutItem.js +4 -6
  63. package/source/class/qx/ui/core/MPlacement.js +23 -1
  64. package/source/class/qx/ui/core/Widget.js +7 -5
  65. package/source/class/qx/ui/form/AbstractField.js +4 -6
  66. package/source/class/qx/ui/form/MForm.js +4 -6
  67. package/source/class/qx/ui/form/Spinner.js +4 -6
  68. package/source/class/qx/ui/form/renderer/AbstractRenderer.js +4 -6
  69. package/source/class/qx/ui/menu/AbstractButton.js +7 -11
  70. package/source/class/qx/ui/mobile/basic/Label.js +4 -6
  71. package/source/class/qx/ui/mobile/form/Label.js +4 -6
  72. package/source/class/qx/ui/mobile/list/List.js +4 -6
  73. package/source/class/qx/ui/progressive/renderer/table/Row.js +35 -7
  74. package/source/class/qx/ui/progressive/renderer/table/cell/Boolean.js +4 -6
  75. package/source/class/qx/ui/table/Table.js +4 -6
  76. package/source/class/qx/ui/table/cellrenderer/Abstract.js +4 -6
  77. package/source/class/qx/ui/table/cellrenderer/Boolean.js +4 -6
  78. package/source/class/qx/ui/table/pane/Scroller.js +1 -1
  79. package/source/class/qx/ui/table/rowrenderer/Default.js +4 -6
  80. package/source/class/qx/util/ConcurrencyLimiter.js +78 -0
  81. package/source/resource/qx/tool/schema/compile-1-0-0.json +13 -0
  82. package/source/resource/qx/tool/website/build/404.html +3 -25
  83. package/source/resource/qx/tool/website/build/about.html +3 -25
  84. package/source/resource/qx/tool/website/build/assets/common.js +20 -0
  85. package/source/resource/qx/tool/website/build/diagnostics/dependson.html +3 -25
  86. package/source/resource/qx/tool/website/build/diagnostics/requiredby.html +3 -22
  87. package/source/resource/qx/tool/website/build/index.html +3 -25
  88. package/source/resource/qx/tool/website/partials/footer.html +3 -21
  89. package/source/resource/qx/tool/website/partials/head.html +0 -1
  90. package/lib/resource/qx/tool/website/build/assets/bluebird.min.js +0 -4615
  91. package/lib/resource/qx/tool/website/src/assets/bluebird.min.js +0 -4615
  92. package/source/resource/qx/tool/website/build/assets/bluebird.min.js +0 -4615
  93. package/source/resource/qx/tool/website/src/assets/bluebird.min.js +0 -4615
@@ -203,6 +203,9 @@ qx.Mixin.define("qx.ui.core.MPlacement", {
203
203
  __ptwLiveUpdater: null,
204
204
  __ptwLiveDisappearListener: null,
205
205
  __ptwLiveUpdateDisappearListener: null,
206
+ /**@type {Record<"top" | "right" | "bottom" | "left", number> | null}*/
207
+ __lastKnownCoords: null,
208
+ __lastKnownSize: null,
206
209
 
207
210
  /**
208
211
  * Returns the location data like {qx.bom.element.Location#get} does,
@@ -376,8 +379,23 @@ qx.Mixin.define("qx.ui.core.MPlacement", {
376
379
 
377
380
  var coords =
378
381
  target.getContentLocation() || this.getLayoutLocation(target);
382
+ var size = this.__getPlacementSize();
379
383
 
380
384
  if (coords != null) {
385
+
386
+ const boundsAreEqual = (bound1, bound2) => bound1 && bound2 &&
387
+ bound1.top === bound2.top &&
388
+ bound1.right === bound2.right &&
389
+ bound1.bottom === bound2.bottom &&
390
+ bound1.left === bound2.left;
391
+
392
+ if (boundsAreEqual(coords, this.__lastKnownCoords) &&
393
+ boundsAreEqual(size, this.__lastKnownSize)) {
394
+ return true;
395
+ }
396
+
397
+ this.__lastKnownCoords = coords;
398
+ this.__lastKnownSize = size;
381
399
  this._place(coords);
382
400
  return true;
383
401
  } else {
@@ -516,7 +534,7 @@ qx.Mixin.define("qx.ui.core.MPlacement", {
516
534
  * <code>_computePlacementSize</code>, which returns the size.
517
535
  *
518
536
  * @param callback {Function} This function will be called with the size as
519
- * first argument
537
+ * first argument. If it is null, the size is returned directly.
520
538
  */
521
539
  __getPlacementSize(callback) {
522
540
  var size = null;
@@ -527,6 +545,10 @@ qx.Mixin.define("qx.ui.core.MPlacement", {
527
545
  var size = this.getBounds();
528
546
  }
529
547
 
548
+ if (!callback) {
549
+ return {...size};
550
+ }
551
+
530
552
  if (size == null) {
531
553
  this.addListenerOnce("appear", () => {
532
554
  this.__getPlacementSize(callback);
@@ -2128,11 +2128,13 @@ qx.Class.define("qx.ui.core.Widget", {
2128
2128
  }, // property apply
2129
2129
  _applyVisibility(value, old) {
2130
2130
  var content = this.getContentElement();
2131
- if (value === "visible") {
2132
- content.show();
2133
- } else {
2134
- content.hide();
2135
- } // only force a layout update if visibility change from/to "exclude"
2131
+ if (content) {
2132
+ if (value === "visible") {
2133
+ content.show();
2134
+ } else {
2135
+ content.hide();
2136
+ } // only force a layout update if visibility change from/to "exclude"
2137
+ }
2136
2138
  var parent = this.$$parent;
2137
2139
  if (
2138
2140
  parent &&
@@ -144,7 +144,7 @@ qx.Class.define("qx.ui.form.AbstractField", {
144
144
 
145
145
  // translation support
146
146
  if (qx.core.Environment.get("qx.dynlocale")) {
147
- qx.locale.Manager.getInstance().addListener(
147
+ this.__changeLocaleAbstractFieldListenerId = qx.locale.Manager.getInstance().addListener(
148
148
  "changeLocale",
149
149
  this._onChangeLocale,
150
150
  this
@@ -1074,11 +1074,9 @@ qx.Class.define("qx.ui.form.AbstractField", {
1074
1074
 
1075
1075
  this._placeholder = this.__font = null;
1076
1076
 
1077
- if (qx.core.Environment.get("qx.dynlocale")) {
1078
- qx.locale.Manager.getInstance().removeListener(
1079
- "changeLocale",
1080
- this._onChangeLocale,
1081
- this
1077
+ if (qx.core.Environment.get("qx.dynlocale") && this.__changeLocaleAbstractFieldListenerId) {
1078
+ qx.locale.Manager.getInstance().removeListenerById(
1079
+ this.__changeLocaleAbstractFieldListenerId
1082
1080
  );
1083
1081
  }
1084
1082
 
@@ -22,7 +22,7 @@
22
22
  qx.Mixin.define("qx.ui.form.MForm", {
23
23
  construct() {
24
24
  if (qx.core.Environment.get("qx.dynlocale")) {
25
- qx.locale.Manager.getInstance().addListener(
25
+ this.__changeLocaleMFormListenerId = qx.locale.Manager.getInstance().addListener(
26
26
  "changeLocale",
27
27
  this.__onChangeLocale,
28
28
  this
@@ -103,11 +103,9 @@ qx.Mixin.define("qx.ui.form.MForm", {
103
103
  },
104
104
 
105
105
  destruct() {
106
- if (qx.core.Environment.get("qx.dynlocale")) {
107
- qx.locale.Manager.getInstance().removeListener(
108
- "changeLocale",
109
- this.__onChangeLocale,
110
- this
106
+ if (qx.core.Environment.get("qx.dynlocale") && this.__changeLocaleMFormListenerId) {
107
+ qx.locale.Manager.getInstance().removeListenerById(
108
+ this.__changeLocaleMFormListenerId
111
109
  );
112
110
  }
113
111
  }
@@ -87,7 +87,7 @@ qx.Class.define("qx.ui.form.Spinner", {
87
87
  this.addListener("roll", this._onRoll, this);
88
88
 
89
89
  if (qx.core.Environment.get("qx.dynlocale")) {
90
- qx.locale.Manager.getInstance().addListener(
90
+ this.__changeLocaleSpinnerListenerId = qx.locale.Manager.getInstance().addListener(
91
91
  "changeLocale",
92
92
  this._onChangeLocale,
93
93
  this
@@ -800,11 +800,9 @@ qx.Class.define("qx.ui.form.Spinner", {
800
800
  nf.removeListener("changeNumberFormat", this._onChangeNumberFormat, this);
801
801
  }
802
802
 
803
- if (qx.core.Environment.get("qx.dynlocale")) {
804
- qx.locale.Manager.getInstance().removeListener(
805
- "changeLocale",
806
- this._onChangeLocale,
807
- this
803
+ if (qx.core.Environment.get("qx.dynlocale") && this.__changeLocaleSpinnerListenerId) {
804
+ qx.locale.Manager.getInstance().removeListenerById(
805
+ this.__changeLocaleSpinnerListenerId
808
806
  );
809
807
  }
810
808
  }
@@ -38,7 +38,7 @@ qx.Class.define("qx.ui.form.renderer.AbstractRenderer", {
38
38
 
39
39
  // translation support
40
40
  if (qx.core.Environment.get("qx.dynlocale")) {
41
- qx.locale.Manager.getInstance().addListener(
41
+ this.__changeLocaleRendererListenerId = qx.locale.Manager.getInstance().addListener(
42
42
  "changeLocale",
43
43
  this._onChangeLocale,
44
44
  this
@@ -190,11 +190,9 @@ qx.Class.define("qx.ui.form.renderer.AbstractRenderer", {
190
190
  */
191
191
 
192
192
  destruct() {
193
- if (qx.core.Environment.get("qx.dynlocale")) {
194
- qx.locale.Manager.getInstance().removeListener(
195
- "changeLocale",
196
- this._onChangeLocale,
197
- this
193
+ if (qx.core.Environment.get("qx.dynlocale") && this.__changeLocaleRendererListenerId) {
194
+ qx.locale.Manager.getInstance().removeListenerById(
195
+ this.__changeLocaleRendererListenerId
198
196
  );
199
197
  }
200
198
  this._names = null;
@@ -265,17 +265,15 @@ qx.Class.define("qx.ui.menu.AbstractButton", {
265
265
  if (qx.core.Environment.get("qx.dynlocale")) {
266
266
  var oldCommand = e.getOldData();
267
267
  if (!oldCommand) {
268
- qx.locale.Manager.getInstance().addListener(
268
+ this.__changeLocaleCommandListenerId = qx.locale.Manager.getInstance().addListener(
269
269
  "changeLocale",
270
270
  this._onChangeLocale,
271
271
  this
272
272
  );
273
273
  }
274
- if (!command) {
275
- qx.locale.Manager.getInstance().removeListener(
276
- "changeLocale",
277
- this._onChangeLocale,
278
- this
274
+ if (!command && this.__changeLocaleCommandListenerId) {
275
+ qx.locale.Manager.getInstance().removeListenerById(
276
+ this.__changeLocaleCommandListenerId
279
277
  );
280
278
  }
281
279
  }
@@ -397,11 +395,9 @@ qx.Class.define("qx.ui.menu.AbstractButton", {
397
395
  }
398
396
  }
399
397
 
400
- if (qx.core.Environment.get("qx.dynlocale")) {
401
- qx.locale.Manager.getInstance().removeListener(
402
- "changeLocale",
403
- this._onChangeLocale,
404
- this
398
+ if (qx.core.Environment.get("qx.dynlocale") && this.__changeLocaleCommandListenerId) {
399
+ qx.locale.Manager.getInstance().removeListenerById(
400
+ this.__changeLocaleCommandListenerId
405
401
  );
406
402
  }
407
403
  }
@@ -51,7 +51,7 @@ qx.Class.define("qx.ui.mobile.basic.Label", {
51
51
  this.initWrap();
52
52
 
53
53
  if (qx.core.Environment.get("qx.dynlocale")) {
54
- qx.locale.Manager.getInstance().addListener(
54
+ this.__changeLocaleLabelListenerId = qx.locale.Manager.getInstance().addListener(
55
55
  "changeLocale",
56
56
  this._onChangeLocale,
57
57
  this
@@ -145,11 +145,9 @@ qx.Class.define("qx.ui.mobile.basic.Label", {
145
145
  */
146
146
 
147
147
  destruct() {
148
- if (qx.core.Environment.get("qx.dynlocale")) {
149
- qx.locale.Manager.getInstance().removeListener(
150
- "changeLocale",
151
- this._onChangeLocale,
152
- this
148
+ if (qx.core.Environment.get("qx.dynlocale") && this.__changeLocaleLabelListenerId) {
149
+ qx.locale.Manager.getInstance().removeListenerById(
150
+ this.__changeLocaleLabelListenerId
153
151
  );
154
152
  }
155
153
  }
@@ -71,7 +71,7 @@ qx.Class.define("qx.ui.mobile.form.Label", {
71
71
  this.initWrap();
72
72
 
73
73
  if (qx.core.Environment.get("qx.dynlocale")) {
74
- qx.locale.Manager.getInstance().addListener(
74
+ this.__changeLocaleLabelListenerId = qx.locale.Manager.getInstance().addListener(
75
75
  "changeLocale",
76
76
  this._onChangeLocale,
77
77
  this
@@ -242,11 +242,9 @@ qx.Class.define("qx.ui.mobile.form.Label", {
242
242
 
243
243
  this.__forWidget = null;
244
244
  }
245
- if (qx.core.Environment.get("qx.dynlocale")) {
246
- qx.locale.Manager.getInstance().removeListener(
247
- "changeLocale",
248
- this._onChangeLocale,
249
- this
245
+ if (qx.core.Environment.get("qx.dynlocale") && this.__changeLocaleLabelListenerId) {
246
+ qx.locale.Manager.getInstance().removeListenerById(
247
+ this.__changeLocaleLabelListenerId
250
248
  );
251
249
  }
252
250
  }
@@ -89,7 +89,7 @@ qx.Class.define("qx.ui.mobile.list.List", {
89
89
  }
90
90
 
91
91
  if (qx.core.Environment.get("qx.dynlocale")) {
92
- qx.locale.Manager.getInstance().addListener(
92
+ this.__changeLocaleListListenerId = qx.locale.Manager.getInstance().addListener(
93
93
  "changeLocale",
94
94
  this._onChangeLocale,
95
95
  this
@@ -615,11 +615,9 @@ qx.Class.define("qx.ui.mobile.list.List", {
615
615
  destruct() {
616
616
  this.__trackElement = null;
617
617
  this._disposeObjects("__provider");
618
- if (qx.core.Environment.get("qx.dynlocale")) {
619
- qx.locale.Manager.getInstance().removeListener(
620
- "changeLocale",
621
- this._onChangeLocale,
622
- this
618
+ if (qx.core.Environment.get("qx.dynlocale") && this.__changeLocaleListListenerId) {
619
+ qx.locale.Manager.getInstance().removeListenerById(
620
+ this.__changeLocaleListListenerId
623
621
  );
624
622
  }
625
623
  }
@@ -107,6 +107,14 @@ qx.Class.define("qx.ui.progressive.renderer.table.Row", {
107
107
  /** The default height of a row, if not altered by a cell renderer. */
108
108
  defaultRowHeight: {
109
109
  init: 16
110
+ },
111
+
112
+ /**
113
+ * Use a table-specific alternating row color instead of
114
+ * row-renderer-instance-specific
115
+ */
116
+ alternateBgColorsTableGlobal: {
117
+ init: false
110
118
  }
111
119
  },
112
120
 
@@ -157,6 +165,9 @@ qx.Class.define("qx.ui.progressive.renderer.table.Row", {
157
165
  }
158
166
 
159
167
  var hash = progressive.toHashCode();
168
+ this.__hash = hash;
169
+
170
+
160
171
  if (!tr.__clazz[hash]) {
161
172
  // ... then do it now.
162
173
  tr.__clazz[hash] = {
@@ -184,9 +195,6 @@ qx.Class.define("qx.ui.progressive.renderer.table.Row", {
184
195
  qx.bom.Stylesheet.createElement(stylesheet);
185
196
  }
186
197
 
187
- // Save the hash too
188
- this.__hash = hash;
189
-
190
198
  // Arrange to be called when the window appears or is resized, so we
191
199
  // can set each style sheet's left and width field appropriately.
192
200
  var pane = progressive.getStructure().getPane();
@@ -316,13 +324,19 @@ qx.Class.define("qx.ui.progressive.renderer.table.Row", {
316
324
  switch (element.location) {
317
325
  case "end":
318
326
  // Determine color of row based on state of last added row
319
- var index = rendererData.end || 0;
327
+ var index;
328
+ if (this.getAlternateBgColorsTableGlobal()) {
329
+ index = state.getUserData().tableRowBgEnd || 0;
330
+ } else {
331
+ index = rendererData.end;
332
+ }
320
333
 
321
334
  // Set the background color of this row
322
335
  div.style.backgroundColor = this.__colors.bgcol[index];
323
336
 
324
337
  // Update state for next time
325
338
  rendererData.end = index == 0 ? 1 : 0;
339
+ state.getUserData().tableRowBgEnd = rendererData.end;
326
340
 
327
341
  // Append our new row to the pane.
328
342
  state.getPane().getContentElement().getDomElement().appendChild(div);
@@ -338,19 +352,33 @@ qx.Class.define("qx.ui.progressive.renderer.table.Row", {
338
352
  // Are there any children?
339
353
  if (children.length > 0) {
340
354
  // Yup. Determine color of row based on state of last added row
341
- var index = rendererData.start;
355
+ var index;
356
+ if (this.getAlternateBgColorsTableGlobal()) {
357
+ index = state.getUserData().tableRowBgStart == 0 ? 1 : 0; // == 0 includes undefined
358
+ } else {
359
+ index = rendererData.start == 0 ? 1 : 0;
360
+ }
342
361
 
343
362
  // Set the background color of this row
344
363
  div.style.backgroundColor = this.__colors.bgcol[index];
345
364
 
346
365
  // Update state for next time
347
- rendererData.start = index == 0 ? 1 : 0;
366
+ rendererData.start = index;
367
+ state.getUserData().tableRowBgStart = rendererData.start;
348
368
 
349
369
  // Insert our new row before the first child.
350
370
  elem.insertBefore(div, children[0]);
351
371
  break;
352
372
  } else {
353
- /* No children yet. We can append our new row. */
373
+ // No children yet.
374
+
375
+ // Set the background color of this row
376
+ div.style.backgroundColor = this.__colors.bgcol[0];
377
+
378
+ // Update state for next time
379
+ rendererData.start = 0;
380
+ state.getUserData().tableRowBgStart = rendererData.start;
381
+
354
382
  elem.appendChild(div);
355
383
  }
356
384
  break;
@@ -32,7 +32,7 @@ qx.Class.define("qx.ui.progressive.renderer.table.cell.Boolean", {
32
32
 
33
33
  // dynamic theme switch
34
34
  if (qx.core.Environment.get("qx.dyntheme")) {
35
- qx.theme.manager.Meta.getInstance().addListener(
35
+ this.__changeThemeBooleanCellListenerId = qx.theme.manager.Meta.getInstance().addListener(
36
36
  "changeTheme",
37
37
  this._resolveImages,
38
38
  this
@@ -177,11 +177,9 @@ qx.Class.define("qx.ui.progressive.renderer.table.cell.Boolean", {
177
177
  this._iconUrlTrue = this._iconUrlFalse = null;
178
178
 
179
179
  // remove dynamic theme listener
180
- if (qx.core.Environment.get("qx.dyntheme")) {
181
- qx.theme.manager.Meta.getInstance().removeListener(
182
- "changeTheme",
183
- this._resolveImages,
184
- this
180
+ if (qx.core.Environment.get("qx.dyntheme") && this.__changeThemeBooleanCellListenerId) {
181
+ qx.theme.manager.Meta.getInstance().removeListenerById(
182
+ this.__changeThemeBooleanCellListenerId
185
183
  );
186
184
  }
187
185
  }
@@ -205,7 +205,7 @@ qx.Class.define("qx.ui.table.Table", {
205
205
 
206
206
  // add an event listener which updates the table content on locale change
207
207
  if (qx.core.Environment.get("qx.dynlocale")) {
208
- qx.locale.Manager.getInstance().addListener(
208
+ this.__changeLocaleTableListenerId = qx.locale.Manager.getInstance().addListener(
209
209
  "changeLocale",
210
210
  this._onChangeLocale,
211
211
  this
@@ -2164,11 +2164,9 @@ qx.Class.define("qx.ui.table.Table", {
2164
2164
 
2165
2165
  destruct() {
2166
2166
  // remove the event listener which handled the locale change
2167
- if (qx.core.Environment.get("qx.dynlocale")) {
2168
- qx.locale.Manager.getInstance().removeListener(
2169
- "changeLocale",
2170
- this._onChangeLocale,
2171
- this
2167
+ if (qx.core.Environment.get("qx.dynlocale") && this.__changeLocaleTableListenerId) {
2168
+ qx.locale.Manager.getInstance().removeListenerById(
2169
+ this.__changeLocaleTableListenerId
2172
2170
  );
2173
2171
  }
2174
2172
 
@@ -38,7 +38,7 @@ qx.Class.define("qx.ui.table.cellrenderer.Abstract", {
38
38
 
39
39
  // add dynamic theme listener
40
40
  if (qx.core.Environment.get("qx.dyntheme")) {
41
- qx.theme.manager.Meta.getInstance().addListener(
41
+ this.__changeThemeCellRendererListenerId = qx.theme.manager.Meta.getInstance().addListener(
42
42
  "changeTheme",
43
43
  this._onChangeTheme,
44
44
  this
@@ -242,11 +242,9 @@ qx.Class.define("qx.ui.table.cellrenderer.Abstract", {
242
242
 
243
243
  destruct() {
244
244
  // remove dynamic theme listener
245
- if (qx.core.Environment.get("qx.dyntheme")) {
246
- qx.theme.manager.Meta.getInstance().removeListener(
247
- "changeTheme",
248
- this._onChangeTheme,
249
- this
245
+ if (qx.core.Environment.get("qx.dyntheme") && this.__changeThemeCellRendererListenerId) {
246
+ qx.theme.manager.Meta.getInstance().removeListenerById(
247
+ this.__changeThemeCellRendererListenerId
250
248
  );
251
249
  }
252
250
  }
@@ -39,7 +39,7 @@ qx.Class.define("qx.ui.table.cellrenderer.Boolean", {
39
39
 
40
40
  // dynamic theme switch
41
41
  if (qx.core.Environment.get("qx.dyntheme")) {
42
- qx.theme.manager.Meta.getInstance().addListener(
42
+ this.__changeThemeBoolCellRendererListenerId = qx.theme.manager.Meta.getInstance().addListener(
43
43
  "changeTheme",
44
44
  this._onChangeTheme,
45
45
  this
@@ -172,11 +172,9 @@ qx.Class.define("qx.ui.table.cellrenderer.Boolean", {
172
172
  destruct() {
173
173
  this.__aliasManager = null;
174
174
  // remove dynamic theme listener
175
- if (qx.core.Environment.get("qx.dyntheme")) {
176
- qx.theme.manager.Meta.getInstance().removeListener(
177
- "changeTheme",
178
- this._onChangeTheme,
179
- this
175
+ if (qx.core.Environment.get("qx.dyntheme") && this.__changeThemeBoolCellRendererListenerId) {
176
+ qx.theme.manager.Meta.getInstance().removeListenerById(
177
+ this.__changeThemeBoolCellRendererListenerId
180
178
  );
181
179
  }
182
180
  }
@@ -1975,7 +1975,7 @@ qx.Class.define("qx.ui.table.pane.Scroller", {
1975
1975
  qx.event.Timer.once(function() {
1976
1976
  this._cellEditor.addListenerOnce('blur', this._onBlurCellEditorStopEditing, this);
1977
1977
  this.debug('added BLUR listener to hash: ' + this._cellEditor.$$hash);
1978
- }, this, 0);
1978
+ }, this, 1);
1979
1979
  },
1980
1980
 
1981
1981
  /**
@@ -38,7 +38,7 @@ qx.Class.define("qx.ui.table.rowrenderer.Default", {
38
38
 
39
39
  // dynamic theme switch
40
40
  if (qx.core.Environment.get("qx.dyntheme")) {
41
- qx.theme.manager.Meta.getInstance().addListener(
41
+ this.__changeThemeRowRendererListenerId = qx.theme.manager.Meta.getInstance().addListener(
42
42
  "changeTheme",
43
43
  this.initThemeValues,
44
44
  this
@@ -254,11 +254,9 @@ qx.Class.define("qx.ui.table.rowrenderer.Default", {
254
254
  this._colors = this._fontStyle = this._fontStyleString = null;
255
255
 
256
256
  // remove dynamic theme listener
257
- if (qx.core.Environment.get("qx.dyntheme")) {
258
- qx.theme.manager.Meta.getInstance().removeListener(
259
- "changeTheme",
260
- this.initThemeValues,
261
- this
257
+ if (qx.core.Environment.get("qx.dyntheme") && this.__changeThemeRowRendererListenerId) {
258
+ qx.theme.manager.Meta.getInstance().removeListenerById(
259
+ this.__changeThemeRowRendererListenerId
262
260
  );
263
261
  }
264
262
  }
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Utility class to limit the number of concurrent executions of async functions.
3
+ *
4
+ * @typedef {Object} TaskEntry
5
+ * @template T
6
+ * @property {() => Promise<T>} task The function to execute.
7
+ * @property {(value: T) => void} resolve The function to call when the task resolves.
8
+ * @property {(reason: any) => void} reject The function to call when the task rejects.
9
+ */
10
+ qx.Class.define("qx.util.ConcurrencyLimiter", {
11
+ extend: qx.core.Object,
12
+
13
+ /**
14
+ * @param {Number?Infinity} limit The maximum number of concurrent executions. If Infinity, no limit is applied.
15
+ */
16
+ construct(limit = Infinity) {
17
+ super();
18
+ this.__limit = limit;
19
+
20
+ this.__queue = [];
21
+ this.__running = 0;
22
+ },
23
+
24
+ members: {
25
+ /**
26
+ * @type {TaskEntry<*>[]}
27
+ * The tasks that are waiting to be executed
28
+ */
29
+ __queue: null,
30
+
31
+ /**
32
+ * Number of currently running tasks.
33
+ */
34
+ __running: null,
35
+
36
+ /**
37
+ * Queues a function to be executed.
38
+ * If the limit is reached, the function will be put on hold until a slot is available.
39
+ *
40
+ * @template T
41
+ * @param {() => Promise<T>} task The function to execute.
42
+ * @returns {Promise<T>} The promise that will be resolved when the function is executed.
43
+ * If the function rejects, the promise will also reject.
44
+ */
45
+ add(task) {
46
+ return new Promise((resolve, reject) => {
47
+ this.__queue.push({ task, resolve, reject });
48
+ this.__checkQueue();
49
+ });
50
+ },
51
+
52
+ /**
53
+ * Checks the queue to see if anything can be executed,
54
+ * and executes the next item in the queue if the limit is not reached.
55
+ * Once the item has finished executing, it will check the queue again.
56
+ */
57
+ __checkQueue() {
58
+ if (this.__running == this.__limit) {
59
+ return;
60
+ }
61
+
62
+ let next = this.__queue.shift();
63
+ if (!next) {
64
+ return;
65
+ }
66
+
67
+ let { task, resolve, reject } = next;
68
+
69
+ this.__running++;
70
+ task()
71
+ .then(resolve, reject)
72
+ .finally(() => {
73
+ this.__running--;
74
+ this.__checkQueue();
75
+ });
76
+ }
77
+ }
78
+ });
@@ -318,6 +318,10 @@
318
318
  "type": "object",
319
319
  "description": "Options given to @babel/preset-env. With this options the output type of babel can be defined. For details see here: <https://babeljs.io/docs/en/babel-preset-env#options>. They can be overridden per target."
320
320
  },
321
+ "browserifyOptions": {
322
+ "type": "object",
323
+ "description": "Options given to browserify. For details see here: <https://github.com/browserify/browserify#usage>. They can be overridden per target."
324
+ },
321
325
  "parts": {
322
326
  "$ref": "#/properties/parts"
323
327
  }
@@ -458,6 +462,15 @@
458
462
  "description": "** DEPRECATED - See babel.options instead",
459
463
  "deprecated": true
460
464
  },
465
+ "browserify": {
466
+ "type": "object",
467
+ "properties": {
468
+ "options": {
469
+ "type": "object",
470
+ "description": "Options given to browserify. For details see here: <https://github.com/browserify/browserify#usage>. They can be overridden per target."
471
+ }
472
+ }
473
+ },
461
474
  "jsx": {
462
475
  "type": "object",
463
476
  "description": "Options given to @babel/preset-react to change how JSX HTML is transpiled"
@@ -18,7 +18,6 @@
18
18
  <title>Qooxdoo Application Server</title>
19
19
  <meta name="description" content="">
20
20
  <link rel="stylesheet" type="text/css" href="/qooxdoo.css">
21
- <script type="text/javascript" src="/assets/bluebird.min.js"></script>
22
21
  <script type="text/javascript" src="/assets/jquery.js"></script>
23
22
  <script type="text/javascript" src="/scripts/serve.js"></script>
24
23
  </head>
@@ -201,11 +200,11 @@
201
200
  </div>
202
201
  <div class="container text-center d-none d-sm-block p-4">
203
202
  <img class="img p-4" src="/assets/qx-white.svg">
204
- <span class="text-light">&copy; 2005-2018 Qooxdoo Contributors</span>
203
+ <span class="text-light">&copy; 2005-<span class="current-year"></span> Qooxdoo Contributors</span>
205
204
  </div>
206
205
  <div class="container text-center d-block d-sm-none p-4">
207
206
  <img class="img-fluid p-4" src="/assets/qx-white.svg">
208
- <p>&copy; 2005-2017 Qooxdoo Contributors</p>
207
+ <p>&copy; 2005-<span class="current-year"></span> Qooxdoo Contributors</p>
209
208
  </div>
210
209
  </div>
211
210
 
@@ -213,28 +212,7 @@
213
212
  <!-- jQuery first, then Popper.js, then Bootstrap JS -->
214
213
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
215
214
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/js/bootstrap.min.js" integrity="sha384-a5N7Y/aK3qNeh15eJKGWxsqtnX/wWdSZSKp+81YjTmS15nvnvxKHuzaWwXHDli+4" crossorigin="anonymous"></script>
216
- <script type="text/javascript">
217
- $(function () {
218
- $('[data-toggle="tooltip"]').tooltip()
219
- })
220
- var scroll = (function (event) {
221
- var scroll = $(window).scrollTop();
222
- if (scroll < 250) {
223
- $(navigatopnBar).css('background-color', 'transparent');
224
- $(navigationLogo).css('width', '0');
225
- $(navigationLogo).addClass('invisible');
226
- } else {
227
- $(navigatopnBar).css('background-color', 'rgba(0, 40, 56, 0.9)');
228
- $(navigationLogo).css('width', '');
229
- $(navigationLogo).removeClass('invisible');
230
- }
231
- });
232
- $(window).scroll(scroll);
233
- scroll();
234
- </script>
235
-
236
-
237
-
215
+ <script src="/assets/common.js" type="text/javascript"></script>
238
216
  </body>
239
217
 
240
218
  </html>