Skip to content

Commit 748c2d6

Browse files
fix(compiler): strip <script> tag from templates
Fixes angular#2766 Closes angular#3486
1 parent 339071c commit 748c2d6

3 files changed

Lines changed: 39 additions & 2 deletions

File tree

modules/angular2/src/render/dom/compiler/compiler.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ export class DomCompiler extends RenderCompiler {
8282
var pipeline = new CompilePipeline(this._stepFactory.createSteps(viewDef));
8383

8484
var compiledStyles = pipeline.processStyles(templateAndStyles.styles);
85-
var compileElements = pipeline.processElements(DOM.createTemplate(templateAndStyles.template),
86-
protoViewType, viewDef);
85+
var compileElements = pipeline.processElements(
86+
this._createTemplateElm(templateAndStyles.template), protoViewType, viewDef);
8787
if (viewDef.encapsulation === ViewEncapsulation.NATIVE) {
8888
prependAll(DOM.content(compileElements[0].element),
8989
compiledStyles.map(style => DOM.createStyleElement(style)));
@@ -95,6 +95,17 @@ export class DomCompiler extends RenderCompiler {
9595
compileElements[0].inheritedProtoView.build(this._schemaRegistry, this._templateCloner));
9696
}
9797

98+
_createTemplateElm(template: string) {
99+
var templateElm = DOM.createTemplate(template);
100+
var scriptTags = DOM.querySelectorAll(DOM.templateAwareRoot(templateElm), 'script');
101+
102+
for (var i = 0; i < scriptTags.length; i++) {
103+
DOM.remove(scriptTags[i]);
104+
}
105+
106+
return templateElm;
107+
}
108+
98109
_normalizeViewEncapsulationIfThereAreNoStyles(viewDef: ViewDefinition): ViewDefinition {
99110
if (viewDef.encapsulation === ViewEncapsulation.EMULATED) {
100111
return new ViewDefinition({

modules/angular2/test/core/compiler/integration_spec.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,6 +1130,22 @@ export function main() {
11301130
}));
11311131
});
11321132

1133+
describe("corner cases", () => {
1134+
it('should remove script tags from templates',
1135+
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => {
1136+
tcb.overrideView(MyComp, new viewAnn.View({
1137+
template: `
1138+
<script>alert("Ooops");</script>
1139+
<div>before<script>alert("Ooops");</script><span>inside</span>after</div>`
1140+
}))
1141+
.createAsync(MyComp)
1142+
.then((rootTC) => {
1143+
expect(DOM.querySelectorAll(rootTC.nativeElement, 'script').length).toEqual(0);
1144+
async.done();
1145+
});
1146+
}));
1147+
});
1148+
11331149
describe("error handling", () => {
11341150
it('should report a meaningful error when a directive is missing annotation',
11351151
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => {

modules/angular2/test/render/dom/compiler/compiler_common_tests.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,16 @@ export function runCompilerCommonTests() {
131131
});
132132
}));
133133

134+
it('should remove script tags from templates', inject([AsyncTestCompleter], (async) => {
135+
var compiler = createCompiler(EMPTY_STEP);
136+
compiler.compile(new ViewDefinition(
137+
{componentId: 'someId', template: '<div></div><script></script>'}))
138+
.then((protoView) => {
139+
expect(DOM.getInnerHTML(templateRoot(protoView))).toEqual('<div></div>');
140+
async.done();
141+
});
142+
}));
143+
134144
it('should report loading errors', inject([AsyncTestCompleter], (async) => {
135145
var compiler = createCompiler(EMPTY_STEP, null, new Map());
136146
PromiseWrapper.catchError(

0 commit comments

Comments
 (0)