fix(animations): always camelcase style property names that contain auto styles

Closes #17938
This commit is contained in:
Matias Niemelä 2017-07-17 14:02:52 -04:00 committed by Alex Rickabaugh
parent 23146c9201
commit d22f8f54db
2 changed files with 98 additions and 8 deletions

View File

@ -36,13 +36,22 @@ export function normalizeKeyframes(
Object.keys(kf).forEach(prop => { Object.keys(kf).forEach(prop => {
let normalizedProp = prop; let normalizedProp = prop;
let normalizedValue = kf[prop]; let normalizedValue = kf[prop];
if (normalizedValue == PRE_STYLE) { if (prop !== 'offset') {
normalizedValue = preStyles[prop]; normalizedProp = normalizer.normalizePropertyName(normalizedProp, errors);
} else if (normalizedValue == AUTO_STYLE) { switch (normalizedValue) {
normalizedValue = postStyles[prop]; case PRE_STYLE:
} else if (prop != 'offset') { normalizedValue = preStyles[prop];
normalizedProp = normalizer.normalizePropertyName(prop, errors); break;
normalizedValue = normalizer.normalizeStyleValue(prop, normalizedProp, kf[prop], errors);
case AUTO_STYLE:
normalizedValue = postStyles[prop];
break;
default:
normalizedValue =
normalizer.normalizeStyleValue(prop, normalizedProp, normalizedValue, errors);
break;
}
} }
normalizedKeyframe[normalizedProp] = normalizedValue; normalizedKeyframe[normalizedProp] = normalizedValue;
}); });

View File

@ -5,7 +5,7 @@
* Use of this source code is governed by an MIT-style license that can be * Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license * found in the LICENSE file at https://angular.io/license
*/ */
import {AUTO_STYLE, AnimationEvent, AnimationOptions, animate, animateChild, group, keyframes, query, state, style, transition, trigger} from '@angular/animations'; import {AUTO_STYLE, AnimationEvent, AnimationOptions, animate, animateChild, group, keyframes, query, state, style, transition, trigger, ɵPRE_STYLE as PRE_STYLE} from '@angular/animations';
import {AnimationDriver, ɵAnimationEngine, ɵNoopAnimationDriver} from '@angular/animations/browser'; import {AnimationDriver, ɵAnimationEngine, ɵNoopAnimationDriver} from '@angular/animations/browser';
import {MockAnimationDriver, MockAnimationPlayer} from '@angular/animations/browser/testing'; import {MockAnimationDriver, MockAnimationPlayer} from '@angular/animations/browser/testing';
import {Component, HostBinding, HostListener, RendererFactory2, ViewChild} from '@angular/core'; import {Component, HostBinding, HostListener, RendererFactory2, ViewChild} from '@angular/core';
@ -2225,6 +2225,87 @@ export function main() {
}); });
}); });
describe('animation normalization', () => {
it('should convert hyphenated properties to camelcase by default', () => {
@Component({
selector: 'cmp',
template: `
<div [@myAnimation]="exp"></div>
`,
animations: [
trigger(
'myAnimation',
[
transition(
'* => go',
[
style({'background-color': 'red', height: '100px', fontSize: '100px'}),
animate(
'1s',
style(
{'background-color': 'blue', height: '200px', fontSize: '200px'})),
]),
]),
]
})
class Cmp {
exp: any = false;
}
TestBed.configureTestingModule({declarations: [Cmp]});
const fixture = TestBed.createComponent(Cmp);
const cmp = fixture.componentInstance;
cmp.exp = 'go';
fixture.detectChanges();
const players = getLog();
expect(players.length).toEqual(1);
expect(players[0].keyframes).toEqual([
{backgroundColor: 'red', height: '100px', fontSize: '100px', offset: 0},
{backgroundColor: 'blue', height: '200px', fontSize: '200px', offset: 1},
]);
});
it('should convert hyphenated properties to camelcase by default that are auto/pre style properties',
() => {
@Component({
selector: 'cmp',
template: `
<div [@myAnimation]="exp"></div>
`,
animations: [
trigger(
'myAnimation',
[
transition(
'* => go',
[
style({'background-color': AUTO_STYLE, 'font-size': '100px'}),
animate(
'1s', style({'background-color': 'blue', 'font-size': PRE_STYLE})),
]),
]),
]
})
class Cmp {
exp: any = false;
}
TestBed.configureTestingModule({declarations: [Cmp]});
const fixture = TestBed.createComponent(Cmp);
const cmp = fixture.componentInstance;
cmp.exp = 'go';
fixture.detectChanges();
const players = getLog();
expect(players.length).toEqual(1);
expect(players[0].keyframes).toEqual([
{backgroundColor: AUTO_STYLE, fontSize: '100px', offset: 0},
{backgroundColor: 'blue', fontSize: PRE_STYLE, offset: 1},
]);
});
});
it('should throw neither state() or transition() are used inside of trigger()', () => { it('should throw neither state() or transition() are used inside of trigger()', () => {
@Component({ @Component({
selector: 'if-cmp', selector: 'if-cmp',