Skip to content

Commit c77eb92

Browse files
committed
[BUGFIX beta] Don't use prototype extensions ({add,remove}ArrayObserver)
Do not use prototype extensions for `addArrayObserver` and `removeArrayObserver`. Related to #9269 and #10899.
1 parent 58f5a9a commit c77eb92

File tree

6 files changed

+49
-21
lines changed

6 files changed

+49
-21
lines changed

packages/ember-extension-support/lib/data_adapter.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ import EmberObject from 'ember-runtime/system/object';
66
import { A as emberA } from 'ember-runtime/system/native_array';
77
import Application from 'ember-application/system/application';
88
import { getOwner } from 'container/owner';
9-
import { objectAt } from 'ember-runtime/mixins/array';
9+
import {
10+
addArrayObserver,
11+
removeArrayObserver,
12+
objectAt
13+
} from 'ember-runtime/mixins/array';
1014

1115
/**
1216
@module ember
@@ -219,11 +223,11 @@ export default EmberObject.extend({
219223
};
220224

221225
var observer = { didChange: contentDidChange, willChange() { return this; } };
222-
records.addArrayObserver(this, observer);
226+
addArrayObserver(records, this, observer);
223227

224228
release = () => {
225229
releaseMethods.forEach(function(fn) { fn(); });
226-
records.removeArrayObserver(this, observer);
230+
removeArrayObserver(records, this, observer);
227231
this.releaseMethods.removeObject(release);
228232
};
229233

@@ -298,10 +302,10 @@ export default EmberObject.extend({
298302
willChange() { return this; }
299303
};
300304

301-
records.addArrayObserver(this, observer);
305+
addArrayObserver(records, this, observer);
302306

303307
var release = () => {
304-
records.removeArrayObserver(this, observer);
308+
removeArrayObserver(records, this, observer);
305309
};
306310

307311
return release;

packages/ember-runtime/lib/mixins/array.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ function arrayObserversHelper(obj, target, opts, operation, notify) {
4747
return obj;
4848
}
4949

50+
export function addArrayObserver(array, target, opts) {
51+
return arrayObserversHelper(array, target, opts, addListener, false);
52+
}
53+
54+
export function removeArrayObserver(array, target, opts) {
55+
return arrayObserversHelper(array, target, opts, removeListener, true);
56+
}
57+
5058
export function objectAt(content, idx) {
5159
if (content.objectAt) {
5260
return content.objectAt(idx);
@@ -364,7 +372,7 @@ export default Mixin.create(Enumerable, {
364372
*/
365373

366374
addArrayObserver(target, opts) {
367-
return arrayObserversHelper(this, target, opts, addListener, false);
375+
return addArrayObserver(this, target, opts);
368376
},
369377

370378
/**
@@ -380,7 +388,7 @@ export default Mixin.create(Enumerable, {
380388
@public
381389
*/
382390
removeArrayObserver(target, opts) {
383-
return arrayObserversHelper(this, target, opts, removeListener, true);
391+
return removeArrayObserver(this, target, opts);
384392
},
385393

