2016-06-23 12:47:54 -04:00
|
|
|
/**
|
|
|
|
* @license
|
|
|
|
* Copyright Google Inc. All Rights Reserved.
|
|
|
|
*
|
|
|
|
* 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
|
|
|
|
*/
|
2017-03-24 12:59:58 -04:00
|
|
|
import {CompileAnimationEntryMetadata} from '@angular/compiler';
|
2017-07-28 09:58:28 -04:00
|
|
|
import {CompileStylesheetMetadata, CompileTemplateMetadata} from '@angular/compiler/src/compile_metadata';
|
|
|
|
import {CompilerConfig, preserveWhitespacesDefault} from '@angular/compiler/src/config';
|
2016-04-28 20:50:03 -04:00
|
|
|
import {DirectiveNormalizer} from '@angular/compiler/src/directive_normalizer';
|
2016-08-17 12:24:44 -04:00
|
|
|
import {ResourceLoader} from '@angular/compiler/src/resource_loader';
|
2017-03-02 15:12:46 -05:00
|
|
|
import {MockResourceLoader} from '@angular/compiler/testing/src/resource_loader_mock';
|
|
|
|
import {TEST_COMPILER_PROVIDERS} from '@angular/compiler/testing/src/test_bindings';
|
2016-06-08 19:38:52 -04:00
|
|
|
import {ViewEncapsulation} from '@angular/core/src/metadata/view';
|
2016-07-28 07:54:49 -04:00
|
|
|
import {TestBed} from '@angular/core/testing';
|
2017-03-02 15:12:46 -05:00
|
|
|
import {AsyncTestCompleter, beforeEach, describe, expect, inject, it} from '@angular/core/testing/src/testing_internal';
|
2016-06-08 19:38:52 -04:00
|
|
|
|
2017-05-17 18:39:08 -04:00
|
|
|
import {noUndefined} from '../src/util';
|
2017-03-24 12:59:58 -04:00
|
|
|
|
2016-08-17 12:24:44 -04:00
|
|
|
import {SpyResourceLoader} from './spies';
|
2015-09-14 18:59:09 -04:00
|
|
|
|
2016-11-10 17:07:30 -05:00
|
|
|
const SOME_MODULE_URL = 'package:some/module/a.js';
|
|
|
|
const SOME_HTTP_MODULE_URL = 'http://some/module/a.js';
|
|
|
|
|
2017-03-24 12:59:58 -04:00
|
|
|
function normalizeTemplate(normalizer: DirectiveNormalizer, o: {
|
|
|
|
ngModuleType?: any; componentType?: any; moduleUrl?: string; template?: string | null;
|
|
|
|
templateUrl?: string | null;
|
|
|
|
styles?: string[];
|
|
|
|
styleUrls?: string[];
|
|
|
|
interpolation?: [string, string] | null;
|
|
|
|
encapsulation?: ViewEncapsulation | null;
|
|
|
|
animations?: CompileAnimationEntryMetadata[];
|
2017-07-28 09:58:28 -04:00
|
|
|
preserveWhitespaces?: boolean | null;
|
2017-03-24 12:59:58 -04:00
|
|
|
}) {
|
|
|
|
return normalizer.normalizeTemplate({
|
|
|
|
ngModuleType: noUndefined(o.ngModuleType),
|
|
|
|
componentType: noUndefined(o.componentType),
|
|
|
|
moduleUrl: noUndefined(o.moduleUrl),
|
|
|
|
template: noUndefined(o.template),
|
|
|
|
templateUrl: noUndefined(o.templateUrl),
|
|
|
|
styles: noUndefined(o.styles),
|
|
|
|
styleUrls: noUndefined(o.styleUrls),
|
|
|
|
interpolation: noUndefined(o.interpolation),
|
|
|
|
encapsulation: noUndefined(o.encapsulation),
|
2017-07-28 09:58:28 -04:00
|
|
|
animations: noUndefined(o.animations),
|
|
|
|
preserveWhitespaces: noUndefined(o.preserveWhitespaces),
|
2017-03-24 12:59:58 -04:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2017-05-17 18:39:08 -04:00
|
|
|
function normalizeTemplateOnly(normalizer: DirectiveNormalizer, o: {
|
2017-03-24 12:59:58 -04:00
|
|
|
ngModuleType?: any; componentType?: any; moduleUrl?: string; template?: string | null;
|
|
|
|
templateUrl?: string | null;
|
|
|
|
styles?: string[];
|
|
|
|
styleUrls?: string[];
|
|
|
|
interpolation?: [string, string] | null;
|
|
|
|
encapsulation?: ViewEncapsulation | null;
|
|
|
|
animations?: CompileAnimationEntryMetadata[];
|
2017-07-28 09:58:28 -04:00
|
|
|
preserveWhitespaces?: boolean | null;
|
2017-03-24 12:59:58 -04:00
|
|
|
}) {
|
2017-05-17 18:39:08 -04:00
|
|
|
return normalizer.normalizeTemplateOnly({
|
2017-03-24 12:59:58 -04:00
|
|
|
ngModuleType: noUndefined(o.ngModuleType),
|
|
|
|
componentType: noUndefined(o.componentType),
|
|
|
|
moduleUrl: noUndefined(o.moduleUrl),
|
|
|
|
template: noUndefined(o.template),
|
|
|
|
templateUrl: noUndefined(o.templateUrl),
|
|
|
|
styles: noUndefined(o.styles),
|
|
|
|
styleUrls: noUndefined(o.styleUrls),
|
|
|
|
interpolation: noUndefined(o.interpolation),
|
|
|
|
encapsulation: noUndefined(o.encapsulation),
|
2017-07-28 09:58:28 -04:00
|
|
|
animations: noUndefined(o.animations),
|
|
|
|
preserveWhitespaces: noUndefined(o.preserveWhitespaces),
|
2017-03-24 12:59:58 -04:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function compileTemplateMetadata({encapsulation, template, templateUrl, styles, styleUrls,
|
|
|
|
externalStylesheets, animations, ngContentSelectors,
|
2017-07-28 09:58:28 -04:00
|
|
|
interpolation, isInline, preserveWhitespaces}: {
|
2017-03-24 12:59:58 -04:00
|
|
|
encapsulation?: ViewEncapsulation | null,
|
|
|
|
template?: string | null,
|
|
|
|
templateUrl?: string | null,
|
|
|
|
styles?: string[],
|
|
|
|
styleUrls?: string[],
|
|
|
|
externalStylesheets?: CompileStylesheetMetadata[],
|
|
|
|
ngContentSelectors?: string[],
|
|
|
|
animations?: any[],
|
|
|
|
interpolation?: [string, string] | null,
|
2017-07-28 09:58:28 -04:00
|
|
|
isInline?: boolean,
|
|
|
|
preserveWhitespaces?: boolean | null
|
2017-03-24 12:59:58 -04:00
|
|
|
}): CompileTemplateMetadata {
|
|
|
|
return new CompileTemplateMetadata({
|
|
|
|
encapsulation: encapsulation || null,
|
|
|
|
template: template || null,
|
|
|
|
templateUrl: templateUrl || null,
|
|
|
|
styles: styles || [],
|
|
|
|
styleUrls: styleUrls || [],
|
|
|
|
externalStylesheets: externalStylesheets || [],
|
|
|
|
ngContentSelectors: ngContentSelectors || [],
|
|
|
|
animations: animations || [],
|
|
|
|
interpolation: interpolation || null,
|
|
|
|
isInline: !!isInline,
|
2017-07-28 09:58:28 -04:00
|
|
|
preserveWhitespaces: preserveWhitespacesDefault(noUndefined(preserveWhitespaces)),
|
2017-03-24 12:59:58 -04:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function normalizeLoadedTemplate(
|
|
|
|
normalizer: DirectiveNormalizer, o: {
|
|
|
|
ngModuleType?: any; componentType?: any; moduleUrl?: string; template?: string | null;
|
|
|
|
templateUrl?: string | null;
|
|
|
|
styles?: string[];
|
|
|
|
styleUrls?: string[];
|
|
|
|
interpolation?: [string, string] | null;
|
|
|
|
encapsulation?: ViewEncapsulation | null;
|
|
|
|
animations?: CompileAnimationEntryMetadata[];
|
2017-07-28 09:58:28 -04:00
|
|
|
preserveWhitespaces?: boolean;
|
2017-03-24 12:59:58 -04:00
|
|
|
},
|
|
|
|
template: string, templateAbsUrl: string) {
|
|
|
|
return normalizer.normalizeLoadedTemplate(
|
|
|
|
{
|
|
|
|
ngModuleType: o.ngModuleType || null,
|
|
|
|
componentType: o.componentType || null,
|
|
|
|
moduleUrl: o.moduleUrl || '',
|
|
|
|
template: o.template || null,
|
|
|
|
templateUrl: o.templateUrl || null,
|
|
|
|
styles: o.styles || [],
|
|
|
|
styleUrls: o.styleUrls || [],
|
|
|
|
interpolation: o.interpolation || null,
|
|
|
|
encapsulation: o.encapsulation || null,
|
2017-04-14 17:40:56 -04:00
|
|
|
animations: o.animations || [],
|
2017-07-28 09:58:28 -04:00
|
|
|
preserveWhitespaces: noUndefined(o.preserveWhitespaces),
|
2017-03-24 12:59:58 -04:00
|
|
|
},
|
|
|
|
template, templateAbsUrl);
|
|
|
|
}
|
|
|
|
|
2015-09-14 18:59:09 -04:00
|
|
|
export function main() {
|
2016-01-06 17:13:44 -05:00
|
|
|
describe('DirectiveNormalizer', () => {
|
2016-07-28 07:54:49 -04:00
|
|
|
beforeEach(() => { TestBed.configureCompiler({providers: TEST_COMPILER_PROVIDERS}); });
|
2015-09-14 18:59:09 -04:00
|
|
|
|
2016-06-24 11:46:43 -04:00
|
|
|
describe('normalizeDirective', () => {
|
2015-09-18 13:33:23 -04:00
|
|
|
it('should throw if no template was specified',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
expect(() => normalizeTemplate(normalizer, {
|
|
|
|
ngModuleType: null,
|
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
}))
|
|
|
|
.toThrowError('No template specified for component SomeComp');
|
2016-06-24 11:46:43 -04:00
|
|
|
}));
|
2016-12-11 05:49:03 -05:00
|
|
|
it('should throw if template is not a string',
|
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
expect(() => normalizeTemplate(normalizer, {
|
|
|
|
ngModuleType: null,
|
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
template: <any>{}
|
|
|
|
}))
|
|
|
|
.toThrowError('The template specified for component SomeComp is not a string');
|
2016-12-11 05:49:03 -05:00
|
|
|
}));
|
|
|
|
it('should throw if templateUrl is not a string',
|
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
expect(() => normalizeTemplate(normalizer, {
|
|
|
|
ngModuleType: null,
|
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
templateUrl: <any>{}
|
|
|
|
}))
|
|
|
|
.toThrowError('The templateUrl specified for component SomeComp is not a string');
|
2016-12-11 05:49:03 -05:00
|
|
|
}));
|
2017-03-29 13:26:48 -04:00
|
|
|
it('should throw if both template and templateUrl are defined',
|
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
expect(() => normalizeTemplate(normalizer, {
|
|
|
|
ngModuleType: null,
|
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
template: '',
|
|
|
|
templateUrl: '',
|
|
|
|
}))
|
|
|
|
.toThrowError(`'SomeComp' component cannot define both template and templateUrl`);
|
2017-03-29 13:26:48 -04:00
|
|
|
}));
|
2017-07-28 09:58:28 -04:00
|
|
|
it('should throw if preserveWhitespaces is not a boolean',
|
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
|
|
|
expect(() => normalizeTemplate(normalizer, {
|
|
|
|
ngModuleType: null,
|
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
template: '',
|
|
|
|
preserveWhitespaces: <any>'WRONG',
|
|
|
|
}))
|
|
|
|
.toThrowError(
|
|
|
|
'The preserveWhitespaces option for component SomeComp must be a boolean');
|
|
|
|
}));
|
2016-06-24 11:46:43 -04:00
|
|
|
});
|
|
|
|
|
2017-05-17 18:39:08 -04:00
|
|
|
describe('normalizeTemplateOnly sync', () => {
|
2016-06-24 11:46:43 -04:00
|
|
|
it('should store the template',
|
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-05-17 18:39:08 -04:00
|
|
|
const template = <CompileTemplateMetadata>normalizeTemplateOnly(normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
template: 'a',
|
|
|
|
templateUrl: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
|
|
|
});
|
2016-06-24 11:46:43 -04:00
|
|
|
expect(template.template).toEqual('a');
|
|
|
|
expect(template.templateUrl).toEqual('package:some/module/a.js');
|
2017-03-14 12:16:15 -04:00
|
|
|
expect(template.isInline).toBe(true);
|
2016-06-24 11:46:43 -04:00
|
|
|
}));
|
|
|
|
|
|
|
|
it('should resolve styles on the annotation against the moduleUrl',
|
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-05-17 18:39:08 -04:00
|
|
|
const template = <CompileTemplateMetadata>normalizeTemplateOnly(normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
template: '',
|
|
|
|
templateUrl: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: ['test.css']
|
|
|
|
});
|
2016-06-24 11:46:43 -04:00
|
|
|
expect(template.styleUrls).toEqual(['package:some/module/test.css']);
|
|
|
|
}));
|
|
|
|
|
|
|
|
it('should resolve styles in the template against the moduleUrl',
|
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-05-17 18:39:08 -04:00
|
|
|
const template = <CompileTemplateMetadata>normalizeTemplateOnly(normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
template: '<style>@import test.css</style>',
|
|
|
|
templateUrl: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
|
|
|
});
|
2016-06-24 11:46:43 -04:00
|
|
|
expect(template.styleUrls).toEqual(['package:some/module/test.css']);
|
|
|
|
}));
|
|
|
|
|
|
|
|
it('should use ViewEncapsulation.Emulated by default',
|
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-05-17 18:39:08 -04:00
|
|
|
const template = <CompileTemplateMetadata>normalizeTemplateOnly(normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
template: '',
|
|
|
|
templateUrl: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: ['test.css']
|
|
|
|
});
|
2016-06-24 11:46:43 -04:00
|
|
|
expect(template.encapsulation).toEqual(ViewEncapsulation.Emulated);
|
2015-09-18 13:33:23 -04:00
|
|
|
}));
|
|
|
|
|
2016-06-24 11:46:43 -04:00
|
|
|
it('should use default encapsulation provided by CompilerConfig',
|
|
|
|
inject(
|
|
|
|
[CompilerConfig, DirectiveNormalizer],
|
|
|
|
(config: CompilerConfig, normalizer: DirectiveNormalizer) => {
|
|
|
|
config.defaultEncapsulation = ViewEncapsulation.None;
|
2017-05-17 18:39:08 -04:00
|
|
|
const template = <CompileTemplateMetadata>normalizeTemplateOnly(normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
2017-03-24 12:59:58 -04:00
|
|
|
encapsulation: undefined,
|
2016-11-10 17:07:30 -05:00
|
|
|
template: '',
|
2017-03-24 12:59:58 -04:00
|
|
|
templateUrl: undefined,
|
2016-11-10 17:07:30 -05:00
|
|
|
styles: [],
|
|
|
|
styleUrls: ['test.css']
|
|
|
|
});
|
2016-06-24 11:46:43 -04:00
|
|
|
expect(template.encapsulation).toEqual(ViewEncapsulation.None);
|
|
|
|
}));
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('templateUrl', () => {
|
|
|
|
|
|
|
|
it('should load a template from a url that is resolved against moduleUrl',
|
|
|
|
inject(
|
2016-08-17 12:24:44 -04:00
|
|
|
[AsyncTestCompleter, DirectiveNormalizer, ResourceLoader],
|
|
|
|
(async: AsyncTestCompleter, normalizer: DirectiveNormalizer,
|
|
|
|
resourceLoader: MockResourceLoader) => {
|
|
|
|
resourceLoader.expect('package:some/module/sometplurl.html', 'a');
|
2017-05-17 18:39:08 -04:00
|
|
|
(<Promise<CompileTemplateMetadata>>normalizeTemplateOnly(normalizer, {
|
2017-03-24 12:59:58 -04:00
|
|
|
ngModuleType: null,
|
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
template: null,
|
|
|
|
templateUrl: 'sometplurl.html',
|
|
|
|
styles: [],
|
|
|
|
styleUrls: ['test.css']
|
2017-05-17 18:39:08 -04:00
|
|
|
})).then((template) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
expect(template.template).toEqual('a');
|
|
|
|
expect(template.templateUrl).toEqual('package:some/module/sometplurl.html');
|
|
|
|
expect(template.isInline).toBe(false);
|
|
|
|
async.done();
|
|
|
|
});
|
2016-08-17 12:24:44 -04:00
|
|
|
resourceLoader.flush();
|
2016-06-24 11:46:43 -04:00
|
|
|
}));
|
|
|
|
|
|
|
|
it('should resolve styles on the annotation against the moduleUrl',
|
|
|
|
inject(
|
2016-08-17 12:24:44 -04:00
|
|
|
[AsyncTestCompleter, DirectiveNormalizer, ResourceLoader],
|
|
|
|
(async: AsyncTestCompleter, normalizer: DirectiveNormalizer,
|
|
|
|
resourceLoader: MockResourceLoader) => {
|
|
|
|
resourceLoader.expect('package:some/module/tpl/sometplurl.html', '');
|
2017-05-17 18:39:08 -04:00
|
|
|
(<Promise<CompileTemplateMetadata>>normalizeTemplateOnly(normalizer, {
|
2017-03-24 12:59:58 -04:00
|
|
|
ngModuleType: null,
|
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
template: null,
|
|
|
|
templateUrl: 'tpl/sometplurl.html',
|
|
|
|
styles: [],
|
|
|
|
styleUrls: ['test.css']
|
2017-05-17 18:39:08 -04:00
|
|
|
})).then((template) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
expect(template.styleUrls).toEqual(['package:some/module/test.css']);
|
|
|
|
async.done();
|
|
|
|
});
|
2016-08-17 12:24:44 -04:00
|
|
|
resourceLoader.flush();
|
2016-06-24 11:46:43 -04:00
|
|
|
}));
|
|
|
|
|
|
|
|
it('should resolve styles in the template against the templateUrl',
|
|
|
|
inject(
|
2016-08-17 12:24:44 -04:00
|
|
|
[AsyncTestCompleter, DirectiveNormalizer, ResourceLoader],
|
|
|
|
(async: AsyncTestCompleter, normalizer: DirectiveNormalizer,
|
|
|
|
resourceLoader: MockResourceLoader) => {
|
|
|
|
resourceLoader.expect(
|
2016-06-24 11:46:43 -04:00
|
|
|
'package:some/module/tpl/sometplurl.html', '<style>@import test.css</style>');
|
2017-05-17 18:39:08 -04:00
|
|
|
(<Promise<CompileTemplateMetadata>>normalizeTemplateOnly(normalizer, {
|
2017-03-24 12:59:58 -04:00
|
|
|
ngModuleType: null,
|
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
template: null,
|
|
|
|
templateUrl: 'tpl/sometplurl.html',
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
2017-05-17 18:39:08 -04:00
|
|
|
})).then((template) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
expect(template.styleUrls).toEqual(['package:some/module/tpl/test.css']);
|
|
|
|
async.done();
|
|
|
|
});
|
2016-08-17 12:24:44 -04:00
|
|
|
resourceLoader.flush();
|
2016-06-24 11:46:43 -04:00
|
|
|
}));
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('normalizeExternalStylesheets', () => {
|
|
|
|
|
perf: switch angular to use StaticInjector instead of ReflectiveInjector
This change allows ReflectiveInjector to be tree shaken resulting
in not needed Reflect polyfil and smaller bundles.
Code savings for HelloWorld using Closure:
Reflective: bundle.js: 105,864(34,190 gzip)
Static: bundle.js: 154,889(33,555 gzip)
645( 2%)
BREAKING CHANGE:
`platformXXXX()` no longer accepts providers which depend on reflection.
Specifically the method signature when from `Provider[]` to
`StaticProvider[]`.
Example:
Before:
```
[
MyClass,
{provide: ClassA, useClass: SubClassA}
]
```
After:
```
[
{provide: MyClass, deps: [Dep1,...]},
{provide: ClassA, useClass: SubClassA, deps: [Dep1,...]}
]
```
NOTE: This only applies to platform creation and providers for the JIT
compiler. It does not apply to `@Compotent` or `@NgModule` provides
declarations.
Benchpress note: Previously Benchpress also supported reflective
provides, which now require static providers.
DEPRECATION:
- `ReflectiveInjector` is now deprecated as it will be remove. Use
`Injector.create` as a replacement.
closes #18496
2017-08-03 15:33:29 -04:00
|
|
|
beforeEach(() => { TestBed.configureCompiler({providers: [SpyResourceLoader.PROVIDE]}); });
|
2016-06-24 11:46:43 -04:00
|
|
|
|
|
|
|
it('should load an external stylesheet',
|
|
|
|
inject(
|
2016-08-17 12:24:44 -04:00
|
|
|
[AsyncTestCompleter, DirectiveNormalizer, ResourceLoader],
|
|
|
|
(async: AsyncTestCompleter, normalizer: DirectiveNormalizer,
|
|
|
|
resourceLoader: SpyResourceLoader) => {
|
|
|
|
programResourceLoaderSpy(resourceLoader, {'package:some/module/test.css': 'a'});
|
2017-05-17 18:39:08 -04:00
|
|
|
(<Promise<CompileTemplateMetadata>>normalizer.normalizeExternalStylesheets(
|
|
|
|
compileTemplateMetadata({
|
|
|
|
template: '',
|
|
|
|
templateUrl: '',
|
|
|
|
styleUrls: ['package:some/module/test.css']
|
|
|
|
})))
|
|
|
|
.then((template) => {
|
2016-06-24 11:46:43 -04:00
|
|
|
expect(template.externalStylesheets.length).toBe(1);
|
|
|
|
expect(template.externalStylesheets[0]).toEqual(new CompileStylesheetMetadata({
|
|
|
|
moduleUrl: 'package:some/module/test.css',
|
|
|
|
styles: ['a'],
|
|
|
|
styleUrls: []
|
|
|
|
}));
|
|
|
|
async.done();
|
|
|
|
});
|
|
|
|
}));
|
|
|
|
|
|
|
|
it('should load stylesheets referenced by external stylesheets',
|
|
|
|
inject(
|
2016-08-17 12:24:44 -04:00
|
|
|
[AsyncTestCompleter, DirectiveNormalizer, ResourceLoader],
|
|
|
|
(async: AsyncTestCompleter, normalizer: DirectiveNormalizer,
|
|
|
|
resourceLoader: SpyResourceLoader) => {
|
|
|
|
programResourceLoaderSpy(resourceLoader, {
|
2016-06-24 11:46:43 -04:00
|
|
|
'package:some/module/test.css': 'a@import "test2.css"',
|
|
|
|
'package:some/module/test2.css': 'b'
|
|
|
|
});
|
2017-05-17 18:39:08 -04:00
|
|
|
(<Promise<CompileTemplateMetadata>>normalizer.normalizeExternalStylesheets(
|
|
|
|
compileTemplateMetadata({
|
|
|
|
template: '',
|
|
|
|
templateUrl: '',
|
|
|
|
styleUrls: ['package:some/module/test.css']
|
|
|
|
})))
|
|
|
|
.then((template) => {
|
2016-06-24 11:46:43 -04:00
|
|
|
expect(template.externalStylesheets.length).toBe(2);
|
|
|
|
expect(template.externalStylesheets[0]).toEqual(new CompileStylesheetMetadata({
|
|
|
|
moduleUrl: 'package:some/module/test.css',
|
|
|
|
styles: ['a'],
|
|
|
|
styleUrls: ['package:some/module/test2.css']
|
|
|
|
}));
|
|
|
|
expect(template.externalStylesheets[1]).toEqual(new CompileStylesheetMetadata({
|
|
|
|
moduleUrl: 'package:some/module/test2.css',
|
|
|
|
styles: ['b'],
|
|
|
|
styleUrls: []
|
|
|
|
}));
|
|
|
|
async.done();
|
|
|
|
});
|
|
|
|
}));
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('caching', () => {
|
|
|
|
it('should work for templateUrl',
|
|
|
|
inject(
|
2016-08-17 12:24:44 -04:00
|
|
|
[AsyncTestCompleter, DirectiveNormalizer, ResourceLoader],
|
|
|
|
(async: AsyncTestCompleter, normalizer: DirectiveNormalizer,
|
|
|
|
resourceLoader: MockResourceLoader) => {
|
|
|
|
resourceLoader.expect('package:some/module/cmp.html', 'a');
|
2016-11-12 08:08:58 -05:00
|
|
|
const prenormMeta = {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null as any,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
2016-06-24 11:46:43 -04:00
|
|
|
templateUrl: 'cmp.html',
|
2016-11-10 17:07:30 -05:00
|
|
|
};
|
2016-06-24 11:46:43 -04:00
|
|
|
Promise
|
|
|
|
.all([
|
2017-05-17 18:39:08 -04:00
|
|
|
normalizeTemplateOnly(normalizer, prenormMeta),
|
|
|
|
normalizeTemplateOnly(normalizer, prenormMeta)
|
2016-06-24 11:46:43 -04:00
|
|
|
])
|
|
|
|
.then((templates: CompileTemplateMetadata[]) => {
|
|
|
|
expect(templates[0].template).toEqual('a');
|
|
|
|
expect(templates[1].template).toEqual('a');
|
|
|
|
async.done();
|
|
|
|
});
|
2016-08-17 12:24:44 -04:00
|
|
|
resourceLoader.flush();
|
2016-06-24 11:46:43 -04:00
|
|
|
}));
|
|
|
|
|
2015-09-14 18:59:09 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
describe('normalizeLoadedTemplate', () => {
|
2017-03-22 23:24:34 -04:00
|
|
|
it('should store the viewEncapsulation in the result',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2015-09-14 18:59:09 -04:00
|
|
|
|
2016-11-12 08:08:58 -05:00
|
|
|
const viewEncapsulation = ViewEncapsulation.Native;
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: viewEncapsulation,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
|
|
|
},
|
2016-05-02 12:38:46 -04:00
|
|
|
'', 'package:some/module/');
|
2015-09-14 18:59:09 -04:00
|
|
|
expect(template.encapsulation).toBe(viewEncapsulation);
|
|
|
|
}));
|
|
|
|
|
2017-07-28 09:58:28 -04:00
|
|
|
it('should use preserveWhitespaces setting from compiler config if none provided',
|
|
|
|
inject(
|
|
|
|
[DirectiveNormalizer, CompilerConfig],
|
|
|
|
(normalizer: DirectiveNormalizer, config: CompilerConfig) => {
|
|
|
|
const template = normalizeLoadedTemplate(normalizer, {}, '', '');
|
|
|
|
expect(template.preserveWhitespaces).toBe(config.preserveWhitespaces);
|
|
|
|
}));
|
|
|
|
|
|
|
|
it('should store the preserveWhitespaces=false in the result',
|
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
|
|
|
const template =
|
|
|
|
normalizeLoadedTemplate(normalizer, {preserveWhitespaces: false}, '', '');
|
|
|
|
expect(template.preserveWhitespaces).toBe(false);
|
|
|
|
}));
|
|
|
|
|
|
|
|
it('should store the preserveWhitespaces=true in the result',
|
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
|
|
|
const template =
|
|
|
|
normalizeLoadedTemplate(normalizer, {preserveWhitespaces: true}, '', '');
|
|
|
|
expect(template.preserveWhitespaces).toBe(true);
|
|
|
|
}));
|
|
|
|
|
2015-09-14 18:59:09 -04:00
|
|
|
it('should keep the template as html',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
|
|
|
},
|
|
|
|
'a', 'package:some/module/');
|
2016-07-21 20:12:00 -04:00
|
|
|
expect(template.template).toEqual('a');
|
2015-09-14 18:59:09 -04:00
|
|
|
}));
|
|
|
|
|
2015-09-18 13:33:23 -04:00
|
|
|
it('should collect ngContent',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
|
|
|
},
|
2016-05-02 12:38:46 -04:00
|
|
|
'<ng-content select="a"></ng-content>', 'package:some/module/');
|
2015-09-14 18:59:09 -04:00
|
|
|
expect(template.ngContentSelectors).toEqual(['a']);
|
|
|
|
}));
|
|
|
|
|
|
|
|
it('should normalize ngContent wildcard selector',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
|
|
|
},
|
2015-09-14 18:59:09 -04:00
|
|
|
'<ng-content></ng-content><ng-content select></ng-content><ng-content select="*"></ng-content>',
|
2015-10-01 13:07:49 -04:00
|
|
|
'package:some/module/');
|
2015-09-14 18:59:09 -04:00
|
|
|
expect(template.ngContentSelectors).toEqual(['*', '*', '*']);
|
|
|
|
}));
|
|
|
|
|
2015-09-18 13:33:23 -04:00
|
|
|
it('should collect top level styles in the template',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
|
|
|
},
|
2016-05-02 12:38:46 -04:00
|
|
|
'<style>a</style>', 'package:some/module/');
|
2015-09-14 18:59:09 -04:00
|
|
|
expect(template.styles).toEqual(['a']);
|
|
|
|
}));
|
|
|
|
|
2015-09-18 13:33:23 -04:00
|
|
|
it('should collect styles inside in elements',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
|
|
|
},
|
2016-05-02 12:38:46 -04:00
|
|
|
'<div><style>a</style></div>', 'package:some/module/');
|
2015-09-14 18:59:09 -04:00
|
|
|
expect(template.styles).toEqual(['a']);
|
|
|
|
}));
|
|
|
|
|
2015-09-18 13:33:23 -04:00
|
|
|
it('should collect styleUrls in the template',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
|
|
|
},
|
2016-05-02 12:38:46 -04:00
|
|
|
'<link rel="stylesheet" href="aUrl">', 'package:some/module/');
|
2015-10-01 13:07:49 -04:00
|
|
|
expect(template.styleUrls).toEqual(['package:some/module/aUrl']);
|
2015-09-14 18:59:09 -04:00
|
|
|
}));
|
|
|
|
|
2015-09-18 13:33:23 -04:00
|
|
|
it('should collect styleUrls in elements',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
|
|
|
},
|
2015-10-01 13:07:49 -04:00
|
|
|
'<div><link rel="stylesheet" href="aUrl"></div>', 'package:some/module/');
|
|
|
|
expect(template.styleUrls).toEqual(['package:some/module/aUrl']);
|
2015-09-14 18:59:09 -04:00
|
|
|
}));
|
|
|
|
|
2015-09-18 13:33:23 -04:00
|
|
|
it('should ignore link elements with non stylesheet rel attribute',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
|
|
|
},
|
2016-05-02 12:38:46 -04:00
|
|
|
'<link href="b" rel="a">', 'package:some/module/');
|
2015-09-18 13:33:23 -04:00
|
|
|
expect(template.styleUrls).toEqual([]);
|
2015-09-14 18:59:09 -04:00
|
|
|
}));
|
|
|
|
|
2015-10-14 12:39:40 -04:00
|
|
|
it('should ignore link elements with absolute urls but non package: scheme',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
|
|
|
},
|
2015-12-03 18:53:44 -05:00
|
|
|
'<link href="http://some/external.css" rel="stylesheet">', 'package:some/module/');
|
2015-10-14 12:39:40 -04:00
|
|
|
expect(template.styleUrls).toEqual([]);
|
|
|
|
}));
|
|
|
|
|
2015-09-14 18:59:09 -04:00
|
|
|
it('should extract @import style urls into styleAbsUrl',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
styles: ['@import "test.css";'],
|
|
|
|
styleUrls: []
|
|
|
|
},
|
2016-05-02 12:38:46 -04:00
|
|
|
'', 'package:some/module/id');
|
2015-09-14 18:59:09 -04:00
|
|
|
expect(template.styles).toEqual(['']);
|
2015-10-01 13:07:49 -04:00
|
|
|
expect(template.styleUrls).toEqual(['package:some/module/test.css']);
|
2015-09-14 18:59:09 -04:00
|
|
|
}));
|
|
|
|
|
2015-10-14 12:39:40 -04:00
|
|
|
it('should not resolve relative urls in inline styles',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
2015-09-14 18:59:09 -04:00
|
|
|
encapsulation: null,
|
|
|
|
styles: ['.foo{background-image: url(\'double.jpg\');'],
|
2016-05-02 12:38:46 -04:00
|
|
|
styleUrls: []
|
2016-11-10 17:07:30 -05:00
|
|
|
},
|
2015-10-01 13:07:49 -04:00
|
|
|
'', 'package:some/module/id');
|
2015-10-14 12:39:40 -04:00
|
|
|
expect(template.styles).toEqual(['.foo{background-image: url(\'double.jpg\');']);
|
2015-09-14 18:59:09 -04:00
|
|
|
}));
|
|
|
|
|
|
|
|
it('should resolve relative style urls in styleUrls',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: ['test.css']
|
|
|
|
},
|
2016-05-02 12:38:46 -04:00
|
|
|
'', 'package:some/module/id');
|
2015-09-14 18:59:09 -04:00
|
|
|
expect(template.styles).toEqual([]);
|
2015-10-01 13:07:49 -04:00
|
|
|
expect(template.styleUrls).toEqual(['package:some/module/test.css']);
|
2015-09-14 18:59:09 -04:00
|
|
|
}));
|
|
|
|
|
2015-10-27 17:00:15 -04:00
|
|
|
it('should resolve relative style urls in styleUrls with http directive url',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_HTTP_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: ['test.css']
|
|
|
|
},
|
2016-05-02 12:38:46 -04:00
|
|
|
'', 'http://some/module/id');
|
2015-10-27 17:00:15 -04:00
|
|
|
expect(template.styles).toEqual([]);
|
|
|
|
expect(template.styleUrls).toEqual(['http://some/module/test.css']);
|
|
|
|
}));
|
|
|
|
|
2015-12-16 02:47:48 -05:00
|
|
|
it('should normalize ViewEncapsulation.Emulated to ViewEncapsulation.None if there are no styles nor stylesheets',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: ViewEncapsulation.Emulated,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
|
|
|
},
|
2016-05-02 12:38:46 -04:00
|
|
|
'', 'package:some/module/id');
|
2015-09-18 13:33:23 -04:00
|
|
|
expect(template.encapsulation).toEqual(ViewEncapsulation.None);
|
|
|
|
}));
|
2015-09-14 18:59:09 -04:00
|
|
|
|
2015-11-23 19:02:19 -05:00
|
|
|
it('should ignore ng-content in elements with ngNonBindable',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
|
|
|
},
|
2015-11-23 19:02:19 -05:00
|
|
|
'<div ngNonBindable><ng-content select="a"></ng-content></div>',
|
2015-10-01 13:07:49 -04:00
|
|
|
'package:some/module/');
|
2015-09-18 13:33:23 -04:00
|
|
|
expect(template.ngContentSelectors).toEqual([]);
|
|
|
|
}));
|
2015-09-14 18:59:09 -04:00
|
|
|
|
2015-11-23 19:02:19 -05:00
|
|
|
it('should still collect <style> in elements with ngNonBindable',
|
2016-01-06 17:13:44 -05:00
|
|
|
inject([DirectiveNormalizer], (normalizer: DirectiveNormalizer) => {
|
2017-03-24 12:59:58 -04:00
|
|
|
const template = normalizeLoadedTemplate(
|
|
|
|
normalizer, {
|
2017-03-14 12:16:15 -04:00
|
|
|
ngModuleType: null,
|
2016-11-10 17:07:30 -05:00
|
|
|
componentType: SomeComp,
|
|
|
|
moduleUrl: SOME_MODULE_URL,
|
|
|
|
encapsulation: null,
|
|
|
|
styles: [],
|
|
|
|
styleUrls: []
|
|
|
|
},
|
2015-11-23 19:02:19 -05:00
|
|
|
'<div ngNonBindable><style>div {color:red}</style></div>', 'package:some/module/');
|
2015-09-18 13:33:23 -04:00
|
|
|
expect(template.styles).toEqual(['div {color:red}']);
|
|
|
|
}));
|
2015-09-18 13:33:23 -04:00
|
|
|
});
|
2015-09-14 18:59:09 -04:00
|
|
|
});
|
|
|
|
}
|
2016-06-24 11:46:43 -04:00
|
|
|
|
2016-08-17 12:24:44 -04:00
|
|
|
function programResourceLoaderSpy(spy: SpyResourceLoader, results: {[key: string]: string}) {
|
2016-10-11 18:44:48 -04:00
|
|
|
spy.spy('get').and.callFake((url: string): Promise<any> => {
|
2016-11-12 08:08:58 -05:00
|
|
|
const result = results[url];
|
2016-06-24 11:46:43 -04:00
|
|
|
if (result) {
|
|
|
|
return Promise.resolve(result);
|
|
|
|
} else {
|
|
|
|
return Promise.reject(`Unknown mock url ${url}`);
|
|
|
|
}
|
|
|
|
});
|
2016-08-17 19:37:31 -04:00
|
|
|
}
|
2016-11-10 17:07:30 -05:00
|
|
|
|
2016-12-11 05:49:03 -05:00
|
|
|
class SomeComp {}
|