Skip to content

Commit 9982520

Browse files
vicbmhevery
authored andcommitted
refactor(Compiler): make shadow DOM stragegy support more flexible
1 parent bcf4a96 commit 9982520

24 files changed

+532
-473
lines changed

modules/angular2/src/core/application.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {ComponentUrlMapper} from 'angular2/src/core/compiler/component_url_mappe
2424
import {UrlResolver} from 'angular2/src/core/compiler/url_resolver';
2525
import {StyleUrlResolver} from 'angular2/src/core/compiler/style_url_resolver';
2626
import {StyleInliner} from 'angular2/src/core/compiler/style_inliner';
27+
import {CssProcessor} from 'angular2/src/core/compiler/css_processor';
2728

2829
var _rootInjector: Injector;
2930

@@ -98,6 +99,7 @@ function _injectorBindings(appComponentType): List<Binding> {
9899
UrlResolver,
99100
StyleUrlResolver,
100101
StyleInliner,
102+
CssProcessor,
101103
];
102104
}
103105

modules/angular2/src/core/compiler/compiler.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {ShadowDomStrategy} from './shadow_dom_strategy';
1717
import {CompileStep} from './pipeline/compile_step';
1818
import {ComponentUrlMapper} from './component_url_mapper';
1919
import {UrlResolver} from './url_resolver';
20-
20+
import {CssProcessor} from './css_processor';
2121

2222
/**
2323
* Cache that stores the ProtoView of the template of a component.
@@ -61,6 +61,7 @@ export class Compiler {
6161
_componentUrlMapper: ComponentUrlMapper;
6262
_urlResolver: UrlResolver;
6363
_appUrl: string;
64+
_cssProcessor: CssProcessor;
6465

6566
constructor(changeDetection:ChangeDetection,
6667
templateLoader:TemplateLoader,
@@ -70,7 +71,8 @@ export class Compiler {
7071
shadowDomStrategy: ShadowDomStrategy,
7172
templateResolver: TemplateResolver,
7273
componentUrlMapper: ComponentUrlMapper,
73-
urlResolver: UrlResolver) {
74+
urlResolver: UrlResolver,
75+
cssProcessor: CssProcessor) {
7476
this._changeDetection = changeDetection;
7577
this._reader = reader;
7678
this._parser = parser;
@@ -87,6 +89,7 @@ export class Compiler {
8789
this._componentUrlMapper = componentUrlMapper;
8890
this._urlResolver = urlResolver;
8991
this._appUrl = urlResolver.resolve(null, './');
92+
this._cssProcessor = cssProcessor;
9093
}
9194

9295
createSteps(component:Type, template: Template):List<CompileStep> {
@@ -102,7 +105,7 @@ export class Compiler {
102105
var templateUrl = this._templateLoader.getTemplateUrl(template);
103106

104107
return createDefaultSteps(this._changeDetection, this._parser, cmpMetadata, dirMetadata,
105-
this._shadowDomStrategy, templateUrl);
108+
this._shadowDomStrategy, templateUrl, this._cssProcessor);
106109
}
107110

108111
compile(component: Type):Promise<ProtoView> {
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import {DOM} from 'angular2/src/dom/dom_adapter';
2+
3+
import {isPresent} from 'angular2/src/facade/lang';
4+
5+
import {CompileStep} from './pipeline/compile_step';
6+
import {CompileElement} from './pipeline/compile_element';
7+
import {CompileControl} from './pipeline/compile_control';
8+
9+
import {ShadowDomStrategy} from './shadow_dom_strategy';
10+
import {DirectiveMetadata} from './directive_metadata';
11+
12+
/**
13+
* Processes the <style> tags during the compilation.
14+
*/
15+
export class CssProcessor {
16+
17+
/**
18+
* Returns a compile step to be added to the compiler pipeline.
19+
*
20+
* @param {DirectiveMetadata} cmpMetadata
21+
* @param {ShadowDomStrategy} shadowDomStrategy
22+
* @param {string} templateUrl The base URL of the template
23+
*/
24+
getCompileStep(cmpMetadata: DirectiveMetadata, shadowDomStrategy: ShadowDomStrategy,
25+
templateUrl: string) {
26+
var strategyStep = shadowDomStrategy.getStyleCompileStep(cmpMetadata, templateUrl);
27+
return new _CssProcessorStep(strategyStep);
28+
}
29+
}
30+
31+
class _CssProcessorStep extends CompileStep {
32+
_strategyStep: CompileStep;
33+
34+
constructor(strategyStep: CompileStep) {
35+
super();
36+
this._strategyStep = strategyStep;
37+
}
38+
39+
process(parent:CompileElement, current:CompileElement, control:CompileControl) {
40+
if (DOM.tagName(current.element) == 'STYLE') {
41+
current.ignoreBindings = true;
42+
43+
if (isPresent(this._strategyStep)) {
44+
this._strategyStep.process(parent, current, control);
45+
}
46+
}
47+
}
48+
}

