Skip to content

Commit 06aaa0c

Browse files
committed
refactor(UrlResolver): extract app url resolution into AppRootUrl
fixes angular#1732
1 parent 8c993dc commit 06aaa0c

File tree

7 files changed

+43
-29
lines changed

7 files changed

+43
-29
lines changed

modules/angular2/src/core/application.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import {ComponentUrlMapper} from 'angular2/src/core/compiler/component_url_mappe
4444
import {UrlResolver} from 'angular2/src/services/url_resolver';
4545
import {StyleUrlResolver} from 'angular2/src/render/dom/shadow_dom/style_url_resolver';
4646
import {StyleInliner} from 'angular2/src/render/dom/shadow_dom/style_inliner';
47+
import {AppRootUrl} from 'angular2/src/services/app_root_url';
4748
import {
4849
ComponentRef,
4950
DynamicComponentLoader
@@ -133,7 +134,8 @@ function _injectorBindings(appComponentType): List<Type | Binding | List<any>> {
133134
StyleUrlResolver,
134135
StyleInliner,
135136
DynamicComponentLoader,
136-
Testability
137+
Testability,
138+
AppRootUrl
137139
];
138140
}
139141

modules/angular2/src/core/compiler/compiler.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {View} from '../annotations_impl/view';
2323
import {ComponentUrlMapper} from './component_url_mapper';
2424
import {ProtoViewFactory} from './proto_view_factory';
2525
import {UrlResolver} from 'angular2/src/services/url_resolver';
26+
import {AppRootUrl} from 'angular2/src/services/app_root_url';
2627

2728
import * as renderApi from 'angular2/src/render/api';
2829

