@qooxdoo/framework 7.2.1 → 7.3.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 (48) hide show
  1. package/Manifest.json +1 -1
  2. package/lib/compiler/compile-info.json +55 -55
  3. package/lib/compiler/index.js +718 -474
  4. package/lib/resource/qx/tool/schema/compile-1-0-0.json +4 -0
  5. package/npm-shrinkwrap.json +23 -23
  6. package/package.json +3 -2
  7. package/source/class/qx/bom/webfonts/Manager.js +16 -8
  8. package/source/class/qx/core/MEvent.js +91 -22
  9. package/source/class/qx/core/MObjectId.js +8 -0
  10. package/source/class/qx/core/MProperty.js +45 -5
  11. package/source/class/qx/core/Object.js +5 -1
  12. package/source/class/qx/data/MBinding.js +6 -4
  13. package/source/class/qx/data/controller/CheckedList.js +2 -2
  14. package/source/class/qx/test/Interface.js +12 -10
  15. package/source/class/qx/test/core/Property.js +104 -0
  16. package/source/class/qx/theme/simple/Appearance.js +35 -0
  17. package/source/class/qx/theme/simple/Decoration.js +16 -0
  18. package/source/class/qx/theme/tangible/Appearance.js +9 -9
  19. package/source/class/qx/tool/cli/Cli.js +4 -0
  20. package/source/class/qx/tool/cli/Watch.js +3 -0
  21. package/source/class/qx/tool/cli/commands/Compile.js +5 -3
  22. package/source/class/qx/tool/cli/commands/Es6ify.js +51 -0
  23. package/source/class/qx/tool/compiler/Analyser.js +62 -13
  24. package/source/class/qx/tool/compiler/ClassFile.js +30 -48
  25. package/source/class/qx/tool/compiler/Console.js +2 -0
  26. package/source/class/qx/tool/compiler/Es6ify.js +1 -0
  27. package/source/class/qx/tool/compiler/targets/Target.js +7 -3
  28. package/source/class/qx/tool/compiler/targets/meta/Browserify.js +21 -14
  29. package/source/class/qx/tool/compiler/targets/meta/Uglify.js +2 -0
  30. package/source/class/qx/tool/config/Abstract.js +4 -0
  31. package/source/class/qx/ui/basic/Image.js +1 -1
  32. package/source/class/qx/ui/basic/Label.js +2 -3
  33. package/source/class/qx/ui/container/Composite.js +0 -11
  34. package/source/class/qx/ui/control/DateChooser.js +39 -0
  35. package/source/class/qx/ui/core/MChildrenHandling.js +4 -0
  36. package/source/class/qx/ui/core/MLayoutHandling.js +4 -0
  37. package/source/class/qx/ui/core/MRemoteLayoutHandling.js +11 -2
  38. package/source/class/qx/ui/form/FileSelectorButton.js +30 -18
  39. package/source/class/qx/ui/form/MForm.js +3 -2
  40. package/source/class/qx/ui/form/Slider.js +13 -13
  41. package/source/class/qx/ui/form/validation/Manager.js +29 -4
  42. package/source/class/qx/ui/layout/Canvas.js +4 -1
  43. package/source/class/qx/ui/tabview/Page.js +9 -0
  44. package/source/class/qx/ui/tabview/ScrollingPage.js +54 -0
  45. package/source/class/qx/ui/toolbar/FileSelectorButton.js +6 -4
  46. package/source/class/qx/ui/toolbar/ToolBar.js +6 -2
  47. package/source/resource/qx/tool/schema/compile-1-0-0.json +4 -0
  48. package/source/translation/ru.po +2 -2
@@ -224,6 +224,10 @@
224
224
  "description": "The folder where the deploy outputs to.",
225
225
  "type": "string"
226
226
  },
227
+ "proxySourcePath": {
228
+ "description": "The folder containing proxy classes (normally machine generated) to take precedence over those found in normal library sources",
229
+ "type": "string"
230
+ },
227
231
  "targetClass": {
228
232
  "description": "If you want to use more than the two default target types and/or use custom target classes, you can use the targetClass key to supply the name of the class as a string.",
229
233
  "type": "string"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qooxdoo/framework",
3
- "version": "7.1.1",
3
+ "version": "7.2.1",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
@@ -1664,9 +1664,9 @@
1664
1664
  }
