fix(ivy): inherited host listeners called twice (#29170)

Fixes host listeners being inherited twice when going through `setClassMetadata`.

This PR resolves FW-1142.

PR Close #29170
This commit is contained in:
Kristiyan Kostadinov
2019-03-08 18:21:15 +01:00
committed by Kara Erickson
parent b6f6b1178f
commit a746b5b1ea
4 changed files with 59 additions and 4 deletions

View File

@ -6,8 +6,10 @@
* found in the LICENSE file at https://angular.io/license
*/
import {WrappedNodeExpr} from '@angular/compiler';
import {convertToR3QueryMetadata, extendsDirectlyFromObject} from '../../../src/render3/jit/directive';
import {Directive, HostListener} from '@angular/core';
import {setClassMetadata} from '@angular/core/src/render3/metadata';
import {convertToR3QueryMetadata, directiveMetadata, extendsDirectlyFromObject} from '../../../src/render3/jit/directive';
describe('jit directive helper functions', () => {
@ -96,4 +98,37 @@ describe('jit directive helper functions', () => {
});
});
describe('directiveMetadata', () => {
it('should not inherit propMetadata from super class', () => {
class SuperDirective {}
setClassMetadata(
SuperDirective, [{type: Directive, args: []}], null,
{handleClick: [{type: HostListener, args: ['click']}]});
class SubDirective extends SuperDirective {}
setClassMetadata(SubDirective, [{type: Directive, args: []}], null, null);
expect(directiveMetadata(SuperDirective, {}).propMetadata.handleClick).toBeTruthy();
expect(directiveMetadata(SubDirective, {}).propMetadata.handleClick).toBeFalsy();
});
it('should not inherit propMetadata from grand super class', () => {
class SuperSuperDirective {}
setClassMetadata(
SuperSuperDirective, [{type: Directive, args: []}], null,
{handleClick: [{type: HostListener, args: ['click']}]});
class SuperDirective {}
setClassMetadata(SuperDirective, [{type: Directive, args: []}], null, null);
class SubDirective extends SuperDirective {}
setClassMetadata(SubDirective, [{type: Directive, args: []}], null, null);
expect(directiveMetadata(SuperSuperDirective, {}).propMetadata.handleClick).toBeTruthy();
expect(directiveMetadata(SuperDirective, {}).propMetadata.handleClick).toBeFalsy();
expect(directiveMetadata(SubDirective, {}).propMetadata.handleClick).toBeFalsy();
});
});
});