sproutcore 1.10.0 → 1.10.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +8 -8
  2. data/VERSION.yml +1 -1
  3. data/bin/sc-phantom +13 -0
  4. data/lib/Buildfile +3 -0
  5. data/lib/buildtasks/manifest.rake +3 -0
  6. data/lib/frameworks/sproutcore/CHANGELOG.md +24 -1
  7. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +1 -0
  8. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +1 -1
  9. data/lib/frameworks/sproutcore/frameworks/designer/views/designer_drop_target.js +1 -2
  10. data/lib/frameworks/sproutcore/frameworks/designer/views/high_light.js +1 -2
  11. data/lib/frameworks/sproutcore/frameworks/designer/views/page_item_view.js +1 -2
  12. data/lib/frameworks/sproutcore/frameworks/designer/views/selection_handles.js +1 -2
  13. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +4 -3
  14. data/lib/frameworks/sproutcore/frameworks/desktop/resources/progress.css +4 -0
  15. data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +44 -35
  16. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +167 -91
  17. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/touch.js +215 -0
  18. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/grid/drag_and_drop.js +7 -2
  19. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/drag_and_drop.js +7 -1
  20. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/stacked/ui_comments.js +26 -24
  21. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +9 -18
  22. data/lib/frameworks/sproutcore/frameworks/desktop/views/grid.js +25 -20
  23. data/lib/frameworks/sproutcore/frameworks/desktop/views/list.js +29 -29
  24. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +107 -106
  25. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +120 -134
  26. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +14 -7
  27. data/lib/frameworks/sproutcore/frameworks/desktop/views/stacked.js +2 -1
  28. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/content_value_support.js +4 -4
  29. data/lib/frameworks/sproutcore/frameworks/foundation/system/module.js +197 -196
  30. data/lib/frameworks/sproutcore/frameworks/foundation/views/inline_text_field.js +7 -0
  31. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +22 -10
  32. data/lib/frameworks/sproutcore/frameworks/routing/tests/system/routes.js +43 -0
  33. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +1 -1
  34. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +2 -3
  35. data/lib/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +14 -14
  36. data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +90 -79
  37. data/lib/frameworks/sproutcore/frameworks/statechart/tests/event_handling/advanced/event_queuing.js +104 -0
  38. data/lib/frameworks/sproutcore/frameworks/table/views/table.js +3 -0
  39. data/lib/frameworks/sproutcore/frameworks/template_view/handlebars.js +2 -1
  40. data/lib/frameworks/sproutcore/themes/ace/resources/collection/normal/grid.css +17 -0
  41. data/lib/frameworks/sproutcore/themes/ace/resources/menu/menu.css +1 -0
  42. data/lib/frameworks/sproutcore/themes/ace/resources/menu/menu.png +0 -0
  43. data/lib/frameworks/sproutcore/themes/ace/resources/menu/menu@2x.png +0 -0
  44. data/lib/frameworks/sproutcore/themes/ace/resources/panel/panel.css +2 -2
  45. data/lib/frameworks/sproutcore/themes/empty_theme/theme.js +1 -1
  46. data/lib/sproutcore/tools.rb +2 -1
  47. data/lib/sproutcore/tools/phantom.rb +36 -0
  48. data/sproutcore.gemspec +1 -1
  49. data/vendor/chance/lib/chance/instance.rb +5 -2
  50. metadata +11 -4
