Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[CLEANUP beta] Remove unused private listener methods #16162

Merged
merged 3 commits into from
Jan 22, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 0 additions & 83 deletions packages/ember-metal/lib/events.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,65 +100,6 @@ export function removeListener(obj, eventName, target, method) {
metaFor(obj).removeFromListeners(eventName, target, method, func);
}

/**
Suspend listener during callback.

This should only be used by the target of the event listener
when it is taking an action that would cause the event, e.g.
an object might suspend its property change listener while it is
setting that property.

@method suspendListener
@static
@for @ember/object/events

@private
@param obj
@param {String} eventName
@param {Object|Function} target A target object or a function
@param {Function|String} method A function or the name of a function to be called on `target`
@param {Function} callback
*/
export function suspendListener(obj, eventName, target, method, callback) {
return suspendListeners(obj, [eventName], target, method, callback);
}

/**
Suspends multiple listeners during a callback.

@method suspendListeners
@static
@for @ember/object/events

@private
@param obj
@param {Array} eventNames Array of event names
@param {Object|Function} target A target object or a function
@param {Function|String} method A function or the name of a function to be called on `target`
@param {Function} callback
*/
export function suspendListeners(obj, eventNames, target, method, callback) {
if (!method && 'function' === typeof target) {
method = target;
target = null;
}
return metaFor(obj).suspendListeners(eventNames, target, method, callback);
}

/**
Return a list of currently watched events

@private
@method watchedEvents
@static
@for @ember/object/events
@param obj
*/
export function watchedEvents(obj) {
let meta = peekMeta(obj);
return meta !== undefined ? meta.watchedEvents() : [];
}

/**
Send an event. The execution of suspended listeners
is skipped, and once listeners are removed. A listener without
Expand Down Expand Up @@ -227,30 +168,6 @@ export function hasListeners(obj, eventName) {
return matched !== undefined && matched.length > 0;
}

/**
@private
@method listenersFor
@static
@for @ember/object/events
@param obj
@param {String} eventName
*/
export function listenersFor(obj, eventName) {
let ret = [];
let meta = peekMeta(obj);
let actions = meta !== undefined ? meta.matchingListeners(eventName) : undefined;

if (actions === undefined) { return ret; }

for (let i = 0; i < actions.length; i += 3) {
let target = actions[i];
let method = actions[i + 1];
ret.push([target, method]);
}

return ret;
}