modules/angular2/src/core/compiler/pipeline/default_steps.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {ChangeDetection, Parser} from 'angular2/change_detection';
22
import {List, ListWrapper} from 'angular2/src/facade/collection';
3+
import {isPresent} from 'angular2/src/facade/lang';
34

45
import {PropertyBindingParser} from './property_binding_parser';
56
import {TextInterpolationParser} from './text_interpolation_parser';
@@ -9,8 +10,8 @@ import {ElementBindingMarker} from './element_binding_marker';
910
import {ProtoViewBuilder} from './proto_view_builder';
1011
import {ProtoElementInjectorBuilder} from './proto_element_injector_builder';
1112
import {ElementBinderBuilder} from './element_binder_builder';
12-
import {ResolveCss} from './resolve_css';
13-
import {ShimShadowDom} from './shim_shadow_dom';
13+
14+
import {CssProcessor} from 'angular2/src/core/compiler/css_processor';
1415
import {DirectiveMetadata} from 'angular2/src/core/compiler/directive_metadata';
1516
import {ShadowDomStrategy, EmulatedScopedShadowDomStrategy} from 'angular2/src/core/compiler/shadow_dom_strategy';
1617

@@ -25,11 +26,12 @@ export function createDefaultSteps(
2526
compiledComponent: DirectiveMetadata,
2627
directives: List<DirectiveMetadata>,
2728
shadowDomStrategy: ShadowDomStrategy,
28-
templateUrl: string) {
29+
templateUrl: string,
30+
cssProcessor: CssProcessor) {
2931

3032
var steps = [
3133
new ViewSplitter(parser),
32-
new ResolveCss(compiledComponent, shadowDomStrategy, templateUrl),
34+
cssProcessor.getCompileStep(compiledComponent, shadowDomStrategy, templateUrl),
3335
new PropertyBindingParser(parser),
3436
new DirectiveParser(directives),
3537
new TextInterpolationParser(parser),
@@ -39,9 +41,9 @@ export function createDefaultSteps(
3941
new ElementBinderBuilder(parser),
4042
];
4143

42-
if (shadowDomStrategy instanceof EmulatedScopedShadowDomStrategy) {
43-
var step = new ShimShadowDom(compiledComponent, shadowDomStrategy);
44-
ListWrapper.push(steps, step);
44+
var shadowDomStep = shadowDomStrategy.getTemplateCompileStep(compiledComponent);
45+
if (isPresent(shadowDomStep)) {
46+
ListWrapper.push(steps, shadowDomStep);
4547
}
4648

4749
return steps;

modules/angular2/src/core/compiler/pipeline/resolve_css.js

Lines changed: 0 additions & 47 deletions
This file was deleted.

modules/angular2/src/core/compiler/pipeline/shim_shadow_dom.js

Lines changed: 0 additions & 35 deletions
This file was deleted.

0 commit comments

Comments
 (0)