X Tutup
Skip to content

Commit 73b7d99

Browse files
committed
fix(style_url_resolver): fix data: url resolution
1 parent 192cf9d commit 73b7d99

File tree

4 files changed

+41
-3
lines changed

4 files changed

+41
-3
lines changed

modules/angular2/src/facade/lang.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,10 @@ export class RegExpWrapper {
263263
regExp.lastIndex = 0;
264264
return regExp.exec(input);
265265
}
266-
static test(regExp: RegExp, input: string): boolean { return regExp.test(input); }
266+
static test(regExp: RegExp, input: string): boolean {
267+
regExp.lastIndex = 0;
268+
return regExp.test(input);
269+
}
267270
static matcher(regExp: RegExp, input: string): {
268271
re: RegExp;
269272
input: string

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// https://github.com/webcomponents/webcomponentsjs/blob/master/src/HTMLImports/path.js
33

44
import {Injectable} from 'angular2/di';
5-
import {RegExp, StringWrapper} from 'angular2/src/facade/lang';
5+
import {RegExp, RegExpWrapper, StringWrapper} from 'angular2/src/facade/lang';
66
import {UrlResolver} from 'angular2/src/services/url_resolver';
77

88
/**
@@ -21,7 +21,12 @@ export class StyleUrlResolver {
2121
_replaceUrls(cssText: string, re: RegExp, baseUrl: string) {
2222
return StringWrapper.replaceAllMapped(cssText, re, (m) => {
2323
var pre = m[1];
24-
var url = StringWrapper.replaceAll(m[2], _quoteRe, '');
24+
var originalUrl = m[2];
25+
if (RegExpWrapper.test(_dataUrlRe, originalUrl)) {
26+
// Do not attempt to resolve data: URLs
27+
return m[0];
28+
}
29+
var url = StringWrapper.replaceAll(originalUrl, _quoteRe, '');
2530
var post = m[3];
2631

2732
var resolvedUrl = this._resolver.resolve(baseUrl, url);
@@ -34,3 +39,4 @@ export class StyleUrlResolver {
3439
var _cssUrlRe = /(url\()([^)]*)(\))/g;
3540
var _cssImportRe = /(@import[\s]+(?!url\())['"]([^'"]*)['"](.*;)/g;
3641
var _quoteRe = /['"]/g;
42+
var _dataUrlRe = /^['"]?data:/g;

modules/angular2/test/facade/lang_spec.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ export function main() {
2424

2525
expect(indexes).toEqual([1, 4, 8, 9]);
2626
});
27+
28+
it('should reset before it is reused', () => {
29+
var re = /^['"]/g;
30+
var str = "'";
31+
expect(RegExpWrapper.test(re, str)).toEqual(true);
32+
// If not reset, the second attempt to test results in false
33+
expect(RegExpWrapper.test(re, str)).toEqual(true);
34+
});
2735
});
2836

2937
describe('const', () => {

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,26 @@ export function main() {
7070
var resolvedCss = styleUrlResolver.resolveUrls(css, 'http://ng.io');
7171
expect(resolvedCss).toEqual(expectedCss);
7272
});
73+
74+
it('should not strip quotes from inlined SVG styles', () => {
75+
var css = `
76+
.selector {
77+
background:rgb(55,71,79) url('data:image/svg+xml;utf8,<?xml version="1.0"?>');
78+
background:rgb(55,71,79) url("data:image/svg+xml;utf8,<?xml version='1.0'?>");
79+
background:rgb(55,71,79) url("/some/data:image");
80+
}
81+
`;
82+
83+
var expectedCss = `
84+
.selector {
85+
background:rgb(55,71,79) url('data:image/svg+xml;utf8,<?xml version="1.0"?>');
86+
background:rgb(55,71,79) url("data:image/svg+xml;utf8,<?xml version='1.0'?>");
87+
background:rgb(55,71,79) url('http://ng.io/some/data:image');
88+
}
89+
`;
90+
91+
var resolvedCss = styleUrlResolver.resolveUrls(css, 'http://ng.io');
92+
expect(resolvedCss).toEqual(expectedCss);
93+
});
7394
});
7495
}

0 commit comments

Comments
 (0)
X Tutup