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.
Files changed (98) hide show
  1. checksums.yaml +6 -14
  2. data/CHANGELOG +5 -0
  3. data/VERSION.yml +1 -1
  4. data/lib/frameworks/sproutcore/Buildfile +3 -2
  5. data/lib/frameworks/sproutcore/CHANGELOG.md +59 -10
  6. data/lib/frameworks/sproutcore/apps/showcase/resources/main_page.js +1 -0
  7. data/lib/frameworks/sproutcore/apps/showcase/resources/stylesheet.css +9 -4
  8. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/manipulation.js +1 -1
  9. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +0 -10
  10. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js +1 -1
  11. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +10 -45
  12. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/selection_set.js +3 -3
  13. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/touch.js +76 -0
  14. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/{touch.js → touch_test.js} +64 -0
  15. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/append_remove.js +1 -1
  16. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/design_mode_test.js +61 -24
  17. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/createChildViews.js +1 -2
  18. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/destroy.js +0 -3
  19. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/{layoutStyle.js → layout_style_test.js} +4 -4
  20. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layout_test.js +602 -0
  21. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/viewDidResize.js +0 -23
  22. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +18 -17
  23. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/animation.js +5 -5
  24. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/design_mode.js +64 -24
  25. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout.js +904 -871
  26. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +1 -3
  27. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/statechart.js +40 -24
  28. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +2 -2
  29. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +5 -5
  30. data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +14 -14
  31. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +1 -1
  32. data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +2 -2
  33. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +36 -33
  34. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/writeAttribute.js +1 -1
  35. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/autonomous_dataSourceCallbacks.js +6 -6
  36. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitChangesFromNestedStore.js +1 -1
  37. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +1 -1
  38. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataSourceCallbacks.js +7 -7
  39. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/destroyRecord.js +2 -2
  40. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +2 -2
  41. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +4 -4
  42. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +11 -11
  43. data/lib/frameworks/sproutcore/frameworks/designer/coders/object.js +1 -1
  44. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +30 -1
  45. data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +12 -1
  46. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +5 -3
  47. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroller_view.js +0 -36
  48. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll_view.js +3 -3
  49. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +1 -1
  50. data/lib/frameworks/sproutcore/frameworks/desktop/views/static_content.js +1 -1
  51. data/lib/frameworks/sproutcore/frameworks/foundation/gestures/pinch_gesture.js +286 -0
  52. data/lib/frameworks/sproutcore/frameworks/foundation/gestures/swipe_gesture.js +449 -0
  53. data/lib/frameworks/sproutcore/frameworks/foundation/gestures/tap_gesture.js +259 -0
  54. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/gesturable.js +218 -30
  55. data/lib/frameworks/sproutcore/frameworks/foundation/system/gesture.js +259 -158
  56. data/lib/frameworks/sproutcore/frameworks/foundation/system/string.js +58 -50
  57. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/string_measurement.js +1 -1
  58. data/lib/frameworks/sproutcore/frameworks/foundation/tests/gestures/pinch_gesture_test.js +321 -0
  59. data/lib/frameworks/sproutcore/frameworks/foundation/tests/gestures/swipe_gesture_test.js +154 -0
  60. data/lib/frameworks/sproutcore/frameworks/foundation/tests/gestures/tap_gesture_test.js +55 -0
  61. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/gesturable_test.js +233 -0
  62. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/staticLayout.js +2 -2
  63. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/gesture_test.js +254 -0
  64. data/lib/frameworks/sproutcore/frameworks/foundation/views/container.js +1 -0
  65. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +1 -1
  66. data/lib/frameworks/sproutcore/frameworks/legacy/object_keys_polyfill.js +51 -0
  67. data/lib/frameworks/sproutcore/frameworks/{core_foundation/system/req_anim_frame.js → legacy/request_animation_frame_polyfill.js} +10 -3
  68. data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +19 -25
  69. data/lib/frameworks/sproutcore/frameworks/media/views/controls.js +7 -7
  70. data/lib/frameworks/sproutcore/frameworks/media/views/mini_controls.js +3 -3
  71. data/lib/frameworks/sproutcore/frameworks/media/views/simple_controls.js +9 -9
  72. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +2 -2
  73. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/insertAt.js +2 -2
  74. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeAt.js +1 -1
  75. data/lib/frameworks/sproutcore/frameworks/runtime/ext/array.js +1 -1
  76. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/array.js +2 -2
  77. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/freezable.js +2 -2
  78. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +66 -5
  79. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/tree.js +44 -0
  80. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +4 -1
  81. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +0 -25
  82. data/lib/frameworks/sproutcore/frameworks/runtime/system/enumerator.js +1 -1
  83. data/lib/frameworks/sproutcore/frameworks/runtime/system/error.js +67 -15
  84. data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +6 -11
  85. data/lib/frameworks/sproutcore/frameworks/runtime/system/set.js +6 -6
  86. data/lib/frameworks/sproutcore/frameworks/runtime/system/string.js +1 -1
  87. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/{observable.js → observable_test.js} +110 -16
  88. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/error.js +21 -0
  89. data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +2 -2
  90. data/lib/frameworks/sproutcore/frameworks/template_view/ext/handlebars.js +1 -1
  91. data/lib/frameworks/sproutcore/frameworks/testing/system/plan.js +1 -1
  92. data/lib/sproutcore/render_engines/haml.rb +1 -1
  93. metadata +610 -604
  94. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layout.js +0 -210
  95. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutDidChange.js +0 -275
  96. data/lib/frameworks/sproutcore/frameworks/foundation/gestures/pinch.js +0 -119
  97. data/lib/frameworks/sproutcore/frameworks/foundation/gestures/swipe.js +0 -234
  98. data/lib/frameworks/sproutcore/frameworks/foundation/gestures/tap.js +0 -157
