sproutcore 1.4.2-java → 1.4.3-java
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.
- data/CHANGELOG +11 -0
- data/Rakefile +27 -436
- data/VERSION.yml +1 -1
- data/lib/frameworks/sproutcore/CHANGELOG +32 -2
- data/lib/frameworks/sproutcore/frameworks/animation/core.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +8 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record.js +42 -2
- data/lib/frameworks/sproutcore/frameworks/debug/invoke_once_last_debugging.js +7 -12
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/radio/ui.js +22 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/views/list.js +6 -2
- data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +38 -10
- data/lib/frameworks/sproutcore/frameworks/desktop/views/scroller.js +8 -8
- data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/views/select_field.js +12 -5
- data/lib/frameworks/sproutcore/frameworks/foundation/mixins/button.js +3 -3
- data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_text_field.js +14 -9
- data/lib/frameworks/sproutcore/frameworks/foundation/system/datetime.js +3 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/system/root_responder.js +25 -17
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/beginEditing.js +46 -36
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/validatable/ui.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/datetime.js +5 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/validators/not_empty.js +56 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/validators/date_time.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/validators/not_empty.js +7 -3
- data/lib/frameworks/sproutcore/frameworks/foundation/views/label.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/media/views/controls.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/media/views/media_slider.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/media/views/mini_controls.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/media/views/simple_controls.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/media/views/video.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +18 -23
- data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +13 -0
- data/lib/sproutcore/builders/base.rb +4 -4
- data/lib/sproutcore/builders/javascript.rb +0 -7
- data/lib/sproutcore/builders/stylesheet.rb +0 -7
- data/lib/sproutcore/rack/proxy.rb +28 -13
- metadata +4 -4
- data/DISTRIBUTION.yml +0 -20
@@ -219,17 +219,17 @@ SC.Button = {
|
|
219
219
|
|
220
220
|
var valueKey = this.getDelegateProperty('contentValueKey', del) ;
|
221
221
|
if (valueKey && (key === valueKey || key === '*')) {
|
222
|
-
this.set('value', content ? content.get(valueKey) : null) ;
|
222
|
+
this.set('value', content ? (content.get ? content.get(valueKey) : content[valueKey]) : null) ;
|
223
223
|
}
|
224
224
|
|
225
225
|
var titleKey = this.getDelegateProperty('contentTitleKey', del) ;
|
226
226
|
if (titleKey && (key === titleKey || key === '*')) {
|
227
|
-
this.set('title', content ? content.get(titleKey) : null) ;
|
227
|
+
this.set('title', content ? (content.get ? content.get(titleKey) : content[titleKey]) : null) ;
|
228
228
|
}
|
229
229
|
|
230
230
|
var iconKey = this.getDelegateProperty('contentIconKey', del);
|
231
231
|
if (iconKey && (key === iconKey || key === '*')) {
|
232
|
-
this.set('icon', content ? content.get(iconKey) : null) ;
|
232
|
+
this.set('icon', content ? (content.get ? content.get(iconKey) : content[iconKey]) : null) ;
|
233
233
|
}
|
234
234
|
|
235
235
|
return this ;
|
@@ -54,7 +54,7 @@ sc_require('views/text_field') ;
|
|
54
54
|
editor expects your source view to implement the InlineTextFieldViewDelegate
|
55
55
|
protocol.
|
56
56
|
|
57
|
-
h2.
|
57
|
+
h2. Committing or Discarding Changes
|
58
58
|
|
59
59
|
Normally the editor will automatically commit or discard its changes
|
60
60
|
whenever the user exits the edit mode. If you need to force the editor to
|
@@ -66,13 +66,13 @@ sc_require('views/text_field') ;
|
|
66
66
|
}}}
|
67
67
|
|
68
68
|
Both methods will try to end the editing context and will call the
|
69
|
-
|
69
|
+
relevant delegate methods on the delegate you passed to beginEditing().
|
70
70
|
|
71
71
|
Note that it is possible an editor may not be able to commit editing
|
72
72
|
changes because either the delegate disallowed it or because its validator
|
73
73
|
failed. In this case commitEditing() will return NO. If you want to
|
74
74
|
end editing anyway, you can discard the editing changes instead by calling
|
75
|
-
discardEditing(). This method will generally
|
75
|
+
discardEditing(). This method will generally succeed unless your delegate
|
76
76
|
refuses it as well.
|
77
77
|
|
78
78
|
@extends SC.TextFieldView
|
@@ -133,7 +133,9 @@ SC.InlineTextFieldView = SC.TextFieldView.extend(SC.DelegateSupport,
|
|
133
133
|
throw "At least frame and delegate options are required for inline editor";
|
134
134
|
}
|
135
135
|
|
136
|
-
this._originalValue = options.value
|
136
|
+
this._originalValue = options.value;
|
137
|
+
if (SC.none(this._originalValue))
|
138
|
+
this._originalValue = "";
|
137
139
|
this._multiline = (options.multiline !== undefined) ? options.multiline : NO ;
|
138
140
|
if (this._multiline) {
|
139
141
|
this.set('isTextArea', YES);
|
@@ -420,10 +422,11 @@ SC.InlineTextFieldView = SC.TextFieldView.extend(SC.DelegateSupport,
|
|
420
422
|
// editable, begins editing.
|
421
423
|
/** @private */
|
422
424
|
insertTab: function(evt) {
|
425
|
+
var delegate = this._delegate; // removed by commitEditing()
|
423
426
|
this.resignFirstResponder();
|
424
427
|
this.commitEditing() ;
|
425
|
-
if(
|
426
|
-
var next =
|
428
|
+
if(delegate){
|
429
|
+
var next = delegate.get('nextValidKeyView');
|
427
430
|
if(next && next.beginEditing) next.beginEditing();
|
428
431
|
}
|
429
432
|
return YES ;
|
@@ -431,10 +434,12 @@ SC.InlineTextFieldView = SC.TextFieldView.extend(SC.DelegateSupport,
|
|
431
434
|
|
432
435
|
/** @private */
|
433
436
|
insertBacktab: function(evt) {
|
437
|
+
var delegate = this._delegate; // removed by commitEditing()
|
438
|
+
this.resignFirstResponder();
|
434
439
|
this.commitEditing() ;
|
435
|
-
if(
|
436
|
-
var prev =
|
437
|
-
if(prev) prev.beginEditing();
|
440
|
+
if(delegate){
|
441
|
+
var prev = delegate.get('previousValidKeyView');
|
442
|
+
if(prev && prev.beginEditing) prev.beginEditing();
|
438
443
|
}
|
439
444
|
return YES ;
|
440
445
|
},
|
@@ -893,7 +893,9 @@ SC.DateTime.mixin(SC.Comparable,
|
|
893
893
|
@returns {DateTime} the DateTime corresponding to the string parameter
|
894
894
|
*/
|
895
895
|
parse: function(str, fmt) {
|
896
|
-
|
896
|
+
// Declared as an object not a literal since in some browsers the literal
|
897
|
+
// retains state across function calls
|
898
|
+
var re = new RegExp('(?:%([aAbBcdHIjmMpSUWwxXyYZ%])|(.))', "g");
|
897
899
|
var d, parts, opts = {}, check = {}, scanner = SC.Scanner.create({string: str});
|
898
900
|
|
899
901
|
if (SC.none(fmt)) fmt = SC.DATETIME_ISO8601;
|
@@ -1808,29 +1808,37 @@ SC.RootResponder = SC.Object.extend({
|
|
1808
1808
|
} else {
|
1809
1809
|
var lh = this._lastHovered || [] , nh = [] , exited, loc, len,
|
1810
1810
|
view = this.targetViewForEvent(evt) ;
|
1811
|
-
|
1812
|
-
//
|
1813
|
-
//
|
1814
|
-
while(view && (view !== this)) {
|
1811
|
+
|
1812
|
+
// first collect all the responding view starting with the
|
1813
|
+
// target view from the given mouse move event
|
1814
|
+
while (view && (view !== this)) {
|
1815
|
+
nh.push(view);
|
1816
|
+
view = view.get('nextResponder');
|
1817
|
+
}
|
1818
|
+
|
1819
|
+
// next exit views that are no longer part of the
|
1820
|
+
// responding chain
|
1821
|
+
for (loc=0, len=lh.length; loc < len; loc++) {
|
1822
|
+
view = lh[loc] ;
|
1823
|
+
exited = view.respondsTo('mouseExited');
|
1824
|
+
if (exited && nh.indexOf(view) === -1) {
|
1825
|
+
view.tryToPerform('mouseExited', evt);
|
1826
|
+
}
|
1827
|
+
}
|
1828
|
+
|
1829
|
+
// finally, either perform mouse moved or mouse entered depending on
|
1830
|
+
// whether a responding view was or was not part of the last
|
1831
|
+
// hovered views
|
1832
|
+
for (loc=0, len=nh.length; loc < len; loc++) {
|
1833
|
+
view = nh[loc];
|
1815
1834
|
if (lh.indexOf(view) !== -1) {
|
1816
1835
|
view.tryToPerform('mouseMoved', evt);
|
1817
|
-
nh.push(view) ;
|
1818
1836
|
} else {
|
1819
1837
|
view.tryToPerform('mouseEntered', evt);
|
1820
|
-
nh.push(view) ;
|
1821
|
-
}
|
1822
|
-
|
1823
|
-
view = view.get('nextResponder');
|
1824
|
-
}
|
1825
|
-
// now find those views last hovered over that were no longer found
|
1826
|
-
// in this chain and notify of mouseExited.
|
1827
|
-
for(loc=0, len=lh.length; loc < len; loc++) {
|
1828
|
-
view = lh[loc] ;
|
1829
|
-
exited = view.respondsTo('mouseExited') ;
|
1830
|
-
if (exited && !(nh.indexOf(view) !== -1)) {
|
1831
|
-
view.tryToPerform('mouseExited',evt);
|
1832
1838
|
}
|
1833
1839
|
}
|
1840
|
+
|
1841
|
+
// Keep track of the view that were last hovered
|
1834
1842
|
this._lastHovered = nh;
|
1835
1843
|
|
1836
1844
|
// also, if a mouseDownView exists, call the mouseDragged action, if
|
data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/beginEditing.js
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
// ==========================================================================
|
7
7
|
/*global module test htmlbody ok equals same stop start Q$ */
|
8
8
|
|
9
|
-
var pane, optionsForLabel1, optionsForLabel2, delegate;
|
9
|
+
var pane, optionsForLabel1, optionsForLabel2, delegate, optionsForLabelFromView;
|
10
10
|
|
11
11
|
pane = SC.ControlTestPane.design().add("label1", SC.LabelView, {
|
12
12
|
value: 'Some Text',
|
@@ -50,6 +50,30 @@ pane.resetView = function(view) {
|
|
50
50
|
view.set('notifiedDidBegin', NO);
|
51
51
|
};
|
52
52
|
|
53
|
+
|
54
|
+
optionsForLabelFromView = function(view) {
|
55
|
+
var el = view.$(),
|
56
|
+
f = SC.viewportOffset(el[0]),
|
57
|
+
frameTemp = view.convertFrameFromView(view.get('frame'), null);
|
58
|
+
|
59
|
+
f.width = frameTemp.width;
|
60
|
+
f.height = frameTemp.height;
|
61
|
+
|
62
|
+
var optionsForLabel = {
|
63
|
+
frame: f,
|
64
|
+
delegate: view,
|
65
|
+
exampleElement: view.$(),
|
66
|
+
value: view.get('value'),
|
67
|
+
multiline: view.get('isInlineEditorMultiline'),
|
68
|
+
isCollection: NO,
|
69
|
+
validator: view.get('validator'),
|
70
|
+
exampleInlineTextFieldView: view.get('exampleInlineTextFieldView')
|
71
|
+
};
|
72
|
+
|
73
|
+
return optionsForLabel;
|
74
|
+
};
|
75
|
+
|
76
|
+
|
53
77
|
/**
|
54
78
|
|
55
79
|
*/
|
@@ -64,41 +88,8 @@ module("Test the beginEditing() function of SC.InlineTextFieldView", {
|
|
64
88
|
// Reset view1 delegate functions
|
65
89
|
pane.resetView(view1);
|
66
90
|
|
67
|
-
|
68
|
-
|
69
|
-
frameTemp = view1.convertFrameFromView(view1.get('frame'), null);
|
70
|
-
|
71
|
-
f.width = frameTemp.width;
|
72
|
-
f.height = frameTemp.height;
|
73
|
-
|
74
|
-
optionsForLabel1 = {
|
75
|
-
frame: f,
|
76
|
-
delegate: view1,
|
77
|
-
exampleElement: view1.$(),
|
78
|
-
value: view1.get('value'),
|
79
|
-
multiline: view1.get('isInlineEditorMultiline'),
|
80
|
-
isCollection: NO,
|
81
|
-
validator: view1.get('validator'),
|
82
|
-
exampleInlineTextFieldView: view1.get('exampleInlineTextFieldView')
|
83
|
-
};
|
84
|
-
|
85
|
-
el = view2.$();
|
86
|
-
f = SC.viewportOffset(el[0]);
|
87
|
-
frameTemp = view2.convertFrameFromView(view2.get('frame'), null);
|
88
|
-
|
89
|
-
f.width = frameTemp.width;
|
90
|
-
f.height = frameTemp.height;
|
91
|
-
|
92
|
-
optionsForLabel2 = {
|
93
|
-
frame: f,
|
94
|
-
delegate: view2,
|
95
|
-
exampleElement: view2.$(),
|
96
|
-
value: view2.get('value'),
|
97
|
-
multiline: view2.get('isInlineEditorMultiline'),
|
98
|
-
isCollection: NO,
|
99
|
-
validator: view2.get('validator'),
|
100
|
-
exampleInlineTextFieldView: view2.get('exampleInlineTextFieldView')
|
101
|
-
};
|
91
|
+
optionsForLabel1 = optionsForLabelFromView(view1);
|
92
|
+
optionsForLabel2 = optionsForLabelFromView(view2);
|
102
93
|
},
|
103
94
|
|
104
95
|
teardown: function() {
|
@@ -225,3 +216,22 @@ function() {
|
|
225
216
|
|
226
217
|
ok(view1.get('notifiedDidBegin'), "the delegate should have been notified of begin editing at this point");
|
227
218
|
});
|
219
|
+
|
220
|
+
test("inline editor does not display the defaultValue if the label's value is the number 0",
|
221
|
+
function() {
|
222
|
+
var view1 = pane.view('label1');;
|
223
|
+
view1.set('value', 0);
|
224
|
+
optionsForLabel1 = optionsForLabelFromView(view1);
|
225
|
+
|
226
|
+
SC.RunLoop.begin();
|
227
|
+
SC.InlineTextFieldView.beginEditing(optionsForLabel1);
|
228
|
+
SC.RunLoop.end();
|
229
|
+
|
230
|
+
// The inline editor is the last view appended to the pane
|
231
|
+
var length = pane._pane.childViews.length,
|
232
|
+
editor = pane._pane.childViews[length - 1];
|
233
|
+
same(editor.get('value'), 0, "editor should have number 0 as value");
|
234
|
+
editor.blurEditor();
|
235
|
+
|
236
|
+
same(view1.get('value'), 0, "view should still have number 0 as value");
|
237
|
+
});
|
@@ -2,7 +2,7 @@
|
|
2
2
|
// Project: SproutCore - JavaScript Application Framework
|
3
3
|
// Copyright: ©2006-2010 Sprout Systems, Inc. and contributors.
|
4
4
|
// portions copyright @2009 Apple Inc.
|
5
|
-
// License:
|
5
|
+
// License: Licensed under MIT license (see license.js)
|
6
6
|
// ==========================================================================
|
7
7
|
|
8
8
|
/*global module test htmlbody ok equals same stop start */
|
@@ -302,6 +302,11 @@ test('parse without a format uses default ISO8601', function() {
|
|
302
302
|
equals(SC.DateTime.parse("2010-09-17T18:35:08Z").toISO8601(), "2010-09-17T18:35:08+00:00");
|
303
303
|
});
|
304
304
|
|
305
|
+
test('bad parsing', function() {
|
306
|
+
equals(SC.DateTime.parse(SC.DateTime.parse("foo")), null);
|
307
|
+
equals(SC.DateTime.parse("2010-09-17T18:35:08Z", SC.DATETIME_ISO8601).toISO8601(), "2010-09-17T18:35:08+00:00");
|
308
|
+
});
|
309
|
+
|
305
310
|
test('binding', function() {
|
306
311
|
var fromObject = SC.Object.create({value: dt});
|
307
312
|
var toObject = SC.Object.create({value: ''});
|
@@ -0,0 +1,56 @@
|
|
1
|
+
// ==========================================================================
|
2
|
+
// Project: SproutCore - JavaScript Application Framework
|
3
|
+
// Copyright: ©2006-2010 Apple Inc. and contributors.
|
4
|
+
// License: Licensed under MIT license (see license.js)
|
5
|
+
// ==========================================================================
|
6
|
+
|
7
|
+
/*global module test equals context ok same */
|
8
|
+
var notEmptyValidator, field;
|
9
|
+
|
10
|
+
module("SC.Validator.NotEmpty", {
|
11
|
+
setup: function () {
|
12
|
+
notEmptyValidator = SC.Validator.NotEmpty.create();
|
13
|
+
field = SC.Object.create();
|
14
|
+
},
|
15
|
+
teardown: function () {
|
16
|
+
notEmptyValidator.destroy();
|
17
|
+
notEmptyValidator = null;
|
18
|
+
}
|
19
|
+
});
|
20
|
+
|
21
|
+
test("Recognizes a non-empty string as valid",function(){
|
22
|
+
field.set('fieldValue', "fnord");
|
23
|
+
var isValid = notEmptyValidator.validate(undefined, field);
|
24
|
+
ok(isValid, "Not empty string is valid");
|
25
|
+
});
|
26
|
+
|
27
|
+
test("Recognizes empty string as invalid",function(){
|
28
|
+
field.set('fieldValue', "");
|
29
|
+
var isValid = notEmptyValidator.validate(undefined, field);
|
30
|
+
ok( ! isValid, "Empty string is not valid");
|
31
|
+
});
|
32
|
+
|
33
|
+
test("Recognizes null as empty",function(){
|
34
|
+
field.set('fieldValue', null);
|
35
|
+
var isValid = notEmptyValidator.validate(undefined, field);
|
36
|
+
ok( ! isValid, "null string is not valid");
|
37
|
+
});
|
38
|
+
|
39
|
+
test("Recognizes undefined as empty",function(){
|
40
|
+
field.set('fieldValue', undefined);
|
41
|
+
var isValid = notEmptyValidator.validate(undefined, field);
|
42
|
+
ok( ! isValid, "null string is not valid");
|
43
|
+
});
|
44
|
+
|
45
|
+
test("Recognizes some number as non-empty",function(){
|
46
|
+
field.set('fieldValue', 42);
|
47
|
+
var isValid = notEmptyValidator.validate(undefined, field);
|
48
|
+
ok(isValid, "42 string is not empty");
|
49
|
+
});
|
50
|
+
|
51
|
+
test("Recognizes zero as non-empty",function(){
|
52
|
+
field.set('fieldValue', 0);
|
53
|
+
var isValid = notEmptyValidator.validate(undefined, field);
|
54
|
+
ok(isValid, "0 string is not empty");
|
55
|
+
});
|
56
|
+
|
@@ -2,7 +2,7 @@
|
|
2
2
|
// Project: SproutCore - JavaScript Application Framework
|
3
3
|
// Copyright: ©2006-2010 Sprout Systems, Inc. and contributors.
|
4
4
|
// Portions ©2008-2010 Apple Inc. All rights reserved.
|
5
|
-
// License:
|
5
|
+
// License: Licensed under MIT license (see license.js)
|
6
6
|
// ==========================================================================
|
7
7
|
|
8
8
|
require('validators/validator');
|
@@ -20,9 +20,13 @@ SC.Validator.NotEmpty = SC.Validator.extend(
|
|
20
20
|
|
21
21
|
validate: function(form, field) {
|
22
22
|
var value = field.get('fieldValue');
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
if (SC.none(value))
|
24
|
+
return NO;
|
25
|
+
|
26
|
+
if (! SC.none(value.length))
|
27
|
+
return value.length > 0;
|
28
|
+
|
29
|
+
return YES;
|
26
30
|
},
|
27
31
|
|
28
32
|
validateError: function(form, field) {
|
@@ -208,7 +208,7 @@ SC.LabelView = SC.View.extend(SC.Control,
|
|
208
208
|
if (!this.get('isEditable')) return NO ;
|
209
209
|
|
210
210
|
var el = this.$(),
|
211
|
-
value = this.get('value')
|
211
|
+
value = this.get('value'),
|
212
212
|
f = SC.viewportOffset(el[0]),
|
213
213
|
frameTemp = this.convertFrameFromView(this.get('frame'), null) ;
|
214
214
|
f.width=frameTemp.width;
|
@@ -2,7 +2,7 @@
|
|
2
2
|
// Project: SproutCore - JavaScript Application Framework
|
3
3
|
// Copyright: ©2006-2010 Sprout Systems, Inc. and contributors.
|
4
4
|
// Portions ©2008-2010 Apple Inc. All rights reserved.
|
5
|
-
// License:
|
5
|
+
// License: Licensed under MIT license (see license.js)
|
6
6
|
// ==========================================================================
|
7
7
|
|
8
8
|
sc_require('views/controls');
|
@@ -2,7 +2,7 @@
|
|
2
2
|
// Project: SproutCore - JavaScript Application Framework
|
3
3
|
// Copyright: ©2006-2010 Sprout Systems, Inc. and contributors.
|
4
4
|
// Portions ©2008-2010 Apple Inc. All rights reserved.
|
5
|
-
// License:
|
5
|
+
// License: Licensed under MIT license (see license.js)
|
6
6
|
// ==========================================================================
|
7
7
|
/*globals SC */
|
8
8
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
// Project: SproutCore - JavaScript Application Framework
|
3
3
|
// Copyright: ©2006-2010 Sprout Systems, Inc. and contributors.
|
4
4
|
// Portions ©2008-2010 Apple Inc. All rights reserved.
|
5
|
-
// License:
|
5
|
+
// License: Licensed under MIT license (see license.js)
|
6
6
|
// ==========================================================================
|
7
7
|
/*globals SC */
|
8
8
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
// Project: SproutCore - JavaScript Application Framework
|
3
3
|
// Copyright: ©2006-2010 Sprout Systems, Inc. and contributors.
|
4
4
|
// Portions ©2008-2010 Apple Inc. All rights reserved.
|
5
|
-
// License:
|
5
|
+
// License: Licensed under MIT license (see license.js)
|
6
6
|
// ==========================================================================
|
7
7
|
/*globals SC */
|
8
8
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
// Project: SproutCore - JavaScript Application Framework
|
3
3
|
// Copyright: ©2006-2010 Sprout Systems, Inc. and contributors.
|
4
4
|
// Portions ©2008-2010 Apple Inc. All rights reserved.
|
5
|
-
// License:
|
5
|
+
// License: Licensed under MIT license (see license.js)
|
6
6
|
// ==========================================================================
|
7
7
|
/*globals SC */
|
8
8
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
// Project: SproutCore - JavaScript Application Framework
|
3
3
|
// Copyright: ©2006-2010 Sprout Systems, Inc. and contributors.
|
4
4
|
// Portions ©2008-2010 Apple Inc. All rights reserved.
|
5
|
-
// License:
|
5
|
+
// License: Licensed under MIT license (see license.js)
|
6
6
|
// ==========================================================================
|
7
7
|
|
8
8
|
|
@@ -51,7 +51,7 @@ SC.ObserverSet = {
|
|
51
51
|
// context is really useful sometimes but not used that often so this
|
52
52
|
// implementation is intentionally lazy.
|
53
53
|
if (context !== undefined) {
|
54
|
-
if (!methods.contexts)
|
54
|
+
if (!methods.contexts) methods.contexts = {} ;
|
55
55
|
methods.contexts[SC.guidFor(method)] = context ;
|
56
56
|
}
|
57
57
|
|
@@ -782,6 +782,7 @@ function findClassNames() {
|
|
782
782
|
SC._object_foundObjectClassNames = true ;
|
783
783
|
|
784
784
|
var seen = [] ;
|
785
|
+
var detectedSC = false;
|
785
786
|
var searchObject = function(root, object, levels) {
|
786
787
|
levels-- ;
|
787
788
|
|
@@ -792,7 +793,12 @@ function findClassNames() {
|
|
792
793
|
for(var key in object) {
|
793
794
|
if (key == '__scope__') continue ;
|
794
795
|
if (key == 'superclass') continue ;
|
796
|
+
if (key == '__SC__') key = 'SC' ;
|
795
797
|
if (!key.match(/^[A-Z0-9]/)) continue ;
|
798
|
+
if (key == 'SC') {
|
799
|
+
if (detectedSC) continue;
|
800
|
+
detectedSC = true;
|
801
|
+
}
|
796
802
|
|
797
803
|
var path = (root) ? [root,key].join('.') : key ;
|
798
804
|
var value = object[key] ;
|
@@ -818,29 +824,18 @@ function findClassNames() {
|
|
818
824
|
}
|
819
825
|
} ;
|
820
826
|
|
827
|
+
// Fix for IE 7 and 8 in order to detect the SC global variable. When you create
|
828
|
+
// a global variable in IE, it is not added to the window object like in other
|
829
|
+
// browsers. Therefore the searchObject method will not pick it up. So we have to
|
830
|
+
// update the window object to have a reference to the global variable. And
|
831
|
+
// doing window['SC'] does not work since the global variable already exists. For
|
832
|
+
// any object that you create that is used act as a namespace, be sure to create it
|
833
|
+
// like so:
|
834
|
+
//
|
835
|
+
// window.MyApp = window.MyApp || SC.Object.create({ ... })
|
836
|
+
//
|
837
|
+
window['__SC__'] = SC;
|
821
838
|
searchObject(null, window, 2) ;
|
822
|
-
|
823
|
-
// Internet Explorer doesn't loop over global variables...
|
824
|
-
/*if ( SC.browser.isIE ) {
|
825
|
-
searchObject('SC', SC, 2) ; // get names for the SC classes
|
826
|
-
|
827
|
-
// get names for the model classes, including nested namespaces (untested)
|
828
|
-
for ( var i = 0; i < SC.Server.servers.length; i++ ) {
|
829
|
-
var server = SC.Server.servers[i];
|
830
|
-
if (server.prefix) {
|
831
|
-
for (var prefixLoc = 0; prefixLoc < server.prefix.length; prefixLoc++) {
|
832
|
-
var prefixParts = server.prefix[prefixLoc].split('.');
|
833
|
-
var namespace = window;
|
834
|
-
var namespaceName;
|
835
|
-
for (var prefixPartsLoc = 0; prefixPartsLoc < prefixParts.length; prefixPartsLoc++) {
|
836
|
-
namespace = namespace[prefixParts[prefixPartsLoc]] ;
|
837
|
-
namespaceName = prefixParts[prefixPartsLoc];
|
838
|
-
}
|
839
|
-
searchObject(namespaceName, namespace, 2) ;
|
840
|
-
}
|
841
|
-
}
|
842
|
-
}
|
843
|
-
}*/
|
844
839
|
}
|
845
840
|
|
846
841
|
/**
|
@@ -875,7 +870,7 @@ SC.kindOf = function(scObject, scClass) {
|
|
875
870
|
This method is used to allow classes to determine their own name.
|
876
871
|
*/
|
877
872
|
SC._object_className = function(obj) {
|
878
|
-
if (
|
873
|
+
if (SC.isReady === NO) return ''; // class names are not available until ready
|
879
874
|
if (!obj._object_className) findClassNames() ;
|
880
875
|
if (obj._object_className) return obj._object_className ;
|
881
876
|
|