1665
1665
  },
1666
1666
  "@xmldom/xmldom": {
1667
- "version": "0.7.5",
1668
- "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.5.tgz",
1669
- "integrity": "sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A=="
1667
+ "version": "0.8.3",
1668
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.3.tgz",
1669
+ "integrity": "sha512-Lv2vySXypg4nfa51LY1nU8yDAGo/5YwF+EY/rUZgIbfvwVARcd67ttCM8SMsTeJy51YhHYavEq+FS6R0hW9PFQ=="
1670
1670
  },
1671
1671
  "JSONStream": {
1672
1672
  "version": "1.3.5",
@@ -2566,7 +2566,7 @@
2566
2566
  "chainsaw": {
2567
2567
  "version": "0.0.9",
2568
2568
  "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.0.9.tgz",
2569
- "integrity": "sha1-EaBRAtHEx4W20EFdM21aOhYSkT4=",
2569
+ "integrity": "sha512-nG8PYH+/4xB+8zkV4G844EtfvZ5tTiLFoX3dZ4nhF4t3OCKIb9UvaFyNmeZO2zOSmRWzBoTD+napN6hiL+EgcA==",
2570
2570
  "requires": {
2571
2571
  "traverse": ">=0.3.0 <0.4"
2572
2572
  }
@@ -2616,11 +2616,11 @@
2616
2616
  }
2617
2617
  },
