sproutcore 1.11.0.rc3 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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'),