fix(compiler): don't inject `viewProviders` into content child elements
E.g. in the following scenario, `some-directive` should not be able to inject any view provider that `my-comp-with-view-providers` declares. ``` <my-comp-with-view-providers> <div some-directive></div> </my-comp-with-view-providers> ```
This commit is contained in:
parent
33a2f86b28
commit
9ed8f2d26e
|
@ -313,6 +313,14 @@ export class CompileElement extends CompileNode {
|
||||||
}
|
}
|
||||||
// access regular providers on the element
|
// access regular providers on the element
|
||||||
if (isBlank(result)) {
|
if (isBlank(result)) {
|
||||||
|
let resolvedProvider = this._resolvedProviders.get(dep.token);
|
||||||
|
// don't allow directives / public services to access private services.
|
||||||
|
// only components and private services can access private services.
|
||||||
|
if (resolvedProvider && (requestingProviderType === ProviderAstType.Directive ||
|
||||||
|
requestingProviderType === ProviderAstType.PublicService) &&
|
||||||
|
resolvedProvider.providerType === ProviderAstType.PrivateService) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
result = this._instances.get(dep.token);
|
result = this._instances.get(dep.token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -397,7 +397,7 @@ export function main() {
|
||||||
expect(created).toBe(true);
|
expect(created).toBe(true);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
it('should not instantiate other directives that depend on viewProviders providers',
|
it('should not instantiate other directives that depend on viewProviders providers (same element)',
|
||||||
fakeAsync(() => {
|
fakeAsync(() => {
|
||||||
expect(
|
expect(
|
||||||
() => createComp(
|
() => createComp(
|
||||||
|
@ -407,6 +407,16 @@ export function main() {
|
||||||
.toThrowError(/No provider for service!/);
|
.toThrowError(/No provider for service!/);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
it('should not instantiate other directives that depend on viewProviders providers (child element)',
|
||||||
|
fakeAsync(() => {
|
||||||
|
expect(
|
||||||
|
() => createComp(
|
||||||
|
'<div simpleComponent><div needsService></div></div>',
|
||||||
|
tcb.overrideViewProviders(
|
||||||
|
SimpleComponent, [{provide: 'service', useValue: 'service'}])))
|
||||||
|
.toThrowError(/No provider for service!/);
|
||||||
|
}));
|
||||||
|
|
||||||
it('should instantiate directives that depend on providers of other directives',
|
it('should instantiate directives that depend on providers of other directives',
|
||||||
fakeAsync(() => {
|
fakeAsync(() => {
|
||||||
var el = createComp(
|
var el = createComp(
|
||||||
|
|
Loading…
Reference in New Issue