@@ -0,0 +1,215 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2011 Strobe Inc. and contributors.
4
+ // portions copyright @2011 Apple Inc.
5
+ // License: Licensed under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ var view, content, contentController, pane, actionCalled = 0;
9
+
10
+ module("SC.CollectionView Touch Events", {
11
+ setup: function() {
12
+
13
+ SC.platform.simulateTouchEvents();
14
+
15
+ SC.RunLoop.begin();
16
+
17
+ content = "1 2 3 4 5 6 7 8 9 10".w().map(function(x) {
18
+ return SC.Object.create({ value: x });
19
+ });
20
+
21
+ contentController = SC.ArrayController.create({
22
+ content: content,
23
+ allowsMultipleSelection: YES
24
+ });
25
+
26
+ view = SC.CollectionView.create({
27
+ content: contentController,
28
+
29
+ layout: { top: 0, left: 0, width: 300, height: 500 },
30
+
31
+ layoutForContentIndex: function(idx) {
32
+ return { left: 0, right: 0, top: idx * 50, height: 50 };
33
+ },
34
+
35
+ isVisibleInWindow: YES,
36
+ acceptsFirstResponder: YES,
37
+ action: function() {
38
+ actionCalled++;
39
+ }
40
+ });
41
+
42
+ pane = SC.MainPane.create();
43
+ pane.appendChild(view);
44
+ pane.append();
45
+
46
+ SC.RunLoop.end();
47
+ },
48
+
49
+ teardown: function() {
50
+ SC.RunLoop.begin();
51
+ pane.remove();
52
+ actionCalled = 0;
53
+ SC.RunLoop.end();
54
+ }
55
+ });
56
+
57
+ /*
58
+ Simulates touching the specified index. If you pass verify as YES or NO
59
+ also verifies that the item view is subsequently selected or not.
60
+
61
+ @param {SC.CollectionView} view the view
62
+ @param {Number} index the index to touch on
63
+ @param {SC.SelectionSet} expected expected selection
64
+ @param {Number} delay delay before running the test (optional)
65
+ @returns {void}
66
+ */
67
+ function touchOn(view, index, expected, delay) {
68
+ var itemView = view.itemViewForContentIndex(index),
69
+ layer = itemView.get('layer'),
70
+ opts = {},
71
+ sel, ev, modifiers;
72
+
73
+ ok(layer, 'precond - itemView[%@] should have layer'.fmt(index));
74
+
75
+ ev = SC.Event.simulateEvent(layer, 'mousedown', opts);
76
+ SC.Event.trigger(layer, 'mousedown', [ev]);
77
+
78
+ ev = SC.Event.simulateEvent(layer, 'mouseup', opts);
79
+ SC.Event.trigger(layer, 'mouseup', [ev]);
80
+
81
+ if (expected !== undefined) {
82
+ var f = function() {
83
+ SC.RunLoop.begin();
84
+ sel = view.get('selection');
85
+
86
+ ok(expected ? expected.isEqual(sel) : expected === sel, 'should have selection: %@ after touch on item[%@], actual: %@'.fmt(expected, index, sel));
87
+ SC.RunLoop.end();
88
+ if (delay) window.start() ; // starts the test runner
89
+ };
90
+
91
+ if (delay) {
92
+ stop() ; // stops the test runner
93
+ setTimeout(f, delay) ;
94
+ } else f() ;
95
+ }
96
+
97
+ layer = itemView = null ;
98
+ }
99
+
100
+ /*
101
+ Creates an SC.SelectionSet from a given index.
102
+
103
+ @param {Number} index the index of the content to select
104
+ @returns {SC.SelectionSet}
105
+ */
106
+
107
+ function selectionFromIndex(index) {
108
+ var ret = SC.SelectionSet.create();
109
+ ret.addObject(content.objectAt(index));
110
+
111
+ return ret;
112
+ }
113
+
114
+ /*
115
+ Creates an SC.SelectionSet from a given SC.IndexSet.
116
+
117
+ @param {Number} index the index of the content to select
118
+ @returns {SC.SelectionSet}
119
+ */
120
+ function selectionFromIndexSet(indexSet) {
121
+ var ret = SC.SelectionSet.create();
122
+ ret.add(content, indexSet);
123
+
124
+ return ret;
125
+ }
126
+
127
+ // ..........................................................
128
+ // basic touch
129
+ //
130
+
131
+ test("touching an item should select it", function() {
132
+ touchOn(view, 3, selectionFromIndex(3));
133
+ });
134
+
135
+ test("touching a selected item should maintain it selected", function() {
136
+ view.select(SC.IndexSet.create(1,3));
137
+ touchOn(view, 3, selectionFromIndex(3));
138
+ });
139
+
140
+ test("touching two times on an item should select it", function() {
141
+ touchOn(view, 3);
142
+ touchOn(view, 3);
143
+ itemView = view.itemViewForContentIndex(3);
144
+ equals(itemView.get('isSelected'), YES, 'itemView.isSelected should remain YES after touched two times');
145
+ });
146
+
147
+ test("touching unselected item should clear selection and select it", function() {
148
+ view.select(SC.IndexSet.create(1,5));
149
+ touchOn(view, 7, selectionFromIndex(7));
150
+ });
151
+
152
+ test("first responder", function() {
153
+ touchOn(view, 3);
154
+ equals(view.get('isFirstResponder'), YES, 'view.isFirstResponder should be YES after touch start');
155
+ });
156
+
157
+ test("touching a collection view with null content should not throw an error", function() {
158
+ var failed = NO;
159
+ view.set('content', null);
160
+ try {
161
+ var l = view.get('layer'),
162
+ evt = SC.Event.simulateEvent(l, 'mousedown');
163
+ SC.Event.trigger(l, 'mousedown', [evt]);
164
+ }
165
+ catch (e) { failed = YES; }
166
+ ok(!failed, "touching a collection view with null content should not throw an error");
167
+ });
168
+
169
+ test("touching an item should select it when useToggleSelection is true", function() {
170
+ view.set('useToggleSelection', YES);
171
+ touchOn(view, 3, selectionFromIndex(3));
172
+ });
173
+
174
+ test("touching an unselected item should select it when useToggleSelection is true", function() {
175
+ view.set('useToggleSelection', YES);
176
+ touchOn(view, 3, selectionFromIndex(3));
177
+ });
178
+
179
+ test("touching a selected item should deselect it when useToggleSelection is true", function() {
180
+ view.set('useToggleSelection', YES);
181
+ view.select(SC.IndexSet.create(3,1));
182
+ touchOn(view, 3, SC.SelectionSet.create());
183
+ });
184
+
185
+ test("touching a selected item should remove it from the selection when useToggleSelection is true", function() {
186
+ view.set('useToggleSelection', YES);
187
+ view.select(SC.IndexSet.create(1,5));
188
+ touchOn(view, 5, selectionFromIndexSet(SC.IndexSet.create(1,4)));
189
+ });
190
+
191
+ test("touching an unselected item should select it and clear the previous selection when useToggleSelection is true and allowsMultipleSelection is not", function() {
192
+ view.set('useToggleSelection', YES);
193
+ contentController.set('allowsMultipleSelection', NO);
194
+ touchOn(view, 1, selectionFromIndex(1));
195
+ touchOn(view, 3, selectionFromIndex(3));
196
+ });
197
+
198
+ test("touching an unselected item should fire action when useToggleSelection is true and actOnSelect is true", function() {
199
+ view.set('useToggleSelection', YES);
200
+ view.set('actOnSelect', YES);
201
+
202
+ equals(actionCalled, 0, "precond - action hasn't been called");
203
+ touchOn(view, 1);
204
+ equals(actionCalled, 1, "Action called when item is selected");
205
+ });
206
+
207
+ test("touching an item when isSelectable is false doesn't do anything", function() {
208
+ view.set('isSelectable', NO);
209
+ touchOn(view, 1, null);
210
+ });
211
+
212
+ test("touching an item when isEnabled is false doesn't do anything", function() {
213
+ view.set('isEnabled', NO);
214
+ touchOn(view, 1, null);
215
+ });
@@ -44,7 +44,12 @@ var pane = SC.ControlTestPane.design()
44
44
  contentValueKey: "title",