386394
/**

packages/ember-runtime/lib/system/array_proxy.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ import EmberObject from 'ember-runtime/system/object';
1717
import MutableArray from 'ember-runtime/mixins/mutable_array';
1818
import Enumerable from 'ember-runtime/mixins/enumerable';
1919
import alias from 'ember-metal/alias';
20-
import { objectAt } from 'ember-runtime/mixins/array';
20+
import {
21+
addArrayObserver,
22+
removeArrayObserver,
23+
objectAt
24+
} from 'ember-runtime/mixins/array';
2125

2226
/**
2327
@module ember
@@ -140,7 +144,7 @@ var ArrayProxy = EmberObject.extend(MutableArray, {
140144
var content = get(this, 'content');
141145

142146
if (content) {
143-
content.removeArrayObserver(this, {
147+
removeArrayObserver(content, this, {
144148
willChange: 'contentArrayWillChange',
145149
didChange: 'contentArrayDidChange'
146150
});
@@ -193,7 +197,7 @@ var ArrayProxy = EmberObject.extend(MutableArray, {
193197
if (content) {
194198
assert(`ArrayProxy expects an Array or Ember.ArrayProxy, but you passed ${typeof content}`, isArray(content) || content.isDestroyed);
195199

196-
content.addArrayObserver(this, {
200+
addArrayObserver(content, this, {
197201
willChange: 'contentArrayWillChange',
198202
didChange: 'contentArrayDidChange'
199203
});
@@ -229,7 +233,7 @@ var ArrayProxy = EmberObject.extend(MutableArray, {
229233
assert(`ArrayProxy expects an Array or Ember.ArrayProxy, but you passed ${typeof arrangedContent}`,
230234
isArray(arrangedContent) || arrangedContent.isDestroyed);
231235

232-
arrangedContent.addArrayObserver(this, {
236+
addArrayObserver(arrangedContent, this, {
233237
willChange: 'arrangedContentArrayWillChange',
234238
didChange: 'arrangedContentArrayDidChange'
235239
});
@@ -240,7 +244,7 @@ var ArrayProxy = EmberObject.extend(MutableArray, {
240244
var arrangedContent = get(this, 'arrangedContent');
241245

242246
if (arrangedContent) {
243-
arrangedContent.removeArrayObserver(this, {
247+
removeArrayObserver(arrangedContent, this, {
244248
willChange: 'arrangedContentArrayWillChange',
245249
didChange: 'arrangedContentArrayDidChange'
246250
});

packages/ember-runtime/tests/mixins/array_test.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ import { computed } from 'ember-metal/computed';
66
import { testBoth } from 'ember-metal/tests/props_helper';
77
import { ArrayTests } from 'ember-runtime/tests/suites/array';
88
import EmberObject from 'ember-runtime/system/object';
9-
import EmberArray, { objectAt } from 'ember-runtime/mixins/array';
9+
import EmberArray, {
10+
addArrayObserver,
11+
removeArrayObserver,
12+
objectAt
13+
} from 'ember-runtime/mixins/array';
1014
import { A as emberA } from 'ember-runtime/system/native_array';
1115

1216
/*
@@ -199,7 +203,7 @@ QUnit.module('notify array observers', {
199203
_after: null
200204
});
201205

202-
obj.addArrayObserver(observer);
206+
addArrayObserver(obj, observer);
203207
},
204208

205209
teardown() {
@@ -233,7 +237,7 @@ QUnit.test('should notify when called with diff length items', function() {
233237
});
234238

235239
QUnit.test('removing enumerable observer should disable', function() {
236-
obj.removeArrayObserver(observer);
240+
removeArrayObserver(obj, observer);
237241
obj.arrayContentWillChange();
238242
deepEqual(observer._before, null);
239243

packages/ember-runtime/tests/suites/array.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,20 @@ import {
55
import indexOfTests from 'ember-runtime/tests/suites/array/indexOf';
66
import lastIndexOfTests from 'ember-runtime/tests/suites/array/lastIndexOf';
77
import objectAtTests from 'ember-runtime/tests/suites/array/objectAt';
8+
import {
9+
addArrayObserver,
10+
removeArrayObserver
11+
} from 'ember-runtime/mixins/array';
812

913
var ObserverClass = EnumerableTestsObserverClass.extend({
1014

1115
observeArray(obj) {
12-
obj.addArrayObserver(this);
16+
addArrayObserver(obj, this);
1317
return this;
1418
},
1519

1620
stopObserveArray(obj) {
17-
obj.removeArrayObserver(this);
21+
removeArrayObserver(obj, this);
1822
return this;
1923
},
2024

packages/ember-views/lib/views/collection_view.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ import Ember from 'ember-metal/core';
77
import { assert, deprecate } from 'ember-metal/debug';
88
import ContainerView from 'ember-views/views/container_view';
99
import View from 'ember-views/views/view';
10-
import EmberArray, { objectAt } from 'ember-runtime/mixins/array';
10+
import EmberArray, {
11+
addArrayObserver,
12+
removeArrayObserver,
13+
objectAt
14+
} from 'ember-runtime/mixins/array';
1115
import { get } from 'ember-metal/property_get';
1216
import { set } from 'ember-metal/property_set';
1317
import { computed } from 'ember-metal/computed';
@@ -224,7 +228,7 @@ var CollectionView = ContainerView.extend(EmptyViewSupport, {
224228
*/
225229
_contentDidChange: observer('content', function() {
226230
var prevContent = this._prevContent;
227-
if (prevContent) { prevContent.removeArrayObserver(this); }
231+
if (prevContent) { removeArrayObserver(prevContent, this); }
228232
var len = prevContent ? get(prevContent, 'length') : 0;
229233
this.arrayWillChange(prevContent, 0, len);
230234

@@ -233,7 +237,7 @@ var CollectionView = ContainerView.extend(EmptyViewSupport, {
233237
if (content) {
234238
this._prevContent = content;
235239
this._assertArrayLike(content);
236-
content.addArrayObserver(this);
240+
addArrayObserver(content, this);
237241
}
238242

239243
len = content ? get(content, 'length') : 0;
@@ -260,7 +264,7 @@ var CollectionView = ContainerView.extend(EmptyViewSupport, {
260264
if (!this._super(...arguments)) { return; }
261265

262266
var content = get(this, 'content');
263-
if (content) { content.removeArrayObserver(this); }
267+
if (content) { removeArrayObserver(content, this); }
264268

265269
if (this._createdEmptyView) {
266270
this._createdEmptyView.destroy();

0 commit comments

Comments
 (0)