@@ -74,14 +75,15 @@ export class Compiler {
7475

7576
constructor(reader: DirectiveResolver, cache: CompilerCache, templateResolver: TemplateResolver,
7677
componentUrlMapper: ComponentUrlMapper, urlResolver: UrlResolver,
77-
render: renderApi.RenderCompiler, protoViewFactory: ProtoViewFactory) {
78+
render: renderApi.RenderCompiler, protoViewFactory: ProtoViewFactory,
79+
appUrl: AppRootUrl) {
7880
this._reader = reader;
7981
this._compilerCache = cache;
8082
this._compiling = new Map();
8183
this._templateResolver = templateResolver;
8284
this._componentUrlMapper = componentUrlMapper;
8385
this._urlResolver = urlResolver;
84-
this._appUrl = urlResolver.resolve(null, './');
86+
this._appUrl = appUrl.value;
8587
this._render = render;
8688
this._protoViewFactory = protoViewFactory;
8789
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import {Injectable} from 'angular2/di';
2+
import {isBlank} from 'angular2/src/facade/lang';
3+
import {DOM} from 'angular2/src/dom/dom_adapter';
4+
5+
@Injectable()
6+
export class AppRootUrl {
7+
private _value: string;
8+
9+
get value() {
10+
if (isBlank(this._value)) {
11+
var a = DOM.createElement('a');
12+
DOM.resolveAndSetHref(a, './', null);
13+
this._value = DOM.getHref(a);
14+
}
15+
16+
return this._value;
17+
}
18+
}

modules/angular2/src/services/url_resolver.ts

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,7 @@ export class UrlResolver {
1313
}
1414

1515
/**
16-
* Resolves the `url` given the `baseUrl`.
17-
*
18-
* ## When the `baseUrl` is null
19-
*
20-
* `url` is resolved in the context of the current document.
21-
* If the document location is 'http://www.foo.com/base' and the `url` is 'path/to/here', the
22-
* resolved url will be
23-
* 'http://www.foo.com/base/path/to/here'
24-
*
25-
* ## When the `baseUrl` is not null
26-
*
16+
* Resolves the `url` given the `baseUrl`:
2717
* - when the `url` is null, the `baseUrl` is returned,
2818
* - due to a limitation in the process used to resolve urls (a HTMLLinkElement), `url` must not
2919
* start with a `/`,
@@ -37,11 +27,6 @@ export class UrlResolver {
3727
* @returns {string} the resolved URL
3828
*/
3929
resolve(baseUrl: string, url: string): string {
40-
if (isBlank(baseUrl)) {
41-
DOM.resolveAndSetHref(UrlResolver.a, url, null);
42-
return DOM.getHref(UrlResolver.a);
43-
}
44-
4530
if (isBlank(url) || url == '') return baseUrl;
4631

4732
if (url[0] == '/') {

modules/angular2/src/test_lib/test_injector.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
import {XHR} from 'angular2/src/render/xhr';
2323
import {ComponentUrlMapper} from 'angular2/src/core/compiler/component_url_mapper';
2424
import {UrlResolver} from 'angular2/src/services/url_resolver';
25+
import {AppRootUrl} from 'angular2/src/services/app_root_url';
2526
import {StyleUrlResolver} from 'angular2/src/render/dom/shadow_dom/style_url_resolver';
2627
import {StyleInliner} from 'angular2/src/render/dom/shadow_dom/style_inliner';
2728
import {NgZone} from 'angular2/src/core/zone/ng_zone';
@@ -115,6 +116,7 @@ function _getAppBindings() {
115116
bind(XHR).toClass(MockXHR),
116117
ComponentUrlMapper,
117118
UrlResolver,
119+
AppRootUrl,
118120
StyleUrlResolver,
119121
StyleInliner,
120122
TestBed,

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import {
3434
import {ProtoViewFactory} from 'angular2/src/core/compiler/proto_view_factory';
3535

3636
import {UrlResolver} from 'angular2/src/services/url_resolver';
37+
import {AppRootUrl} from 'angular2/src/services/app_root_url';
3738
import * as renderApi from 'angular2/src/render/api';
3839
// TODO(tbosch): Spys don't support named modules...
3940
import {RenderCompiler} from 'angular2/src/render/api';
@@ -68,7 +69,7 @@ export function main() {
6869

6970
protoViewFactory = new FakeProtoViewFactory(protoViewFactoryResults);
7071
return new Compiler(directiveResolver, new CompilerCache(), tplResolver, cmpUrlMapper,
71-
urlResolver, renderCompiler, protoViewFactory);
72+
urlResolver, renderCompiler, protoViewFactory, new FakeAppRootUrl());
7273
}
7374

7475
describe('serialize template', () => {
@@ -567,13 +568,11 @@ class SpyRenderCompiler extends SpyObject {
567568
class FakeUrlResolver extends UrlResolver {
568569
constructor() { super(); }
569570

570-
resolve(baseUrl: string, url: string): string {
571-
if (baseUrl === null && url == './') {
572-
return 'http://www.app.com';
573-
}
571+
resolve(baseUrl: string, url: string): string { return baseUrl + url; }
572+
}
574573

575-
return baseUrl + url;
576-
}
574+
class FakeAppRootUrl extends AppRootUrl {
575+
get value() { return 'http://www.app.com/'; }
577576
}
578577

579578

modules/benchmarks/src/compiler/compiler_benchmark.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import {TemplateResolver} from 'angular2/src/core/compiler/template_resolver';
1818
import {UrlResolver} from 'angular2/src/services/url_resolver';
1919
import {StyleUrlResolver} from 'angular2/src/render/dom/shadow_dom/style_url_resolver';
2020
import {StyleInliner} from 'angular2/src/render/dom/shadow_dom/style_inliner';
21+
import {AppRootUrl} from 'angular2/src/services/app_root_url';
22+
2123
import {ComponentUrlMapper} from 'angular2/src/core/compiler/component_url_mapper';
2224

2325
import {reflector} from 'angular2/src/reflection/reflection';
@@ -42,9 +44,9 @@ export function main() {
4244
var shadowDomStrategy = new NativeShadowDomStrategy(styleInliner, styleUrlResolver);
4345
var renderCompiler = new rc.DefaultDomCompiler(new Parser(new Lexer()), shadowDomStrategy,
4446
new TemplateLoader(null, urlResolver));
45-
var compiler =
46-
new Compiler(reader, cache, templateResolver, new ComponentUrlMapper(), urlResolver,
47-
renderCompiler, new ProtoViewFactory(new DynamicChangeDetection(null)));
47+
var compiler = new Compiler(
48+
reader, cache, templateResolver, new ComponentUrlMapper(), urlResolver, renderCompiler,
49+
new ProtoViewFactory(new DynamicChangeDetection(null)), new FakeAppRootUrl());
4850

4951
function measureWrapper(func, desc) {
5052
return function() {
@@ -164,3 +166,7 @@ class BenchmarkComponentNoBindings {
164166
})
165167
class BenchmarkComponentWithBindings {
166168
}
169+
170+
class FakeAppRootUrl extends AppRootUrl {
171+
get value() { return ''; }
172+
}

0 commit comments

Comments
 (0)