45
45
  contentCheckboxKey: "isDone",
46
46
  contentUnreadCountKey: "unread",
47
- rowHeight: 20
47
+ rowHeight: 20,
48
+ _didCallDragEnded: false,
49
+ dragEnded: function() {
50
+ sc_super();
51
+ this._didCallDragEnded = true;
52
+ }
48
53
  })
49
54
  }));
50
55
 
@@ -200,7 +205,6 @@ test("insertion point when cancel drag on grid view", function() {
200
205
  layer,
201
206
  gridView = pane.view("basic").get('contentView');
202
207
 
203
- // Configure the view to accept drop on.
204
208
  gridView.set('canReorderContent', YES);
205
209
 
206
210
  itemView = gridView.itemViewForContentIndex(0);
@@ -233,6 +237,7 @@ test("insertion point when cancel drag on grid view", function() {
233
237
  SC.Event.trigger(layer, 'keydown', [ev]);
234
238
 
235
239
  equals(gridView._insertionPointView, null, "The insertion point should have been destroyed");
240
+ equals(gridView._didCallDragEnded, true, "dragEnded should have been call");
236
241
 
237
242
  start();
238
243
  };
@@ -44,7 +44,12 @@ var pane = SC.ControlTestPane.design()
44
44
  contentValueKey: "title",
45
45
  contentCheckboxKey: "isDone",
46
46
  contentUnreadCountKey: "unread",
47
- rowHeight: 20
47
+ rowHeight: 20,
48
+ _didCallDragEnded: false,
49
+ dragEnded: function() {
50
+ sc_super();
51
+ this._didCallDragEnded = true;
52
+ }
48
53
  })
49
54
  }));