/**
Define a property as a function that should be executed when
a specified event or events are triggered.
Expand Down
9 changes: 1 addition & 8 deletions packages/ember-metal/lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,9 @@ export {
export {
addListener,
hasListeners,
listenersFor,
on,
removeListener,
sendEvent,
suspendListener,
suspendListeners,
watchedEvents
sendEvent
} from './events';

export { default as isNone } from './is_none';
Expand Down Expand Up @@ -100,10 +96,7 @@ export { default as setProperties } from './set_properties';
export { default as expandProperties } from './expand_properties';

export {
_suspendObserver,
_suspendObservers,
addObserver,
observersFor,
removeObserver,
_addBeforeObserver,
_removeBeforeObserver
Expand Down
1 change: 0 additions & 1 deletion packages/ember-metal/lib/meta.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ export class Meta {

this._listeners = undefined;
this._listenersFinalized = false;
this._suspendedListeners = undefined;
}

isInitialized(obj) {
Expand Down
51 changes: 0 additions & 51 deletions packages/ember-metal/lib/meta_listeners.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,58 +80,7 @@ export const protoMethods = {
if (pointer._listenersFinalized) { break; }
pointer = pointer.parent;
}
let sus = this._suspendedListeners;
if (sus !== undefined && result !== undefined) {
for (let susIndex = 0; susIndex < sus.length; susIndex += 3) {
if (eventName === sus[susIndex]) {
for (let resultIndex = 0; resultIndex < result.length; resultIndex += 3) {
if (result[resultIndex] === sus[susIndex + 1] && result[resultIndex + 1] === sus[susIndex + 2]) {
result[resultIndex + 2] |= SUSPENDED;
}
}
}
}
}
return result;
},

suspendListeners(eventNames, target, method, callback) {
let sus = this._suspendedListeners;
if (sus === undefined) {
sus = this._suspendedListeners = [];
}
for (let i = 0; i < eventNames.length; i++) {
sus.push(eventNames[i], target, method);
}
try {
return callback.call(target);
} finally {
if (sus.length === eventNames.length) {
this._suspendedListeners = undefined;
} else {
for (let i = sus.length - 3; i >= 0; i -= 3) {
if (sus[i + 1] === target && sus[i + 2] === method && eventNames.indexOf(sus[i]) !== -1) {
sus.splice(i, 3);
}
}
}
}
},

watchedEvents() {
let pointer = this;
let names = {};
while (pointer !== undefined) {
let listeners = pointer._listeners;
if (listeners !== undefined) {
for (let index = 0; index < listeners.length; index += 4) {
names[listeners[index]] = true;
}
}
if (pointer._listenersFinalized) { break; }
pointer = pointer.parent;
}
return Object.keys(names);
}
};

Expand Down
22 changes: 1 addition & 21 deletions packages/ember-metal/lib/observer.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,8 @@ import {
unwatch
} from './watching';
import {
listenersFor,
addListener,
removeListener,
suspendListeners,
suspendListener
removeListener
} from './events';
/**
@module @ember/object
Expand Down Expand Up @@ -41,10 +38,6 @@ export function addObserver(obj, _path, target, method) {
return this;
}

export function observersFor(obj, path) {
return listenersFor(obj, changeEvent(path));
}

/**
@method removeObserver
@static
Expand Down Expand Up @@ -80,19 +73,6 @@ export function _addBeforeObserver(obj, path, target, method) {
return this;
}

// Suspend observer during callback.
//
// This should only be used by the target of the observer
// while it is setting the observed path.
export function _suspendObserver(obj, path, target, method, callback) {
return suspendListener(obj, changeEvent(path), target, method, callback);
}

export function _suspendObservers(obj, paths, target, method, callback) {
let events = paths.map(changeEvent);
return suspendListeners(obj, events, target, method, callback);
}

/**
@method removeBeforeObserver
@static
Expand Down
71 changes: 0 additions & 71 deletions packages/ember-metal/tests/events_test.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
import {
Mixin,
meta,
on,
addListener,
removeListener,
suspendListener,
suspendListeners,
sendEvent,
hasListeners
} from '..';
Expand Down Expand Up @@ -81,42 +78,6 @@ QUnit.test('adding a listener with a target should invoke with target', function
assert.equal(target.count, 1, 'should invoke');
});

QUnit.test('suspending a listener should not invoke during callback', function(assert) {
let obj = {};
let target, otherTarget;

target = {
count: 0,
method() { this.count++; }
};

otherTarget = {
count: 0,
method() { this.count++; }
};

addListener(obj, 'event!', target, target.method);
addListener(obj, 'event!', otherTarget, otherTarget.method);

function callback() {
/*jshint validthis:true */
assert.equal(this, target);

sendEvent(obj, 'event!');

return 'result';
}

sendEvent(obj, 'event!');

assert.equal(suspendListener(obj, 'event!', target, target.method, callback), 'result');

sendEvent(obj, 'event!');

assert.equal(target.count, 2, 'should invoke');
assert.equal(otherTarget.count, 3, 'should invoke');
});

QUnit.test('adding a listener with string method should lookup method on event delivery', function(assert) {
let obj = {};
let target;
Expand Down Expand Up @@ -185,38 +146,6 @@ QUnit.test('calling removeListener without method should remove all listeners',
assert.equal(hasListeners(obj, 'event!'), false, 'has no more listeners');
});

QUnit.test('while suspended, it should not be possible to add a duplicate listener', function(assert) {
let obj = {};
let target;

target = {
count: 0,
method() { this.count++; }
};

addListener(obj, 'event!', target, target.method);

function callback() {
addListener(obj, 'event!', target, target.method);
}

sendEvent(obj, 'event!');

suspendListener(obj, 'event!', target, target.method, callback);

assert.equal(target.count, 1, 'should invoke');
assert.equal(meta(obj).matchingListeners('event!').length, 3, 'a duplicate listener wasn\'t added');

// now test suspendListeners...

sendEvent(obj, 'event!');

suspendListeners(obj, ['event!'], target, target.method, callback);

assert.equal(target.count, 2, 'should have invoked again');
assert.equal(meta(obj).matchingListeners('event!').length, 3, 'a duplicate listener wasn\'t added');
});

QUnit.test('a listener can be added as part of a mixin', function(assert) {
let triggered = 0;
let MyMixin = Mixin.create({
Expand Down
Loading