2618
2618
  "cldr": {
2619
- "version": "7.1.1",
2620
- "resolved": "https://registry.npmjs.org/cldr/-/cldr-7.1.1.tgz",
2621
- "integrity": "sha512-zHHQLSZT9i/g7wAxGrMj1BRD7JYOSJHvPIT06EFkFEl4m9ItW48i9yWqgRgWESJ5oUqLs9IuMDoKf+21Lscqrg==",
2619
+ "version": "7.2.0",
2620
+ "resolved": "https://registry.npmjs.org/cldr/-/cldr-7.2.0.tgz",
2621
+ "integrity": "sha512-NJB6wpFlIVrS4BhA/Q1a6UuS6MuFr5o2XhfosM6a+W+rad/Rt0HLLX3kuXdRrwHQZvla25iuzTkRnxOKjS+VhQ==",
2622
2622
  "requires": {
2623
- "@xmldom/xmldom": "^0.7.1",
2623
+ "@xmldom/xmldom": "^0.8.0",
2624
2624
  "escodegen": "^2.0.0",
2625
2625
  "esprima": "^4.0.1",
2626
2626
  "memoizeasync": "^1.1.0",
@@ -2910,9 +2910,9 @@
2910
2910
  "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
2911
2911
  },
2912
2912
  "core-js-bundle": {
2913
- "version": "3.19.1",
2914
- "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.19.1.tgz",
2915
- "integrity": "sha512-Gue79dwltEaCVJKIYtA8Wmo7C3FZKZcjn88qIJwR5RtfvityBOWnimsNnkMS0Ya3fJqydAvL8kepMB0XQoR3CQ=="
2913
+ "version": "3.26.0",
2914
+ "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.26.0.tgz",
2915
+ "integrity": "sha512-tqjWRBsaozmNTqnLkvb/xBrSs5mlc+Y8c36QTvmrQMrff1mrQ6wJ5ARzz9UYhUfGiT1BZyka+zqUpPQrw0hZ8g=="
2916
2916
  },
2917
2917
  "core-js-compat": {
2918
2918
  "version": "3.22.4",
@@ -4769,7 +4769,7 @@
4769
4769
  "hashish": {
4770
4770
  "version": "0.0.4",
4771
4771
  "resolved": "https://registry.npmjs.org/hashish/-/hashish-0.0.4.tgz",
4772
- "integrity": "sha1-bWC8b/r3Ebav1g5CbQd5iAFOZVQ=",
4772
+ "integrity": "sha512-xyD4XgslstNAs72ENaoFvgMwtv8xhiDtC2AtzCG+8yF7W/Knxxm9BX+e2s25mm+HxMKh0rBmXVOEGF3zNImXvA==",
4773
4773
  "requires": {
4774
4774
  "traverse": ">=0.2.4"
4775
4775
  }
@@ -5487,7 +5487,7 @@
5487
5487
  "lru-cache": {
5488
5488
  "version": "2.5.0",
5489
5489
  "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz",
5490
- "integrity": "sha1-2COIrpyWC+y+oMc7uet5tsbOmus="
5490
+ "integrity": "sha512-dVmQmXPBlTgFw77hm60ud//l2bCuDKkqC2on1EBoM7s9Urm9IQDrnujwZ93NFnAq0dVZ0HBXTS7PwEG+YE7+EQ=="
5491
5491
  },
5492
5492
  "magic-string": {
5493
5493
  "version": "0.25.1",
@@ -5533,7 +5533,7 @@
5533
5533
  "memoizeasync": {
5534
5534
  "version": "1.1.0",
5535
5535
  "resolved": "https://registry.npmjs.org/memoizeasync/-/memoizeasync-1.1.0.tgz",
5536
- "integrity": "sha1-nXAopvJm3rczUQu327pfUYeMVh4=",
5536
+ "integrity": "sha512-HMfzdLqClZo8HMyuM9B6TqnXCNhw82iVWRLqd2cAdXi063v2iJB4mQfWFeKVByN8VUwhmDZ8NMhryBwKrPRf8Q==",
5537
5537
  "requires": {
5538
5538
  "lru-cache": "2.5.0",
5539
5539
  "passerror": "1.1.1"
@@ -6105,7 +6105,7 @@
6105
6105
  "passerror": {
6106
6106
  "version": "1.1.1",
6107
6107
  "resolved": "https://registry.npmjs.org/passerror/-/passerror-1.1.1.tgz",
6108
- "integrity": "sha1-oluI292RCilgOux9y5bpp6l2h7Q="
6108
+ "integrity": "sha512-PwrEQJBkJMxnxG+tdraz95vTstYnCRqiURNbGtg/vZHLgcAODc9hbiD5ZumGUoh3bpw0F0qKLje7Vd2Fd5Lx3g=="
6109
6109
  },
6110
6110
  "path-browserify": {
6111
6111
  "version": "1.0.1",
@@ -6165,7 +6165,7 @@
6165
6165
  "pegjs": {
6166
6166
  "version": "0.10.0",
6167
6167
  "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz",
6168
- "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0="
6168
+ "integrity": "sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow=="
6169
6169
  },
6170
6170
  "pend": {
6171
6171
  "version": "1.2.0",
@@ -6792,7 +6792,7 @@
6792
6792
  "seq": {
6793
6793
  "version": "0.3.5",
6794
6794
  "resolved": "https://registry.npmjs.org/seq/-/seq-0.3.5.tgz",
6795
- "integrity": "sha1-rgKvOkJHk9jMvyEtaRdODFTf/jg=",
6795
+ "integrity": "sha512-sisY2Ln1fj43KBkRtXkesnRHYNdswIkIibvNe/0UKm2GZxjMbqmccpiatoKr/k2qX5VKiLU8xm+tz/74LAho4g==",
6796
6796
  "requires": {
6797
6797
  "chainsaw": ">=0.0.7 <0.1",
6798
6798
  "hashish": ">=0.0.2 <0.1"
@@ -7537,9 +7537,9 @@
7537
7537
  "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="
7538
7538
  },
7539
7539
  "terser": {
7540
- "version": "5.14.1",
7541
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz",
7542
- "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==",
7540
+ "version": "5.14.2",
7541
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz",
7542
+ "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==",
7543
7543
  "requires": {
7544
7544
  "@jridgewell/source-map": "^0.3.2",
7545
7545
  "acorn": "^8.5.0",
@@ -7641,7 +7641,7 @@
7641
7641
  "traverse": {
7642
7642
  "version": "0.3.9",
7643
7643
  "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
7644
- "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk="
7644
+ "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ=="
7645
7645
  },
7646
7646
  "trim-repeated": {
7647
7647
  "version": "1.0.0",
@@ -7798,7 +7798,7 @@
7798
7798
  "unicoderegexp": {
7799
7799
  "version": "0.4.1",
7800
7800
  "resolved": "https://registry.npmjs.org/unicoderegexp/-/unicoderegexp-0.4.1.tgz",
7801
- "integrity": "sha1-r7EOTvHu3ccRQXu7ZSvIhdqdQXE="
7801
+ "integrity": "sha512-ydh8D5mdd2ldTS25GtZJEgLciuF0Qf2n3rwPhonELk3HioX201ClYGvZMc1bCmx6nblZiADQwbMWekeIqs51qw=="
7802
7802
  },
7803
7803
  "unique-string": {
7804
7804
  "version": "2.0.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qooxdoo/framework",
3
- "version": "7.2.1",
3
+ "version": "7.3.1",
4
4
  "description": "The JS Framework for Coders",
5
5
  "author": "The qooxdoo project",
6
6
  "keywords": [
@@ -34,6 +34,7 @@
34
34
  "qx": "bin/deploy/qx"
35
35
  },
36
36
  "scripts": {
37
+ "preinstall": "node ./addGitHook",
37
38
  "devtools": "node source/resource/qx/tool/bin/build-devtools",
38
39
  "website": "node source/resource/qx/tool/bin/build-website",
39
40
  "pretest": "node ./bootstrap-compiler",
@@ -82,7 +83,7 @@
82
83
  "cldr": "^7.1.1",
83
84
  "columnify": "^1.5.4",
84
85
  "console-control-strings": "^1.1.0",
85
- "core-js-bundle": "^3.19.1",
86
+ "core-js-bundle": "^3.26.0",
86
87
  "dot": "^1.1.3",
87
88
  "download": "^6.0.0",
88
89
  "es6-promise-pool": "^2.5.0",
@@ -594,14 +594,22 @@ qx.Class.define("qx.bom.webfonts.Manager", {
594
594
  cssText = cssText.replace(reg, "");
595
595
  }
596
596
  sheet.cssText = cssText;
597
- } else if (sheet.cssRules) {
598
- for (var j = 0, m = sheet.cssRules.length; j < m; j++) {
599
- var cssText = sheet.cssRules[j].cssText
600
- .replace(/\n/g, "")
601
- .replace(/\r/g, "");
602
- if (reg.exec(cssText)) {
603
- this.__styleSheet.deleteRule(j);
604
- return;
597
+ } else {
598
+ let cssRules = null;
599
+ try {
600
+ cssRules = sheet.cssRules;
601
+ } catch (ex) {
602
+ // Exception is thrown if there are no rules (eg a `<link>` tag inserted by the user)
603
+ }
604
+ if (cssRules) {
605
+ for (var j = 0, m = cssRules.length; j < m; j++) {
606
+ var cssText = cssRules[j].cssText
607
+ .replace(/\n/g, "")
608
+ .replace(/\r/g, "");
609
+ if (reg.exec(cssText)) {
610
+ this.__styleSheet.deleteRule(j);
611
+ return;
612
+ }
605
613
  }
606
614
  }
607
615
  }
@@ -166,6 +166,74 @@ qx.Mixin.define("qx.core.MEvent", {
166
166
  return true;
167
167
  },
168
168
 
169
+ /** @type{Object<String,qx.Promise>} list of pending events, indexed by hash code */
170
+ __pendingEvents: null,
171
+
172
+ /** @type{qx.Promise} promise that callers are waiting on, ready for when all events are finished */
173
+ __promiseWaitForPendingEvents: null,
174
+
175
+ /**
176
+ * Internal helper method to track promises returned from event handlers
177
+ *
178
+ * @param {var} result the result from the event handler
179
+ * @returns {qx.Promise|var} the value to return
180
+ */
181
+ __trackPendingEvent(result) {
182
+ if (qx.core.Environment.get("qx.promise")) {
183
+ if (!qx.Promise.isPromise(result)) {
184
+ return result;
185
+ }
186
+ if (!this.__pendingEvents) {
187
+ this.__pendingEvents = {};
188
+ }
189
+ if (!(result instanceof qx.Promise)) {
190
+ result = qx.Promise.resolve(result);
191
+ }
192
+ let hashCode = result.toHashCode();
193
+ let newPromise = result
194
+ .then(result => {
195
+ delete this.__pendingEvents[hashCode];
196
+ let promise = this.__promiseWaitForPendingEvents;
197
+ if (promise && Object.keys(this.__pendingEvents).length == 0) {
198
+ this.__pendingEvents = null;
199
+ this.__promiseWaitForPendingEvents = null;
200
+ promise.resolve();
201
+ }
202
+ return result;
203
+ })
204
+ .catch(err => {
205
+ delete this.__pendingEvents[hashCode];
206
+ let promise = this.__promiseWaitForPendingEvents;
207
+ if (promise && Object.keys(this.__pendingEvents).length == 0) {
208
+ this.__pendingEvents = null;
209
+ this.__promiseWaitForPendingEvents = null;
210
+ promise.reject(err);
211
+ }
212
+ throw err;
213
+ });
214
+ this.__pendingEvents[hashCode] = newPromise;
215
+ return newPromise;
216
+ } else {
217
+ return result;
218
+ }
219
+ },
220
+
221
+ /**
222
+ * Waits for all pending events to be resolved
223
+ */
224
+ async waitForPendingEvents() {
225
+ if (qx.core.Environment.get("qx.promise")) {
226
+ if (!this.__pendingEvents) {
227
+ return;
228
+ }
229
+ if (!this.__promiseWaitForPendingEvents) {
230
+ this.__promiseWaitForPendingEvents = new qx.Promise();
231
+ }
232
+ let promise = this.__promiseWaitForPendingEvents;
233
+ await promise;
234
+ }
235
+ },
236
+
169
237
  /**
170
238
  * Creates and dispatches an event on this object.
171
239
  *
@@ -178,7 +246,9 @@ qx.Mixin.define("qx.core.MEvent", {
178
246
  */
179
247
  fireEvent(type, clazz, args) {
180
248
  if (!this.$$disposed) {
181
- return this.__Registration.fireEvent(this, type, clazz, args);
249
+ return this.__trackPendingEvent(
250
+ this.__Registration.fireEvent(this, type, clazz, args)
251
+ );
182
252
  }
183
253
 
184
254
  return true;
@@ -204,7 +274,9 @@ qx.Mixin.define("qx.core.MEvent", {
204
274
  }
205
275
 
206
276
  if (!this.$$disposed) {
207
- return this.__Registration.fireEventAsync(this, type, clazz, args);
277
+ return this.__trackPendingEvent(
278
+ this.__Registration.fireEventAsync(this, type, clazz, args)
279
+ );
208
280
  }
209
281
 
210
282
  return qx.Promise.resolve(true);
@@ -224,11 +296,8 @@ qx.Mixin.define("qx.core.MEvent", {
224
296
  */
225
297
  fireNonBubblingEvent(type, clazz, args) {
226
298
  if (!this.$$disposed) {
227
- return this.__Registration.fireNonBubblingEvent(
228
- this,
229
- type,
230
- clazz,
231
- args
299
+ return this.__trackPendingEvent(
300
+ this.__Registration.fireNonBubblingEvent(this, type, clazz, args)
232
301
  );
233
302
  }
234
303
 
@@ -258,11 +327,8 @@ qx.Mixin.define("qx.core.MEvent", {
258
327
  }
259
328
 
260
329
  if (!this.$$disposed) {
261
- return this.__Registration.fireNonBubblingEventAsync(
262
- this,
263
- type,
264
- clazz,
265
- args
330
+ return this.__trackPendingEvent(
331
+ this.__Registration.fireNonBubblingEventAsync(this, type, clazz, args)
266
332
  );
267
333
  }
268
334
 
@@ -289,11 +355,13 @@ qx.Mixin.define("qx.core.MEvent", {
289
355
  if (oldData === undefined) {
290
356
  oldData = null;
291
357
  }
292
- return this.__Registration.fireEvent(this, type, qx.event.type.Data, [
293
- data,
294
- oldData,
295
- !!cancelable
296
- ]);
358
+ return this.__trackPendingEvent(
359
+ this.__Registration.fireEvent(this, type, qx.event.type.Data, [
360
+ data,
361
+ oldData,
362
+ !!cancelable
363
+ ])
364
+ );
297
365
  }
298
366
 
299
367
  return true;
@@ -327,11 +395,12 @@ qx.Mixin.define("qx.core.MEvent", {
327
395
  if (oldData === undefined) {
328
396
  oldData = null;
329
397
  }
330
- return this.__Registration.fireEventAsync(
331
- this,
332
- type,
333
- qx.event.type.Data,
334
- [data, oldData, !!cancelable]
398
+ return this.__trackPendingEvent(
399
+ this.__Registration.fireEventAsync(this, type, qx.event.type.Data, [
400
+ data,
401
+ oldData,
402
+ !!cancelable
403
+ ])
335
404
  );
336
405
  }
337
406
 
@@ -169,6 +169,14 @@ qx.Mixin.define("qx.core.MObjectId", {
169
169
  return childControl;
170
170
  }
171
171
 
172
+ if (!qx.core.Environment.get("qx.core.Object.allowUndefinedObjectId")) {
173
+ if (result === undefined) {
174
+ throw new Error(
175
+ `Cannot find a QX Object in ${this.classname} [${this}] with id=${id}`
176
+ );
177
+ }
178
+ }
179
+
172
180
  return result;
173
181
  },
174
182
 
@@ -44,7 +44,15 @@ qx.Mixin.define("qx.core.MProperty", {
44
44
  return this;
45
45
  }
46
46
 
47
- throw new Error("No such property: " + data);
47
+ throw new Error(
48
+ "No such property: " +
49
+ data +
50
+ " in " +
51
+ this.classname +
52
+ " (" +
53
+ this +
54
+ ")"
55
+ );
48
56
  }
49
57
 
50
58
  return this[setter[data]](value);
@@ -56,7 +64,15 @@ qx.Mixin.define("qx.core.MProperty", {
56
64
  continue;
57
65
  }
58
66
 
59
- throw new Error("No such property: " + prop);
67
+ throw new Error(
68
+ "No such property: " +
69
+ prop +
70
+ " in " +
71
+ this.classname +
72
+ " (" +
73
+ this +
74
+ ")"
75
+ );
60
76
  }
61
77
 
62
78
  this[setter[prop]](data[prop]);
@@ -82,7 +98,15 @@ qx.Mixin.define("qx.core.MProperty", {
82
98
  return this["get" + qx.Bootstrap.firstUp(prop)]();
83
99
  }
84
100
 
85
- throw new Error("No such property: " + prop);
101
+ throw new Error(
102
+ "No such property: " +
103
+ prop +
104
+ " in " +
105
+ this.classname +
106
+ " (" +
107
+ this +
108
+ ")"
109
+ );
86
110
  }
87
111
 
88
112
  return this[getter[prop]]();
@@ -104,7 +128,15 @@ qx.Mixin.define("qx.core.MProperty", {
104
128
  return;
105
129
  }
106
130
 
107
- throw new Error("No such property: " + prop);
131
+ throw new Error(
132
+ "No such property: " +
133
+ prop +
134
+ " in " +
135
+ this.classname +
136
+ " (" +
137
+ this +
138
+ ")"
139
+ );
108
140
  }
109
141
 
110
142
  this[resetter[prop]]();
@@ -123,7 +155,15 @@ qx.Mixin.define("qx.core.MProperty", {
123
155
  qx.core.Assert.assertString(prop);
124
156
 
125
157
  if (!this["get" + qx.Bootstrap.firstUp(prop)]) {
126
- throw new Error("No such property: " + prop);
158
+ throw new Error(
159
+ "No such property: " +
160
+ prop +
161
+ " in " +
162
+ this.classname +
163
+ " (" +
164
+ this +
165
+ ")"
166
+ );
127
167
  }
128
168
  }
129
169
 
@@ -446,7 +446,11 @@ qx.Class.define("qx.core.Object", {
446
446
  */
447
447
 
448
448
  environment: {
449
- "qx.debug.dispose.level": 0
449
+ "qx.debug.dispose.level": 0,
450
+
451
+ // Ideally this would be in the mixin, but mixins do not support environment blocks
452
+ // Also, this would be better as false, not true but that would not be BC
453
+ "qx.core.Object.allowUndefinedObjectId": true
450
454
  },
451
455
 
452
456
  /*
@@ -32,7 +32,8 @@ qx.Mixin.define("qx.data.MBinding", {
32
32
  * the source property.
33
33
  * @param targetObject {qx.core.Object} The object which the source should
34
34
  * be bind to.
35
- * @param targetProperty {String} The property name of the target object.
35
+ * @param targetProperty {String?"value"} The property name of the target object,
36
+ * defaults to "value".
36
37
  * @param options {Map?null} A map containing the options. See
37
38
  * {@link qx.data.SingleValueBinding#bind} for more
38
39
  * information.
@@ -50,7 +51,7 @@ qx.Mixin.define("qx.data.MBinding", {
50
51
  this,
51
52
  sourcePropertyChain,
52
53
  targetObject,
53
- targetProperty,
54
+ targetProperty || "value",
54
55
  options
55
56
  );
56
57
  },
@@ -64,7 +65,8 @@ qx.Mixin.define("qx.data.MBinding", {
64
65
  * the source property.
65
66
  * @param targetObject {qx.core.Object} The object which the source should
66
67
  * be bind to.
67
- * @param targetProperty {String} The property name of the target object.
68
+ * @param targetProperty {String?"value"} The property name of the target object,
69
+ * defaults to "value".
68
70
  * @param options {Map} A map containing the options. See
69
71
  * {@link qx.data.SingleValueBinding#bind} for more
70
72
  * information.
@@ -85,7 +87,7 @@ qx.Mixin.define("qx.data.MBinding", {
85
87
  this,
86
88
  sourcePropertyChain,
87
89
  targetObject,
88
- targetProperty,
90
+ targetProperty || "value",
89
91
  options
90
92
  );
91
93
 
@@ -322,10 +322,10 @@ qx.Class.define("qx.data.controller.CheckedList", {
322
322
  let bindData = itemModel.getUserData(this.classname + ".bindData");
323
323
  if (bindData) {
324
324
  if (bindData.checkedLabelId) {
325
- itemModel.removeBinding(bindData.checkedLabelId);
325
+ itemModel.removeListenerById(bindData.checkedLabelId);
326
326
  }
327
327
  if (bindData.checkedIconId) {
328
- itemModel.removeBinding(bindData.checkedIconId);
328
+ itemModel.removeListenerById(bindData.checkedIconId);
329
329
  }
330
330
  itemModel.setUserData(this.classname + ".bindData", null);
331
331
  }
@@ -30,7 +30,7 @@ qx.Class.define("qx.test.Interface", {
30
30
  return true;
31
31
  },
32
32
 
33
- engineStarted : null
33
+ engineStarted: null
34
34
  },
35
35
 
36
36
  properties: { color: {} }
@@ -53,7 +53,7 @@ qx.Class.define("qx.test.Interface", {
53
53
  return "start";
54
54
  },
55
55
 
56
- engineStarted : true
56
+ engineStarted: true
57
57
  },
58
58
 
59
59
  statics: {
@@ -84,7 +84,7 @@ qx.Class.define("qx.test.Interface", {
84
84
  return "start";
85
85
  },
86
86
 
87
- engineStarted : true
87
+ engineStarted: true
88
88
  },
89
89
 
90
90
  statics: {
@@ -127,9 +127,10 @@ qx.Class.define("qx.test.Interface", {
127
127
  qx.Class.define("qx.test.i.Bmw2", {
128
128
  extend: Object,
129
129
  construct() {},
130
- members : {
131
- engineStarted : false
130
+ members: {
131
+ engineStarted: false
132
132
  },
133
+
133
134
  statics: {
134
135
  honk() {
135
136
  return "honk";
@@ -150,11 +151,12 @@ qx.Class.define("qx.test.Interface", {
150
151
  qx.Class.define("qx.test.i.Bmw2", {
151
152
  extend: Object,
152
153
  construct() {},
153
- members : {
154
+ members: {
154
155
  startEngine() {
155
156
  return "start";
156
157
  }
157
158
  },
159
+
158
160
  statics: {
159
161
  honk() {
160
162
  return "honk";
@@ -181,7 +183,7 @@ qx.Class.define("qx.test.Interface", {
181
183
  return "start";
182
184
  },
183
185
 
184
- engineStarted : null
186
+ engineStarted: null
185
187
  },
186
188
 
187
189
  properties: { color: {} }
@@ -203,7 +205,7 @@ qx.Class.define("qx.test.Interface", {
203
205
  return "start";
204
206
  },
205
207
 
206
- engineStarted : false
208
+ engineStarted: false
207
209
  },
208
210
 
209
211
  statics: {
@@ -248,7 +250,7 @@ qx.Class.define("qx.test.Interface", {
248
250
  implement: [qx.test.i.ICar],
249
251
 
250
252
  members: {
251
- engineStarted : false
253
+ engineStarted: false
252
254
  },
253
255
 
254
256
  statics: {
@@ -277,7 +279,7 @@ qx.Class.define("qx.test.Interface", {
277
279
  return "start";
278
280
  },
279
281
 
280
- engineStarted : false
282
+ engineStarted: false
281
283
  },
282
284
 
283
285
  statics: {