@@ -0,0 +1,254 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore
3
+ // License: Licensed under MIT license
4
+ // ==========================================================================
5
+ /*globals CoreTest, module, test, ok, equals, same, expect */
6
+
7
+ var gesture;
8
+ module("SC.Gesture", {
9
+
10
+ setup: function () {
11
+ gesture = SC.Gesture;
12
+ },
13
+
14
+ teardown: function () {
15
+ if (gesture.destroy) { gesture.destroy(); }
16
+ gesture = null;
17
+ }
18
+ });
19
+
20
+ /* Properties */
21
+ test("Default Properties:", function () {
22
+ gesture = gesture.create();
23
+ equals(gesture.name, 'gesture', "The default value of name is");
24
+ });
25
+
26
+ /* Methods */
27
+
28
+ // This method sets _sc_isActive to true and calls gestureName + 'Start' on the view with the gesture and any given arguments.
29
+ test("Method: start (_sc_isActive === false)", function () {
30
+ var view = SC.View.create({
31
+
32
+ gestureStart: function (arg1, arg2) {
33
+ ok(true, 'called', 'called', "The method was");
34
+ equals(arg1, 'a', "The first argument passed to start is passed to gestureStart and is");
35
+ equals(arg2, 'b', "The second argument passed to start is passed to gestureStart and is");
36
+ }
37
+
38
+ });
39
+
40
+ gesture = gesture.create({
41
+ view: view
42
+ });
43
+
44
+ ok(gesture.start !== undefined, 'defined', 'defined', "The method is");
45
+
46
+ gesture.start('a', 'b');
47
+
48
+ equals(gesture._sc_isActive, true, "The gesture has _sc_isActive set to");
49
+ });
50
+
51
+ // This method does nothing if _sc_isActive is already true.
52
+ test("Method: start (_sc_isActive === true)", function () {
53
+ var view = SC.View.create({
54
+
55
+ gestureStart: function (theGesture) {
56
+ ok(true, 'called', 'called', "The method was");
57
+ }
58
+
59
+ });
60
+
61
+ gesture = gesture.create({
62
+ _sc_isActive: true,
63
+ view: view
64
+ });
65
+
66
+ gesture.start();
67
+
68
+ // Ensure 0 tests run.
69
+ expect(0);
70
+ });
71
+
72
+ // This method sets _sc_isActive to false and calls gestureName + 'End' on the view with the gesture and any given arguments.
73
+ test("Method: end (_sc_isActive === true)", function () {
74
+ var view = SC.View.create({
75
+
76
+ gestureEnd: function (arg1, arg2) {
77
+ ok(true, 'called', 'called', "The method was");
78
+ equals(arg1, 'a', "The first argument passed to start is passed to gestureEnd and is");
79
+ equals(arg2, 'b', "The second argument passed to start is passed to gestureEnd and is");
80
+ }
81
+
82
+ });
83
+
84
+ gesture = gesture.create({
85
+ _sc_isActive: true,
86
+ view: view
87
+ });
88
+
89
+ ok(gesture.end !== undefined, 'defined', 'defined', "The method is");
90
+
91
+ gesture.end('a', 'b');
92
+
93
+ equals(gesture._sc_isActive, false, "The gesture has _sc_isActive set to");
94
+ });
95
+
96
+ // This method does nothing if _sc_isActive is already false.
97
+ test("Method: end (_sc_isActive === false)", function () {
98
+ var view = SC.View.create({
99
+
100
+ gestureEnd: function (theGesture) {
101
+ ok(true, 'called', 'called', "The method was");
102
+ }
103
+
104
+ });
105
+
106
+ gesture = gesture.create({
107
+ _sc_isActive: false,
108
+ view: view
109
+ });
110
+
111
+ gesture.end();
112
+
113
+ // Ensure 0 tests run.
114
+ expect(0);
115
+ });
116
+
117
+ // This method calls gestureName + 'Changed' on the view with the gesture and any given arguments.
118
+ test("Method: change (_sc_isActive === true)", function () {
119
+ var view = SC.View.create({
120
+
121
+ gestureChanged: function (arg1, arg2) {
122
+ ok(true, 'called', 'called', "The method was");
123
+ equals(arg1, 'a', "The first argument passed to start is passed to gestureChanged and is");
124
+ equals(arg2, 'b', "The second argument passed to start is passed to gestureChanged and is");
125
+ }
126
+
127
+ });
128
+
129
+ gesture = gesture.create({
130
+ _sc_isActive: true,
131
+ view: view
132
+ });
133
+
134
+ ok(gesture.change !== undefined, 'defined', 'defined', "The method is");
135
+
136
+ gesture.change('a', 'b');
137
+ });
138
+
139
+ // This method does nothing if _sc_isActive is already false.
140
+ test("Method: change (_sc_isActive === false)", function () {
141
+ var view = SC.View.create({
142
+
143
+ gestureChanged: function (theGesture) {
144
+ ok(true, 'called', 'called', "The method was");
145
+ }
146
+
147
+ });
148
+
149
+ gesture = gesture.create({
150
+ _sc_isActive: false,
151
+ view: view
152
+ });
153
+
154
+ gesture.change();
155
+
156
+ // Ensure 0 tests run.
157
+ expect(0);
158
+ });
159
+
160
+ // This method sets _sc_isActive to false and calls gestureName + 'Cancelled' on the view with the gesture and any given arguments.
161
+ test("Method: cancel (_sc_isActive === true)", function () {
162
+ var view = SC.View.create({
163
+
164
+ gestureCancelled: function (arg1, arg2) {
165
+ ok(true, 'called', 'called', "The method was");
166
+ equals(arg1, 'a', "The first argument passed to start is passed to gestureCancelled and is");
167
+ equals(arg2, 'b', "The second argument passed to start is passed to gestureCancelled and is");
168
+ }
169
+
170
+ });
171
+
172
+ gesture = gesture.create({
173
+ _sc_isActive: true,
174
+ view: view
175
+ });
176
+
177
+ ok(gesture.cancel !== undefined, 'defined', 'defined', "The method is");
178
+
179
+ gesture.cancel('a', 'b');
180
+
181
+ equals(gesture._sc_isActive, false, "The gesture has _sc_isActive set to");
182
+ });
183
+
184
+ // This method does nothing if _sc_isActive is already false.
185
+ test("Method: cancel (_sc_isActive === false)", function () {
186
+ var view = SC.View.create({
187
+
188
+ gestureCancelled: function (theGesture) {
189
+ ok(true, 'called', 'called', "The method was");
190
+ }
191
+
192
+ });
193
+
194
+ gesture = gesture.create({
195
+ _sc_isActive: false,
196
+ view: view
197
+ });
198
+
199
+ gesture.cancel();
200
+
201
+ // Ensure 0 tests run.
202
+ expect(0);
203
+ });
204
+
205
+ // This method calls gestureName on the view with the gesture and any given arguments.
206
+ test("Method: trigger (_sc_isActive === true)", function () {
207
+ var view = SC.View.create({
208
+
209
+ gesture: function (arg1, arg2) {
210
+ ok(true, 'called', 'called', "The method was");
211
+ equals(arg1, 'a', "The first argument passed to start is passed to gestureChanged and is");
212
+ equals(arg2, 'b', "The second argument passed to start is passed to gestureChanged and is");
213
+ }
214
+
215
+ });
216
+
217
+ gesture = gesture.create({
218
+ _sc_isActive: true,
219
+ view: view
220
+ });
221
+
222
+ ok(gesture.trigger !== undefined, 'defined', 'defined', "The method is");
223
+
224
+ gesture.trigger('a', 'b');
225
+ });
226
+
227
+ // This method does nothing if _sc_isActive is already false.
228
+ test("Method: trigger (_sc_isActive === false)", function () {
229
+ var view = SC.View.create({
230
+
231
+ gestureChanged: function (theGesture) {
232
+ ok(true, 'called', 'called', "The method was");
233
+ }
234
+
235
+ });
236
+
237
+ gesture = gesture.create({
238
+ _sc_isActive: false,
239
+ view: view
240
+ });
241
+
242
+ gesture.trigger();
243
+
244
+ // Ensure 0 tests run.
245
+ expect(0);
246
+ });
247
+
248
+ // This method does nothing.
249
+ test("Method: touchSessionStarted", function () {
250
+ gesture = gesture.create();
251
+
252
+ ok(gesture.touchSessionStarted !== undefined, 'defined', 'defined', "The method is");
253
+ equals(gesture.touchSessionStarted(), undefined, "The method returns");
254
+ });
@@ -256,6 +256,7 @@ SC.ContainerView = SC.View.extend(
256
256
  this.removeObserver('contentView', this, this._sc_contentViewDidChange);
257
257
 
258
258
  // Cancel any active transitions.
259
+ // Note: this will also destroy any content view that the container created.
259
260
  this._sc_cancelTransitions();
260
261
 
261
262
  // Remove our internal reference to the statecharts.
@@ -753,7 +753,7 @@ SC.TextFieldView = SC.FieldView.extend(SC.Editable,
753
753
  }
754
754
 
755
755
  if (!SC.none(autoCapitalize)) {
756
- if (SC.typeOf(autoCapitalize) == 'boolean') {
756
+ if (SC.typeOf(autoCapitalize) === 'boolean') {
757
757
  input.attr('autocapitalize', !autoCapitalize ? 'none' : 'sentences');
758
758
  } else {
759
759
  input.attr('autocapitalize', autoCapitalize);
@@ -0,0 +1,51 @@
1
+ /** @scope Object
2
+ Polyfill for Object.keys().
3
+
4
+ Supports using `Object.keys()` on browsers prior to the following:
5
+
6
+ * Chrome 5
7
+ * Firefox 4.0 (Gecko 2.0)
8
+ * Internet Explorer 9
9
+ * Opera 12
10
+ * Safari 5
11
+ */
12
+ // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
13
+ if (!Object.keys) {
14
+ Object.keys = (function() {
15
+ var hasOwnProperty = Object.prototype.hasOwnProperty,
16
+ hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
17
+ dontEnums = [
18
+ 'toString',
19
+ 'toLocaleString',
20
+ 'valueOf',
21
+ 'hasOwnProperty',
22
+ 'isPrototypeOf',
23
+ 'propertyIsEnumerable',
24
+ 'constructor'
25
+ ],
26
+ dontEnumsLength = dontEnums.length;
27
+
28
+ return function(obj) {
29
+ if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
30
+ throw new TypeError('Object.keys called on non-object');
31
+ }
32
+
33
+ var result = [], prop, i;
34
+
35
+ for (prop in obj) {
36
+ if (hasOwnProperty.call(obj, prop)) {
37
+ result.push(prop);
38
+ }
39
+ }
40
+
41
+ if (hasDontEnumBug) {
42
+ for (i = 0; i < dontEnumsLength; i++) {
43
+ if (hasOwnProperty.call(obj, dontEnums[i])) {
44
+ result.push(dontEnums[i]);
45
+ }
46
+ }
47
+ }
48
+ return result;
49
+ };
50
+ }());
51
+ }
@@ -1,6 +1,13 @@
1
1
  /** @scope window
2
- Polyfill for cross-browser backwards compatible window.requestAnimationFrame
3
- support.
2
+ Polyfill for cross-browser backwards compatible window.requestAnimationFrame support.
3
+
4
+ Supports using `window.requestAnimationFrame` on browsers prior to the following:
5
+
6
+ * Chrome 10
7
+ * Firefox 4.0 (Gecko 2.0)
8
+ * Internet Explorer 10.0
9
+ * Opera 15
10
+ * Safari 6.0
4
11
 
5
12
  Modified from Erik Möller:
6
13
  http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
@@ -8,7 +15,7 @@
8
15
  (function() {
9
16
  var lastTime = 0;
10
17
  var vendors = ['ms', 'moz', 'webkit', 'o'];
11
- for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
18
+ for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
12
19
  window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
13
20
  window.cancelRequestAnimationFrame = window[vendors[x]+
14
21
  'CancelRequestAnimationFrame'];
@@ -36,7 +36,7 @@ SC.AudioView = SC.View.extend(
36
36
  Audio view className.
37
37
  @type String
38
38
  */
39
- classNames: 'sc-audio-view',
39
+ classNames: ['sc-audio-view'],
40
40
 
41
41
  /**
42
42
  Properties that trigger a re render of the view. If the value changes, it
@@ -44,14 +44,13 @@ SC.AudioView = SC.View.extend(
44
44
 
45
45
  @type Array
46
46
  */
47
- displayProperties: ['value', 'shouldAutoResize'],
47
+ displayProperties: ['value'],
48
48
 
49
49
  /**
50
50
  Reference to the audio object once is created.
51
51
  @type Object
52
52
  */
53
-
54
- audioObject:null,
53
+ audioObject: null,
55
54
 
56
55
  /**
57
56
  Array containing the technologies and the order to load them depending
@@ -62,26 +61,19 @@ SC.AudioView = SC.View.extend(
62
61
  degradeList: ['html5','quicktime', 'flash'],
63
62
 
64
63
  /**
65
- Current time in secs
64
+ The current play time in seconds.
66
65
 
67
66
  @type Number
67
+ @default 0
68
68
  */
69
69
  currentTime : function(key, value) {
70
- if (!SC.empty(value) && this._currentTime != value) {
71
- this._currentTime = value;
70
+ /* jshint eqnull:true */
71
+ if (value != null) {
72
72
  this.seek(value);
73
73
  }
74
74
 
75
- return this._currentTime;
76
- }.property('_currentTime'),
77
-
78
- /**
79
- Current time in secs
80
-
81
- @type Number
82
- @private
83
- */
84
- _currentTime : 0,
75
+ return value == null ? 0 : value;
76
+ }.property().cacheable(),
85
77
 
86
78
  /**
87
79
  Duration in secs
@@ -113,7 +105,7 @@ SC.AudioView = SC.View.extend(
113
105
  @type Boolean
114
106
  */
115
107
 
116
- ended: NO, //did the audio finished playing
108
+ ended: NO, //did the audio finish playing
117
109
 
118
110
  /**
119
111
  Indicates if the audio is ready to be played.
@@ -144,6 +136,7 @@ SC.AudioView = SC.View.extend(
144
136
  */
145
137
  render: function(context, firstTime) {
146
138
  var i, j, listLen, pluginsLen, id = SC.guidFor(this);
139
+
147
140
  if(firstTime){
148
141
  for(i=0, listLen = this.degradeList.length; i<listLen; i++){
149
142
  switch(this.degradeList[i]){
@@ -267,7 +260,11 @@ SC.AudioView = SC.View.extend(
267
260
  this.set('ended', NO);
268
261
  this.set('canPlay', NO);
269
262
  this.set('loadedTimeRanges', []);
270
- this.replaceLayer();
263
+
264
+ // Re-render the entire layer.
265
+ if (this.get('_isRendered')) {
266
+ this.replaceLayer();
267
+ }
271
268
  }.observes('value'),
272
269
 
273
270
  /**
@@ -417,16 +414,14 @@ SC.AudioView = SC.View.extend(
417
414
 
418
415
  SC.Event.add(audioElem, 'qt_pause', this, function () {
419
416
  SC.run(function() {
420
- view._currentTime = media.GetTime() / media.GetTimeScale();
421
- view.propertyDidChange('currentTime');
417
+ view.set('currentTime', media.GetTime() / media.GetTimeScale());
422
418
  view.set('paused', YES);
423
419
  });
424
420
  });
425
421
 
426
422
  SC.Event.add(audioElem, 'qt_play', this, function () {
427
423
  SC.run(function() {
428
- view._currentTime = media.GetTime() / media.GetTimeScale();
429
- view.propertyDidChange('currentTime');
424
+ view.set('currentTime', media.GetTime() / media.GetTimeScale());
430
425
  view.set('paused', NO);
431
426
  });
432
427
  });
@@ -442,8 +437,7 @@ SC.AudioView = SC.View.extend(
442
437
  */
443
438
  _qtTimer:function(){
444
439
  if (this.loaded === 'quicktime' && !this.get('paused')) {
445
- this.incrementProperty('_currentTime');
446
- this.propertyDidChange('currentTime');
440
+ this.incrementProperty('currentTime');
447
441
  this.invokeLater(this._qtTimer, 1000);
448
442
  }
449
443
  }.observes('paused'),