50
55
 
@@ -225,6 +230,7 @@ test("insertion point when cancel drag on list view", function() {
225
230
  SC.Event.trigger(layer, 'keydown', [ev]);
226
231
 
227
232
  equals(listView._insertionPointView, null, "The insertion point should have been destroyed");
233
+ equals(listView._didCallDragEnded, true, "dragEnded should have been call");
228
234
 
229
235
  window.start();
230
236
  };
@@ -4,6 +4,7 @@
4
4
  // portions copyright @2011 Apple Inc.
5
5
  // License: Licensed under MIT license (see license.js)
6
6
  // ==========================================================================
7
+ /*global module, test, ok, equals, htmlbody, clearHtmlbody */
7
8
 
8
9
  /* Test SC.StackedView with a Comments example. */
9
10
 
@@ -27,7 +28,7 @@ var CommentView = SC.View.extend(SC.Control, {
27
28
 
28
29
  contentCommentKey: 'comment',
29
30
 
30
- contentPropertyDidChange: function(target, key) {
31
+ contentPropertyDidChange: function (target, key) {
31
32
 
32
33
  // update everything!
33
34
  if (key === '*') {
@@ -41,16 +42,17 @@ var CommentView = SC.View.extend(SC.Control, {
41
42
  if (this.owner && this.owner.updateHeight) this.owner.updateHeight();
42
43
  },
43
44
 
44
- updateFromLabel: function() {
45
+ updateFromLabel: function () {
45
46
  var content = this.get('content'),
46
47
  from = content ? content.get('from') : 'Anonymous',
47
48
  date = content ? content.get('date') : 'some date',
48
49
  str = "%@ wrote %@: ".fmt(from, date);
49
50
  this.fromLabel.set('value', str);
50
- return this ;
51
+
52
+ return this;
51
53
  },
52
54
 
53
- updateCommentLabel: function() {
55
+ updateCommentLabel: function () {
54
56
  var content = this.get('content'),
55
57
  comment = content ? content.get('comment') : '(No Comment)';
56
58
  this.commentLabel.set('value', comment);
@@ -122,7 +124,7 @@ var extra = SC.Object.create({
122
124
 
123
125
  var pane = SC.ControlTestPane.design()
124
126
  .add("basic", SC.StackedView, {
125
- layout: { top: 0, left: 0, right: 0, height: 600 },
127
+ layout: { top: 0, left: 0, right: 0 },
126
128
  content: content,
127
129
  exampleView: CommentView
128
130
  });
@@ -131,7 +133,7 @@ var pane = SC.ControlTestPane.design()
131
133
  // BASIC TESTS
132
134
  //
133
135
  module("Basic Tests", {
134
- setup: function(){
136
+ setup: function () {
135
137
  htmlbody(["<style>",
136
138
  '.sc-stacked-view { border-bottom: 1px red solid; }',
137
139
  '.comment-view.sel { background-color: #ccc; }',
@@ -140,20 +142,20 @@ module("Basic Tests", {
140
142
  '</style>'].join("\n"));
141
143
  pane.standardSetup().setup();
142
144
  },
143
- teardown: function(){
145
+ teardown: function () {
144
146
  pane.standardSetup().teardown();
145
147
  clearHtmlbody();
146
148
  }
147
149
  });
148
150
 
149
- test("removing an item should delete childView and adjust height", function() {
151
+ test("removing an item should delete childView and adjust height", function () {
150
152
  var view = pane.view('basic'),
151
153
  item = content[0];
152
154
 
153
155
  equals(view.getPath('childViews.length'), content.length, 'precond - should have child views equal to current content');
154
156
  var oldHeight = view.get('frame').height; // save height.
155
157
 
156
- SC.run(function() { content.removeAt(0); }); // remove first item
158
+ SC.run(function () { content.removeAt(0); }); // remove first item
157
159
 
158
160
 
159
161
  equals(view.getPath('childViews.length'), content.length, 'view should remove childView for removed content items');
@@ -161,20 +163,20 @@ test("removing an item should delete childView and adjust height", function() {
161
163
  ok(newHeight < oldHeight, 'view height should adjust to reflect new content. (old height: %@ current height: %@)'.fmt(oldHeight, newHeight));
162
164
 
163
165
  // restore old content
164
- SC.run(function() { content.insertAt(0, item); });
166
+ SC.run(function () { content.insertAt(0, item); });
165
167
 
166
168
  });
167
169
 
168
- window.content = content ;
170
+ window.content = content;
169
171
 
170
- test("inserting an item should add childView and adjust height", function() {
172
+ test("inserting an item should add childView and adjust height", function () {
171
173
  var view = pane.view('basic'),
172
174
  item = extra; // we will insert another one
173
175
 
174
176
  equals(view.getPath('childViews.length'), content.length, 'precond - should have child views equal to current content');
175
177
  var oldHeight = view.get('frame').height; // save height.
176
178
 
177
- SC.run(function() { content.pushObject(item); }); // add another item
179
+ SC.run(function () { content.pushObject(item); }); // add another item
178
180
 
179
181
 
180
182
  equals(view.getPath('childViews.length'), content.length, 'view should add childView for added content item');
@@ -182,11 +184,11 @@ test("inserting an item should add childView and adjust height", function() {
182
184
  ok(newHeight > oldHeight, 'view height should adjust to reflect new content. (old height: %@ current height: %@)'.fmt(oldHeight, newHeight));
183
185
 
184
186
  // restore
185
- SC.run(function() { content.popObject(); });
187
+ SC.run(function () { content.popObject(); });
186
188
  });
187
189
 
188
190
 
189
- test("editing an item should automatically adjust the height", function() {
191
+ test("editing an item should automatically adjust the height", function () {
190
192
  var view = pane.view('basic'),
191
193
  item = content[0],
192
194
  childView = view.childViews[0],
@@ -198,7 +200,7 @@ test("editing an item should automatically adjust the height", function() {
198
200
  var height = view.get('frame').height; // save old height
199
201
 
200
202
  // change comment
201
- SC.run(function() { item.set('comment', 'This is a new comment'); });
203
+ SC.run(function () { item.set('comment', 'This is a new comment'); });
202
204
 
203
205
  // should have updated UI and adjusted height of collection
204
206
  equals(childView.$().find('p').text(), 'This is a new comment', 'Item view should now contain comment');
@@ -207,7 +209,7 @@ test("editing an item should automatically adjust the height", function() {
207
209
  ok(newHeight < height, 'view height should adjust to reflect new content. (old height: %@ current height: %@)'.fmt(height, newHeight));
208
210
 
209
211
  // restore
210
- SC.run(function() { item.set('comment', old); });
212
+ SC.run(function () { item.set('comment', old); });
211
213
 
212
214
  newHeight = view.get('frame').height;
213
215
  equals(newHeight, height, 'view height should restore to old height when content is edited again. (old height: %@ current height: %@)'.fmt(height, newHeight));
@@ -220,20 +222,20 @@ test("editing an item should automatically adjust the height", function() {
220
222
 
221
223
  // tests specific bug where a series of many edits strung together would
222
224
  // cause the height to get out of sync.
223
- test("adding, removing then editing items should still keep height the same", function() {
225
+ test("adding, removing then editing items should still keep height the same", function () {
224
226
 
225
227
  var view = pane.view('basic'),
226
228
  item = content[0],
227
229
  old = item.get('comment'),
228
230
  height = view.get('frame').height; // save old height
229
231
 
230
- SC.run(function() { content.removeAt(0); });
231
- SC.run(function() { content.insertAt(0, item); });
232
- SC.run(function() { content.pushObject(extra); });
233
- SC.run(function() { content.popObject(); });
232
+ SC.run(function () { content.removeAt(0); });
233
+ SC.run(function () { content.insertAt(0, item); });
234
+ SC.run(function () { content.pushObject(extra); });
235
+ SC.run(function () { content.popObject(); });
234
236
 
235
- SC.run(function() { item.set('comment', 'Short comment'); });
236
- SC.run(function() { item.set('comment', old); });
237
+ SC.run(function () { item.set('comment', 'Short comment'); });
238
+ SC.run(function () { item.set('comment', old); });
237
239
 
238
240
  var newHeight = view.get('frame').height;
239
241
  equals(newHeight, height, 'view height should restore to old height when content is edited again. (old height: %@ current height: %@)'.fmt(height, newHeight));
@@ -2291,26 +2291,26 @@ SC.CollectionView = SC.View.extend(SC.CollectionViewDelegate, SC.CollectionConte
2291
2291
  // var itemView = this.itemViewForEvent(touch),
2292
2292
  var itemView = this._touchSelectedView,
2293
2293
  contentIndex = itemView ? itemView.get('contentIndex') : -1,
2294
- isSelected = NO, sel;
2294
+ isSelected = NO, sel, shouldSelect;
2295
2295
 
2296
2296
  if (!this.get('isEnabledInPane')) return contentIndex > -1;
2297
2297
 
2298
- // Remove fake selection in case our contentIndex is -1, a select event will add it back
2299
- if (itemView) { itemView.set('isSelected', NO); }
2300
-
2301
2298
  if (contentIndex > -1) {
2302
2299
  if (this.get('useToggleSelection')) {
2303
2300
  sel = this.get('selection');
2304
2301
  isSelected = sel && sel.containsObject(itemView.get('content'));
2302
+ shouldSelect = !isSelected;
2305
2303
  }
2304
+ else
2305
+ shouldSelect = true;
2306
2306
 
2307
- if (isSelected) {
2308
- this.deselect(contentIndex);
2309
- } else {
2307
+ if (shouldSelect) {
2310
2308
  this.select(contentIndex, NO);
2311
2309
 
2312
2310
  // If actOnSelect is implemented, the action will be fired.
2313
2311
  this._cv_performSelectAction(itemView, touch, 0);
2312
+ } else {
2313
+ this.deselect(contentIndex);
2314
2314
  }
2315
2315
  }
2316
2316
 
@@ -2779,15 +2779,6 @@ SC.CollectionView = SC.View.extend(SC.CollectionViewDelegate, SC.CollectionConte
2779
2779
  return (dragOp & SC.DRAG_REORDER) ? SC.DRAG_MOVE : dragOp;
2780
2780
  },
2781
2781
 
2782
- /**
2783
- Implements the SC.DropTarget protocol. Hides any visible insertion
2784
- point and clears some cached values.
2785
- */
2786
- dragExited: function () {
2787
- this.hideInsertionPoint();
2788
- this._lastInsertionIndex = this._lastDropOperation = null;
2789
- },
2790
-
2791
2782
  /**
2792
2783
  Implements the SC.DropTarget protocol. Hides any visible insertion
2793
2784
  point and clears some cached values.
@@ -2963,8 +2954,8 @@ SC.CollectionView = SC.View.extend(SC.CollectionViewDelegate, SC.CollectionConte
2963
2954
  // in-scroll clipping frame when it does).
2964
2955
  // TODO: perform a raw update that doesn't require the run loop.
2965
2956
  SC.run(function () {
2966
- this.notifyPropertyChange('nowShowing');
2967
- this.invokeOnce('_cv_nowShowingDidChange');
2957
+ this.notifyPropertyChange('nowShowing');
2958
+ this.invokeOnce('_cv_nowShowingDidChange');
2968
2959
  }, this);
2969
2960
 
2970
2961
  // Track the last time we updated.