fix(ivy): error when encountering an empty class attribute (#28321)

Fixes Ivy throwing an error if it encounters an empty class attribute in a template (`class=""`).

This PR resolves FW-972.

PR Close #28321
This commit is contained in:
Kristiyan Kostadinov 2019-01-23 18:41:20 +01:00 committed by Jason Aden
parent 9098225ff0
commit 22a43cff4d
2 changed files with 18 additions and 8 deletions

View File

@ -982,14 +982,17 @@ function setClass(
if (playerBuilder) { if (playerBuilder) {
playerBuilder.setValue(className, add); playerBuilder.setValue(className, add);
} }
} else if (add) { // DOMTokenList will throw if we try to add or remove an empty string.
ngDevMode && ngDevMode.rendererAddClass++; } else if (className !== '') {
isProceduralRenderer(renderer) ? renderer.addClass(native, className) : if (add) {
native['classList'].add(className); ngDevMode && ngDevMode.rendererAddClass++;
} else { isProceduralRenderer(renderer) ? renderer.addClass(native, className) :
ngDevMode && ngDevMode.rendererRemoveClass++; native['classList'].add(className);
isProceduralRenderer(renderer) ? renderer.removeClass(native, className) : } else {
native['classList'].remove(className); ngDevMode && ngDevMode.rendererRemoveClass++;
isProceduralRenderer(renderer) ? renderer.removeClass(native, className) :
native['classList'].remove(className);
}
} }
} }

View File

@ -317,6 +317,13 @@ function declareTests(config?: {useJit: boolean}) {
expect(ctx.componentInstance.viewContainers.first).toBe(vc); expect(ctx.componentInstance.viewContainers.first).toBe(vc);
}); });
it('should not throw when encountering an empty class attribute', () => {
const template = '<div class=""></div>';
TestBed.overrideComponent(MyComp1, {set: {template}});
expect(() => TestBed.createComponent(MyComp1)).not.toThrow();
});
describe('empty templates - #15143', () => { describe('empty templates - #15143', () => {
it('should allow empty components', () => { it('should allow empty components', () => {
@Component({template: ''}) @Component({template: ''})