sproutcore 1.11.0.rc3 → 1.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/CHANGELOG +5 -0
- data/VERSION.yml +1 -1
- data/lib/frameworks/sproutcore/Buildfile +3 -2
- data/lib/frameworks/sproutcore/CHANGELOG.md +59 -10
- data/lib/frameworks/sproutcore/apps/showcase/resources/main_page.js +1 -0
- data/lib/frameworks/sproutcore/apps/showcase/resources/stylesheet.css +9 -4
- data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/manipulation.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +0 -10
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +10 -45
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/selection_set.js +3 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/touch.js +76 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/{touch.js → touch_test.js} +64 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/append_remove.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/design_mode_test.js +61 -24
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/createChildViews.js +1 -2
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/destroy.js +0 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/{layoutStyle.js → layout_style_test.js} +4 -4
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layout_test.js +602 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/viewDidResize.js +0 -23
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +18 -17
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/animation.js +5 -5
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/design_mode.js +64 -24
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout.js +904 -871
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +1 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/statechart.js +40 -24
- data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +5 -5
- data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +14 -14
- data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +36 -33
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/writeAttribute.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/autonomous_dataSourceCallbacks.js +6 -6
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitChangesFromNestedStore.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataSourceCallbacks.js +7 -7
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/destroyRecord.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +4 -4
- data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +11 -11
- data/lib/frameworks/sproutcore/frameworks/designer/coders/object.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +30 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +12 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +5 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroller_view.js +0 -36
- data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll_view.js +3 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/views/static_content.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/gestures/pinch_gesture.js +286 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/gestures/swipe_gesture.js +449 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/gestures/tap_gesture.js +259 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/mixins/gesturable.js +218 -30
- data/lib/frameworks/sproutcore/frameworks/foundation/system/gesture.js +259 -158
- data/lib/frameworks/sproutcore/frameworks/foundation/system/string.js +58 -50
- data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/string_measurement.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/gestures/pinch_gesture_test.js +321 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/gestures/swipe_gesture_test.js +154 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/gestures/tap_gesture_test.js +55 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/gesturable_test.js +233 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/staticLayout.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/gesture_test.js +254 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/views/container.js +1 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/legacy/object_keys_polyfill.js +51 -0
- data/lib/frameworks/sproutcore/frameworks/{core_foundation/system/req_anim_frame.js → legacy/request_animation_frame_polyfill.js} +10 -3
- data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +19 -25
- data/lib/frameworks/sproutcore/frameworks/media/views/controls.js +7 -7
- data/lib/frameworks/sproutcore/frameworks/media/views/mini_controls.js +3 -3
- data/lib/frameworks/sproutcore/frameworks/media/views/simple_controls.js +9 -9
- data/lib/frameworks/sproutcore/frameworks/runtime/core.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/insertAt.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeAt.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/ext/array.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/mixins/array.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/mixins/freezable.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +66 -5
- data/lib/frameworks/sproutcore/frameworks/runtime/mixins/tree.js +44 -0
- data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +4 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +0 -25
- data/lib/frameworks/sproutcore/frameworks/runtime/system/enumerator.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/system/error.js +67 -15
- data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +6 -11
- data/lib/frameworks/sproutcore/frameworks/runtime/system/set.js +6 -6
- data/lib/frameworks/sproutcore/frameworks/runtime/system/string.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/{observable.js → observable_test.js} +110 -16
- data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/error.js +21 -0
- data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/template_view/ext/handlebars.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/testing/system/plan.js +1 -1
- data/lib/sproutcore/render_engines/haml.rb +1 -1
- metadata +610 -604
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layout.js +0 -210
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutDidChange.js +0 -275
- data/lib/frameworks/sproutcore/frameworks/foundation/gestures/pinch.js +0 -119
- data/lib/frameworks/sproutcore/frameworks/foundation/gestures/swipe.js +0 -234
- data/lib/frameworks/sproutcore/frameworks/foundation/gestures/tap.js +0 -157
@@ -34,7 +34,7 @@ SC.MediaControlsView = SC.View.extend(
|
|
34
34
|
icon: 'play',
|
35
35
|
layout: { top: 0, left: 0, width: 20, height:20},
|
36
36
|
action: "playPause",
|
37
|
-
targetBinding: "
|
37
|
+
targetBinding: ".parentView.target"
|
38
38
|
}),
|
39
39
|
|
40
40
|
progressView: SC.MediaSlider.extend({
|
@@ -42,15 +42,15 @@ SC.MediaControlsView = SC.View.extend(
|
|
42
42
|
value:0,
|
43
43
|
minimum: 0,
|
44
44
|
step:0.1,
|
45
|
-
valueBinding: "*
|
46
|
-
maximumBinding: "*
|
47
|
-
mediaViewBinding: "
|
45
|
+
valueBinding: ".parentView*target.currentTime" ,
|
46
|
+
maximumBinding: ".parentView*target.duration",
|
47
|
+
mediaViewBinding: ".parentView.target"
|
48
48
|
}),
|
49
49
|
|
50
50
|
timeView: SC.LabelView.extend({
|
51
51
|
layout: { top: 0, right: 160, width: 60, height:20},
|
52
52
|
classNames: 'time',
|
53
|
-
valueBinding: '*
|
53
|
+
valueBinding: '.parentView*target.time'
|
54
54
|
}),
|
55
55
|
|
56
56
|
theaterButton: SC.ButtonView.extend({
|
@@ -59,7 +59,7 @@ SC.MediaControlsView = SC.View.extend(
|
|
59
59
|
titleMinWidth: 35,
|
60
60
|
layout: { top: 0, right: 140, width: 20, height:20},
|
61
61
|
action: "fullScreen",
|
62
|
-
targetBinding: "
|
62
|
+
targetBinding: ".parentView.target"
|
63
63
|
}),
|
64
64
|
|
65
65
|
minusLabelView: SC.LabelView.extend({
|
@@ -71,7 +71,7 @@ SC.MediaControlsView = SC.View.extend(
|
|
71
71
|
volumeView: SC.MediaSlider.extend({
|
72
72
|
layout: { top: 0, right: 25, width: 90, height:20},
|
73
73
|
value:0,
|
74
|
-
valueBinding: "*
|
74
|
+
valueBinding: ".parentView*target.volume" ,
|
75
75
|
minimum: 0,
|
76
76
|
maximum: 1,
|
77
77
|
step: 0.01
|
@@ -34,7 +34,7 @@ SC.MiniMediaControlsView = SC.View.extend(
|
|
34
34
|
noStyle: YES,
|
35
35
|
layout: { top: 0, left: 0, width: 20, height:20},
|
36
36
|
action: "playPause",
|
37
|
-
targetBinding: "
|
37
|
+
targetBinding: ".parentView.target",
|
38
38
|
renderStyle: 'renderImage',
|
39
39
|
theme: ''
|
40
40
|
}),
|
@@ -42,7 +42,7 @@ SC.MiniMediaControlsView = SC.View.extend(
|
|
42
42
|
timeView: SC.LabelView.design({
|
43
43
|
layout: { top: 0, left: 20, width: 60, height:20},
|
44
44
|
classNames: 'time',
|
45
|
-
valueBinding: '*
|
45
|
+
valueBinding: '.parentView*target.time'
|
46
46
|
}),
|
47
47
|
|
48
48
|
minusLabelView: SC.LabelView.design({
|
@@ -54,7 +54,7 @@ SC.MiniMediaControlsView = SC.View.extend(
|
|
54
54
|
volumeView: SC.MediaSlider.design({
|
55
55
|
layout: { top: 0, left: 100, right: 10, height:20},
|
56
56
|
value:0,
|
57
|
-
valueBinding: "*
|
57
|
+
valueBinding: ".parentView*target.volume" ,
|
58
58
|
minimum: 0,
|
59
59
|
maximum: 1,
|
60
60
|
step: 0.01
|
@@ -14,11 +14,11 @@ SC.SimpleMediaControlsView = SC.View.extend(
|
|
14
14
|
/** @scope SC.SimpleMediaControlsView.prototype */{
|
15
15
|
|
16
16
|
target: null,
|
17
|
-
|
17
|
+
|
18
18
|
childViews: ['playButton', 'progressView'],
|
19
|
-
|
19
|
+
|
20
20
|
classNames: ['sc-media-controls'],
|
21
|
-
|
21
|
+
|
22
22
|
playObserver: function(){
|
23
23
|
if(this.getPath('target.paused')){
|
24
24
|
this.get('playButton').set('icon', 'play');
|
@@ -26,23 +26,23 @@ SC.SimpleMediaControlsView = SC.View.extend(
|
|
26
26
|
this.get('playButton').set('icon', 'stop');
|
27
27
|
}
|
28
28
|
}.observes('*target.paused'),
|
29
|
-
|
29
|
+
|
30
30
|
playButton: SC.ButtonView.design({
|
31
31
|
title: '',
|
32
32
|
titleMinWidth: 35,
|
33
33
|
icon: 'play',
|
34
34
|
layout: { top: 0, left: 0, width: 20, height:20 },
|
35
35
|
action: "playPause",
|
36
|
-
targetBinding: "
|
36
|
+
targetBinding: ".parentView.target"
|
37
37
|
}),
|
38
|
-
|
38
|
+
|
39
39
|
progressView: SC.MediaSlider.design({
|
40
40
|
layout: { top: 0, left: 25, right: 10, height:20 },
|
41
41
|
value:0,
|
42
42
|
minimum: 0,
|
43
43
|
step:0.1,
|
44
|
-
valueBinding: "*
|
45
|
-
maximumBinding: "*
|
46
|
-
mediaViewBinding: "
|
44
|
+
valueBinding: ".parentView*target.currentTime" ,
|
45
|
+
maximumBinding: ".parentView*target.duration",
|
46
|
+
mediaViewBinding: ".parentView.target"
|
47
47
|
})
|
48
48
|
});
|
@@ -39,7 +39,7 @@ window.SproutCore = window.SproutCore || SC;
|
|
39
39
|
// rest of the methods go into the mixin defined below.
|
40
40
|
|
41
41
|
/**
|
42
|
-
@version 1.11.0
|
42
|
+
@version 1.11.0
|
43
43
|
@namespace
|
44
44
|
|
45
45
|
All SproutCore methods and functions are defined
|
@@ -56,7 +56,7 @@ window.SproutCore = window.SproutCore || SC;
|
|
56
56
|
*/
|
57
57
|
SC = window.SC; // This is dumb but necessary for jsdoc to get it right
|
58
58
|
|
59
|
-
SC.VERSION = '1.11.0
|
59
|
+
SC.VERSION = '1.11.0';
|
60
60
|
|
61
61
|
/**
|
62
62
|
@private
|
@@ -34,7 +34,7 @@ SC.ArraySuite.define(function(T) {
|
|
34
34
|
try {
|
35
35
|
obj.insertAt(200, T.expected(1));
|
36
36
|
} catch (e) {
|
37
|
-
equals(e, SC.OUT_OF_RANGE_EXCEPTION, 'should throw SC.OUT_OF_RANGE_EXCEPTION');
|
37
|
+
equals(e.message, SC.OUT_OF_RANGE_EXCEPTION, 'should throw SC.OUT_OF_RANGE_EXCEPTION');
|
38
38
|
didThrow = YES ;
|
39
39
|
}
|
40
40
|
ok(didThrow, 'should raise exception');
|
@@ -73,7 +73,7 @@ SC.ArraySuite.define(function(T) {
|
|
73
73
|
try {
|
74
74
|
obj.insertAt(200, T.expected(1));
|
75
75
|
} catch (e) {
|
76
|
-
equals(e, SC.OUT_OF_RANGE_EXCEPTION, 'should throw SC.OUT_OF_RANGE_EXCEPTION');
|
76
|
+
equals(e.message, SC.OUT_OF_RANGE_EXCEPTION, 'should throw SC.OUT_OF_RANGE_EXCEPTION');
|
77
77
|
didThrow = YES ;
|
78
78
|
}
|
79
79
|
ok(didThrow, 'should raise exception');
|
@@ -35,7 +35,7 @@ SC.ArraySuite.define(function(T) {
|
|
35
35
|
try {
|
36
36
|
obj.removeAt(200);
|
37
37
|
} catch (e) {
|
38
|
-
equals(e, SC.OUT_OF_RANGE_EXCEPTION, 'should throw SC.OUT_OF_RANGE_EXCEPTION');
|
38
|
+
equals(e.message, SC.OUT_OF_RANGE_EXCEPTION, 'should throw SC.OUT_OF_RANGE_EXCEPTION');
|
39
39
|
didThrow = YES ;
|
40
40
|
}
|
41
41
|
ok(didThrow, 'should raise exception');
|
@@ -16,7 +16,7 @@ SC.mixin(Array.prototype,
|
|
16
16
|
|
17
17
|
// primitive for array support.
|
18
18
|
replace: function (idx, amt, objects) {
|
19
|
-
if (this.isFrozen) { throw SC.FROZEN_ERROR; }
|
19
|
+
if (this.isFrozen) { throw new Error(SC.FROZEN_ERROR); }
|
20
20
|
|
21
21
|
var args;
|
22
22
|
var len = objects ? (objects.get ? objects.get('length') : objects.length) : 0;
|
@@ -138,7 +138,7 @@ SC.CoreArray = /** @lends SC.Array.prototype */ {
|
|
138
138
|
@param {Object} object object to insert
|
139
139
|
*/
|
140
140
|
insertAt: function (idx, object) {
|
141
|
-
if (idx > this.get('length')) throw SC.OUT_OF_RANGE_EXCEPTION;
|
141
|
+
if (idx > this.get('length')) throw new Error(SC.OUT_OF_RANGE_EXCEPTION);
|
142
142
|
this.replace(idx, 0, [object]);
|
143
143
|
return this;
|
144
144
|
},
|
@@ -162,7 +162,7 @@ SC.CoreArray = /** @lends SC.Array.prototype */ {
|
|
162
162
|
if (typeof start === SC.T_NUMBER) {
|
163
163
|
|
164
164
|
if ((start < 0) || (start >= this.get('length'))) {
|
165
|
-
throw SC.OUT_OF_RANGE_EXCEPTION;
|
165
|
+
throw new Error(SC.OUT_OF_RANGE_EXCEPTION);
|
166
166
|
}
|
167
167
|
|
168
168
|
// fast case
|
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
@type Error
|
13
13
|
*/
|
14
|
-
SC.FROZEN_ERROR =
|
14
|
+
SC.FROZEN_ERROR = "Cannot modify a frozen object";
|
15
15
|
|
16
16
|
/**
|
17
17
|
@class
|
@@ -48,7 +48,7 @@ SC.FROZEN_ERROR = new Error("Cannot modify a frozen object");
|
|
48
48
|
|
49
49
|
// swaps the names
|
50
50
|
swapNames: function() {
|
51
|
-
if (this.get('isFrozen')) throw SC.FROZEN_ERROR;
|
51
|
+
if (this.get('isFrozen')) throw new Error(SC.FROZEN_ERROR);
|
52
52
|
var tmp = this.get('firstName');
|
53
53
|
this.set('firstName', this.get('lastName'));
|
54
54
|
this.set('lastName', tmp);
|
@@ -918,18 +918,79 @@ SC.Observable = /** @scope SC.Observable.prototype */ {
|
|
918
918
|
an expensive action until someone begins observing a particular property
|
919
919
|
on the object.
|
920
920
|
|
921
|
+
Optionally, you may pass a target and method to check for the
|
922
|
+
presence of a particular observer. You can use this to avoid creating
|
923
|
+
duplicate observers in situations where that's likely.
|
924
|
+
|
921
925
|
@param {String} key key to check
|
926
|
+
@param {Object} [target] the target that the observer uses
|
927
|
+
@param {Function|String} [method]) the method on the target that the observer uses
|
922
928
|
@returns {Boolean}
|
923
929
|
*/
|
924
|
-
hasObserverFor: function (key) {
|
930
|
+
hasObserverFor: function (key, target, method) {
|
925
931
|
SC.Observers.flush(this); // hookup as many observers as possible.
|
926
932
|
|
927
933
|
var observers = this[SC.keyFor('_kvo_observers', key)],
|
928
|
-
|
934
|
+
chains = this._kvo_for(SC.keyFor('_kvo_chains', key)),
|
935
|
+
locals = this[SC.keyFor('_kvo_local', key)],
|
936
|
+
isChain = key.indexOf('.') >= 0;
|
937
|
+
|
938
|
+
// Fast path: no target/method.
|
939
|
+
if (target === undefined) {
|
940
|
+
if (isChain) {
|
941
|
+
if (chains && chains.length > 0) return YES;
|
942
|
+
} else {
|
943
|
+
// Found locally.
|
944
|
+
if (locals && locals.length > 0) return YES;
|
945
|
+
if (observers && observers.getMembers().length > 0) return YES;
|
946
|
+
}
|
947
|
+
return NO;
|
948
|
+
|
949
|
+
// Slow path: target/method.
|
950
|
+
} else {
|
951
|
+
if (method === undefined) {
|
952
|
+
method = target;
|
953
|
+
target = this;
|
954
|
+
}
|
955
|
+
if (typeof method === "string") method = target[method];
|
956
|
+
if (!method) throw new Error("Developer Error: If present, the `method` argument of hasObserverFor must be (or refer to) a function.");
|
957
|
+
|
958
|
+
// Declare our iterators.
|
959
|
+
var i, len;
|
960
|
+
|
961
|
+
// Check remote chains.
|
962
|
+
if (isChain) {
|
963
|
+
if (!chains || !chains.length) return NO;
|
964
|
+
len = chains.length;
|
965
|
+
for (i = 0; i < len; i++) {
|
966
|
+
if (chains[i].masterTarget === target && chains[i].masterMethod === method) return YES;
|
967
|
+
}
|
968
|
+
return NO;
|
969
|
+
|
970
|
+
// Check locals.
|
971
|
+
} else if (target === this) {
|
972
|
+
if (!locals) return NO;
|
973
|
+
len = locals.length;
|
974
|
+
for (i = 0; i < len; i++) {
|
975
|
+
if (this[locals[i]] === method) return YES;
|
976
|
+
}
|
977
|
+
return NO;
|
929
978
|
|
930
|
-
|
931
|
-
|
932
|
-
|
979
|
+
// Check remotes.
|
980
|
+
} else {
|
981
|
+
if (!observers || !observers.members) return NO;
|
982
|
+
|
983
|
+
len = observers.members.length;
|
984
|
+
var member;
|
985
|
+
for (i = 0; i < len; i++) {
|
986
|
+
member = observers.members[i];
|
987
|
+
// If this is a non-chained observer, the first item is the target and the second is the method.
|
988
|
+
if (member[0] === target && member[1] === method) return YES;
|
989
|
+
}
|
990
|
+
return NO;
|
991
|
+
}
|
992
|
+
// TODO: Remote chains.
|
993
|
+
}
|
933
994
|
},
|
934
995
|
|
935
996
|
/**
|
@@ -0,0 +1,44 @@
|
|
1
|
+
// ==========================================================================
|
2
|
+
// Project: SproutCore Costello - Property Observing Library
|
3
|
+
// Copyright: ©2006-2011 Strobe Inc. and contributors.
|
4
|
+
// Portions ©2008-2011 Apple Inc. All rights reserved.
|
5
|
+
// License: Licensed under MIT license (see license.js)
|
6
|
+
// ==========================================================================
|
7
|
+
|
8
|
+
/** @private */
|
9
|
+
SC.Tree = /** @scope SC.Tree.prototype */ {
|
10
|
+
|
11
|
+
/** @private Call the method recursively on all child views. */
|
12
|
+
invoke: function (methodName, isTopDown, context) {
|
13
|
+
var childView,
|
14
|
+
childViews = this.get('childViews'),
|
15
|
+
method,
|
16
|
+
shouldContinue;
|
17
|
+
|
18
|
+
for (var i = childViews.length - 1; i >= 0; i--) {
|
19
|
+
childView = childViews[i];
|
20
|
+
|
21
|
+
// We allow missing childViews in the array so ignore them.
|
22
|
+
if (!childView) { continue; }
|
23
|
+
|
24
|
+
// Look up the method on the child.
|
25
|
+
method = childView[methodName];
|
26
|
+
|
27
|
+
// Call the method on this view *before* its children.
|
28
|
+
if (isTopDown === undefined || isTopDown) {
|
29
|
+
shouldContinue = method.call(childView, context);
|
30
|
+
}
|
31
|
+
|
32
|
+
// Recurse.
|
33
|
+
if (shouldContinue === undefined || shouldContinue) {
|
34
|
+
childView._callOnChildViews(methodName, isTopDown, context);
|
35
|
+
}
|
36
|
+
|
37
|
+
// Call the method on this view *after* its children.
|
38
|
+
if (isTopDown === false) {
|
39
|
+
method.call(childView, context);
|
40
|
+
}
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
};
|
@@ -81,7 +81,10 @@ SC.Observers = {
|
|
81
81
|
// it is fastest to set to null then loop over again to collapse, but for all other browsers
|
82
82
|
// it is not. Plus, this code shouldn't get hit very often anyway (it may not ever get hit
|
83
83
|
// for some apps).
|
84
|
-
idx = this.queue.length;
|
84
|
+
idx = this.queue.length;
|
85
|
+
queue = this.queue;
|
86
|
+
|
87
|
+
var newQueue;
|
85
88
|
while(--idx >= 0) {
|
86
89
|
item = queue[idx];
|
87
90
|
|
@@ -967,31 +967,6 @@ SC.Binding = /** @scope SC.Binding.prototype */{
|
|
967
967
|
});
|
968
968
|
},
|
969
969
|
|
970
|
-
/**
|
971
|
-
Adds a transform that will return YES if the value is equal to equalValue, NO otherwise.
|
972
|
-
|
973
|
-
isVisibleBinding: SC.Binding.oneWay("MyApp.someController.title").equalTo(comparisonValue)
|
974
|
-
|
975
|
-
Or:
|
976
|
-
|
977
|
-
isVisibleBinding: SC.Binding.equalTo("MyApp.someController.title", comparisonValue)
|
978
|
-
|
979
|
-
@param {String} fromPath from path or null
|
980
|
-
@param {Object} equalValue the value to compare with
|
981
|
-
@returns {SC.Binding} this
|
982
|
-
*/
|
983
|
-
equalTo: function(fromPath, equalValue) {
|
984
|
-
// Normalize arguments.
|
985
|
-
if (equalValue === undefined) {
|
986
|
-
equalValue = fromPath;
|
987
|
-
fromPath = null;
|
988
|
-
}
|
989
|
-
|
990
|
-
return this.from(fromPath).transform(function(value, binding) {
|
991
|
-
return value === equalValue;
|
992
|
-
});
|
993
|
-
},
|
994
|
-
|
995
970
|
/**
|
996
971
|
Adds a transform that will *always* return an integer Number value. Null and undefined values will
|
997
972
|
return 0 while String values will be transformed using the parseInt method (according to the
|
@@ -57,7 +57,7 @@ SC.Enumerator.prototype = /** @scope SC.Enumerator.prototype */{
|
|
57
57
|
*/
|
58
58
|
reset: function() {
|
59
59
|
var e = this.enumerable ;
|
60
|
-
if (!e) throw
|
60
|
+
if (!e) SC.throw("Enumerator has been destroyed");
|
61
61
|
this._length = e.get ? e.get('length') : e.length ;
|
62
62
|
var len = this._length;
|
63
63
|
this._index = 0;
|
@@ -32,7 +32,7 @@ sc_require('ext/function');
|
|
32
32
|
set isError to YES, then calling SC.ok(obj) on your object will return NO.
|
33
33
|
If isError is YES, then SC.val(obj) will return your errorValue property
|
34
34
|
instead of the receiver.
|
35
|
-
|
35
|
+
|
36
36
|
When using SC.typeOf(obj), SC.T_ERROR will only be returned if the obj
|
37
37
|
is an instance of SC.Error
|
38
38
|
|
@@ -76,6 +76,27 @@ SC.Error = SC.Object.extend(
|
|
76
76
|
return this;
|
77
77
|
}.property().cacheable(),
|
78
78
|
|
79
|
+
/**
|
80
|
+
Throw the error.
|
81
|
+
|
82
|
+
@type SC.Error
|
83
|
+
*/
|
84
|
+
'throw': function() {
|
85
|
+
var error = this.toString();
|
86
|
+
SC.Logger.error(error);
|
87
|
+
|
88
|
+
throw new Error(error);
|
89
|
+
},
|
90
|
+
|
91
|
+
/**
|
92
|
+
The error stacktrace.
|
93
|
+
|
94
|
+
@type SC.Error
|
95
|
+
*/
|
96
|
+
trace: function() {
|
97
|
+
return (new Error()).trace;
|
98
|
+
}.property().cacheable(),
|
99
|
+
|
79
100
|
/**
|
80
101
|
Human readable name of the item with the error.
|
81
102
|
|
@@ -94,37 +115,68 @@ SC.Error = SC.Object.extend(
|
|
94
115
|
@type Boolean
|
95
116
|
*/
|
96
117
|
isError: YES
|
97
|
-
})
|
118
|
+
});
|
119
|
+
|
120
|
+
SC.Error.mixin({
|
121
|
+
|
122
|
+
/**
|
123
|
+
Creates a new SC.Error instance with the passed description, label, and
|
124
|
+
code. All parameters are optional.
|
125
|
+
|
126
|
+
@param description {String} human readable description of the error
|
127
|
+
@param label {String} human readable name of the item with the error
|
128
|
+
@param code {Number} an error code to use for testing.
|
129
|
+
@returns {SC.Error} new error instance.
|
130
|
+
*/
|
131
|
+
desc: function(description, label, value, code) {
|
132
|
+
var opts = { message: description } ;
|
133
|
+
if (label !== undefined) opts.label = label ;
|
134
|
+
if (code !== undefined) opts.code = code ;
|
135
|
+
if (value !== undefined) opts.errorValue = value ;
|
136
|
+
return this.create(opts) ;
|
137
|
+
},
|
138
|
+
|
139
|
+
/**
|
140
|
+
Throw a new SC.Error instance with the passed description, label, and
|
141
|
+
code. All parameters are optional.
|
142
|
+
|
143
|
+
@param description {String} human readable description of the error
|
144
|
+
@param label {String} human readable name of the item with the error
|
145
|
+
@param code {Number} an error code to use for testing.
|
146
|
+
@returns {SC.Error} new error instance.
|
147
|
+
*/
|
148
|
+
'throw': function(description, label, value, code) {
|
149
|
+
this.desc.apply(this, arguments).throw();
|
150
|
+
}
|
151
|
+
|
152
|
+
});
|
98
153
|
|
99
154
|
/**
|
100
|
-
|
101
|
-
code. All parameters are optional.
|
155
|
+
Shorthand form of the SC.Error.desc method.
|
102
156
|
|
103
157
|
@param description {String} human readable description of the error
|
104
158
|
@param label {String} human readable name of the item with the error
|
105
159
|
@param code {Number} an error code to use for testing.
|
106
160
|
@returns {SC.Error} new error instance.
|
107
161
|
*/
|
108
|
-
SC
|
109
|
-
|
110
|
-
|
111
|
-
if (code !== undefined) opts.code = code ;
|
112
|
-
if (value !== undefined) opts.errorValue = value ;
|
113
|
-
return this.create(opts) ;
|
114
|
-
} ;
|
162
|
+
SC.$error = function(description, label, value, c) {
|
163
|
+
return SC.Error.desc(description, label, value, c);
|
164
|
+
};
|
115
165
|
|
116
166
|
/**
|
117
|
-
Shorthand form of the SC.Error.
|
167
|
+
Shorthand form of the SC.Error.throw method.
|
118
168
|
|
119
169
|
@param description {String} human readable description of the error
|
120
170
|
@param label {String} human readable name of the item with the error
|
121
171
|
@param code {Number} an error code to use for testing.
|
122
172
|
@returns {SC.Error} new error instance.
|
123
173
|
*/
|
174
|
+
SC.throw = function(description, label, value, c) {
|
175
|
+
SC.Error.throw(description, label, value, c);
|
176
|
+
};
|
124
177
|
|
125
|
-
|
126
|
-
|
127
|
-
} ;
|
178
|
+
/** @private */
|
179
|
+
SC.$throw = SC.throw;
|
128
180
|
|
129
181
|
/**
|
130
182
|
Returns NO if the passed value is an error object or false.
|