fix(animations): only process element nodes through the animation engine (#15268)

Closes #15267
Closes #15268

PR Close #15268
This commit is contained in:
Matias Niemelä 2017-03-17 21:05:42 -07:00 committed by Miško Hevery
parent bcc29ffdd1
commit 80075afe8a
4 changed files with 37 additions and 5 deletions

View File

@ -67,11 +67,18 @@ export class DomAnimationEngine {
} }
onInsert(element: any, domFn: () => any): void { onInsert(element: any, domFn: () => any): void {
if (element['nodeType'] == 1) {
this._flaggedInserts.add(element); this._flaggedInserts.add(element);
}
domFn(); domFn();
} }
onRemove(element: any, domFn: () => any): void { onRemove(element: any, domFn: () => any): void {
if (element['nodeType'] != 1) {
domFn();
return;
}
let lookupRef = this._elementTriggerStates.get(element); let lookupRef = this._elementTriggerStates.get(element);
if (lookupRef) { if (lookupRef) {
const possibleTriggers = Object.keys(lookupRef); const possibleTriggers = Object.keys(lookupRef);

View File

@ -54,8 +54,10 @@ export class NoopAnimationEngine extends AnimationEngine {
onRemove(element: any, domFn: () => any): void { onRemove(element: any, domFn: () => any): void {
domFn(); domFn();
if (element['nodeType'] == 1) {
this._flaggedRemovals.add(element); this._flaggedRemovals.add(element);
} }
}
setProperty(element: any, property: string, value: any): void { setProperty(element: any, property: string, value: any): void {
const storageProp = makeStorageProp(property); const storageProp = makeStorageProp(property);

View File

@ -328,6 +328,29 @@ export function main() {
}); });
}); });
describe('removals / insertions', () => {
it('should allow text nodes to be removed through the engine', () => {
const engine = makeEngine();
const node = document.createTextNode('hello');
element.appendChild(node);
let called = false;
engine.onRemove(node, () => called = true);
expect(called).toBeTruthy();
});
it('should allow text nodes to be inserted through the engine', () => {
const engine = makeEngine();
const node = document.createTextNode('hello');
let called = false;
engine.onInsert(node, () => called = true);
expect(called).toBeTruthy();
});
});
describe('transition operations', () => { describe('transition operations', () => {
it('should persist the styles on the element as actual styles once the animation is complete', it('should persist the styles on the element as actual styles once the animation is complete',
() => { () => {

View File

@ -20,8 +20,8 @@ export function main() {
() => { () => {
const engine = new NoopAnimationEngine(); const engine = new NoopAnimationEngine();
const elm1 = {}; const elm1 = {nodeType: 1};
const elm2 = {}; const elm2 = {nodeType: 1};
engine.onRemove(elm1, capture('1')); engine.onRemove(elm1, capture('1'));
engine.onRemove(elm2, capture('2')); engine.onRemove(elm2, capture('2'));
@ -158,7 +158,7 @@ export function main() {
it('should fire a removal listener even if the listener is deregistered prior to flush', () => { it('should fire a removal listener even if the listener is deregistered prior to flush', () => {
const engine = new NoopAnimationEngine(); const engine = new NoopAnimationEngine();
const elm = {}; const elm = {nodeType: 1};
const fn = engine.listen(elm, 'trig', 'start', capture('removal listener')); const fn = engine.listen(elm, 'trig', 'start', capture('removal listener'));
fn(); fn();