fix(url_resolver): in Dart make package urls relative to AppRootUrl

This commit is contained in:
yjbanov 2015-07-24 14:49:16 -07:00
parent c2bbda02a1
commit 469afda53e
18 changed files with 58 additions and 33 deletions

View File

@ -1,9 +1,15 @@
library angular2.src.services.url_resolver; library angular2.src.services.url_resolver;
import 'package:angular2/di.dart' show Injectable; import 'package:angular2/di.dart' show Injectable;
import 'package:angular2/src/services/app_root_url.dart' show AppRootUrl;
@Injectable() @Injectable()
class UrlResolver { class UrlResolver {
final AppRootUrl _appRootUrl;
UrlResolver(this._appRootUrl);
/** /**
* Resolves the `url` given the `baseUrl`: * Resolves the `url` given the `baseUrl`:
* - when the `url` is null, the `baseUrl` is returned, * - when the `url` is null, the `baseUrl` is returned,
@ -20,7 +26,8 @@ class UrlResolver {
Uri uri = Uri.parse(url); Uri uri = Uri.parse(url);
if (uri.scheme == 'package') { if (uri.scheme == 'package') {
return '/packages/${uri.path}'; var maybeSlash = _appRootUrl.value.endsWith('/') ? '' : '/';
return '${_appRootUrl.value}${maybeSlash}packages/${uri.path}';
} }
if (uri.isAbsolute) return uri.toString(); if (uri.isAbsolute) return uri.toString();

View File

@ -7,6 +7,7 @@ import {
normalizeBlank normalizeBlank
} from 'angular2/src/facade/lang'; } from 'angular2/src/facade/lang';
import {ListWrapper} from 'angular2/src/facade/collection'; import {ListWrapper} from 'angular2/src/facade/collection';
import {AppRootUrl} from 'angular2/src/services/app_root_url';
/** /**
* Used by the {@link Compiler} when resolving HTML and CSS template URLs. * Used by the {@link Compiler} when resolving HTML and CSS template URLs.
@ -17,6 +18,8 @@ import {ListWrapper} from 'angular2/src/facade/collection';
*/ */
@Injectable() @Injectable()
export class UrlResolver { export class UrlResolver {
constructor(_: AppRootUrl) {}
/** /**
* Resolves the `url` given the `baseUrl`: * Resolves the `url` given the `baseUrl`:
* - when the `url` is null, the `baseUrl` is returned, * - when the `url` is null, the `baseUrl` is returned,

View File

@ -12,6 +12,7 @@ import 'package:angular2/src/render/dom/compiler/style_url_resolver.dart';
import 'package:angular2/src/render/dom/compiler/view_loader.dart'; import 'package:angular2/src/render/dom/compiler/view_loader.dart';
import 'package:angular2/src/render/xhr.dart' show XHR; import 'package:angular2/src/render/xhr.dart' show XHR;
import 'package:angular2/src/reflection/reflection.dart'; import 'package:angular2/src/reflection/reflection.dart';
import 'package:angular2/src/services/app_root_url.dart';
import 'package:angular2/src/services/url_resolver.dart'; import 'package:angular2/src/services/url_resolver.dart';
import 'package:angular2/src/transform/common/asset_reader.dart'; import 'package:angular2/src/transform/common/asset_reader.dart';
import 'package:angular2/src/transform/common/xhr_impl.dart'; import 'package:angular2/src/transform/common/xhr_impl.dart';
@ -85,7 +86,7 @@ class _TemplateExtractor {
_TemplateExtractor(XHR xhr) _TemplateExtractor(XHR xhr)
: _factory = new CompileStepFactory(new ng.Parser(new ng.Lexer())) { : _factory = new CompileStepFactory(new ng.Parser(new ng.Lexer())) {
var urlResolver = new UrlResolver(); var urlResolver = new UrlResolver(new AppRootUrl(''));
var styleUrlResolver = new StyleUrlResolver(urlResolver); var styleUrlResolver = new StyleUrlResolver(urlResolver);
var styleInliner = new StyleInliner(xhr, styleUrlResolver, urlResolver); var styleInliner = new StyleInliner(xhr, styleUrlResolver, urlResolver);

View File

@ -48,7 +48,7 @@ export function main() {
function createCompiler(renderCompileResults: function createCompiler(renderCompileResults:
List<renderApi.ProtoViewDto | Promise<renderApi.ProtoViewDto>>, List<renderApi.ProtoViewDto | Promise<renderApi.ProtoViewDto>>,
protoViewFactoryResults: List<AppProtoView>) { protoViewFactoryResults: List<AppProtoView>) {
var urlResolver = new UrlResolver(); var urlResolver = new UrlResolver(new AppRootUrl(""));
renderCompileRequests = []; renderCompileRequests = [];
renderCompileResults = ListWrapper.clone(renderCompileResults); renderCompileResults = ListWrapper.clone(renderCompileResults);
renderCompiler.spy('compile').andCallFake((view) => { renderCompiler.spy('compile').andCallFake((view) => {
@ -399,9 +399,9 @@ export function main() {
var reader: any = new SpyDirectiveResolver(); var reader: any = new SpyDirectiveResolver();
// create the compiler // create the compiler
var compiler = var compiler = new Compiler(reader, cache, tplResolver, cmpUrlMapper,
new Compiler(reader, cache, tplResolver, cmpUrlMapper, new UrlResolver(), new UrlResolver(new AppRootUrl("")), renderCompiler,
renderCompiler, protoViewFactory, new AppRootUrl("http://www.app.com")); protoViewFactory, new AppRootUrl("http://www.app.com"));
compiler.compileInHost(MainComponent) compiler.compileInHost(MainComponent)
.then((protoViewRef) => { .then((protoViewRef) => {
// the test should have failed if the resolver was called, so we're good // the test should have failed if the resolver was called, so we're good
@ -718,4 +718,4 @@ function collectEmbeddedPvs(pv: AppProtoView, target: AppProtoView[] = null): Ap
} }
}); });
return target; return target;
} }

View File

@ -2,12 +2,14 @@ import {describe, it, expect, beforeEach, ddescribe, iit, xit, el} from 'angular
import {StyleUrlResolver} from 'angular2/src/render/dom/compiler/style_url_resolver'; import {StyleUrlResolver} from 'angular2/src/render/dom/compiler/style_url_resolver';
import {UrlResolver} from 'angular2/src/services/url_resolver'; import {UrlResolver} from 'angular2/src/services/url_resolver';
import {AppRootUrl} from 'angular2/src/services/app_root_url';
export function main() { export function main() {
describe('StyleUrlResolver', () => { describe('StyleUrlResolver', () => {
let styleUrlResolver; let styleUrlResolver;
beforeEach(() => { styleUrlResolver = new StyleUrlResolver(new UrlResolver()); }); beforeEach(
() => { styleUrlResolver = new StyleUrlResolver(new UrlResolver(new AppRootUrl(""))); });
it('should resolve "url()" urls', () => { it('should resolve "url()" urls', () => {
var css = ` var css = `

View File

@ -15,6 +15,7 @@ import {ViewLoader} from 'angular2/src/render/dom/compiler/view_loader';
import {StyleInliner} from 'angular2/src/render/dom/compiler/style_inliner'; import {StyleInliner} from 'angular2/src/render/dom/compiler/style_inliner';
import {StyleUrlResolver} from 'angular2/src/render/dom/compiler/style_url_resolver'; import {StyleUrlResolver} from 'angular2/src/render/dom/compiler/style_url_resolver';
import {UrlResolver} from 'angular2/src/services/url_resolver'; import {UrlResolver} from 'angular2/src/services/url_resolver';
import {AppRootUrl} from 'angular2/src/services/app_root_url';
import {ViewDefinition} from 'angular2/src/render/api'; import {ViewDefinition} from 'angular2/src/render/api';
import {PromiseWrapper, Promise} from 'angular2/src/facade/async'; import {PromiseWrapper, Promise} from 'angular2/src/facade/async';
@ -28,7 +29,7 @@ export function main() {
beforeEach(() => { beforeEach(() => {
xhr = new MockXHR(); xhr = new MockXHR();
urlResolver = new UrlResolver(); urlResolver = new UrlResolver(new AppRootUrl(''));
styleUrlResolver = new StyleUrlResolver(urlResolver); styleUrlResolver = new StyleUrlResolver(urlResolver);
let styleInliner = new StyleInliner(xhr, styleUrlResolver, urlResolver); let styleInliner = new StyleInliner(xhr, styleUrlResolver, urlResolver);
loader = new ViewLoader(xhr, styleInliner, styleUrlResolver); loader = new ViewLoader(xhr, styleInliner, styleUrlResolver);

View File

@ -1,9 +1,21 @@
import {describe, it, expect, beforeEach, ddescribe, iit, xit, el} from 'angular2/test_lib'; import {
describe,
it,
expect,
beforeEach,
ddescribe,
iit,
xit,
el,
IS_DARTIUM
} from 'angular2/test_lib';
import {UrlResolver} from 'angular2/src/services/url_resolver'; import {UrlResolver} from 'angular2/src/services/url_resolver';
import {AppRootUrl} from 'angular2/src/services/app_root_url';
export function main() { export function main() {
describe('UrlResolver', () => { describe('UrlResolver', () => {
var resolver = new UrlResolver(); var appRootUrl = new AppRootUrl('http://localhost/example/');
var resolver = new UrlResolver(appRootUrl);
describe('absolute base url', () => { describe('absolute base url', () => {
it('should add a relative path to the base url', () => { it('should add a relative path to the base url', () => {
@ -70,5 +82,14 @@ export function main() {
expect(resolver.resolve('foo/baz/', '/bar')).toEqual('/bar'); expect(resolver.resolve('foo/baz/', '/bar')).toEqual('/bar');
}); });
}); });
if (IS_DARTIUM) {
describe('package url', () => {
it('should be served relative to AppRootUrl', () => {
expect(resolver.resolve('foo', 'package:bar/baz.dart'))
.toEqual('http://localhost/example/packages/bar/baz.dart');
});
});
}
}); });
} }

View File

@ -35,7 +35,7 @@ export function main() {
var cache = new CompilerCache(); var cache = new CompilerCache();
var viewResolver = new MultipleViewResolver( var viewResolver = new MultipleViewResolver(
count, [BenchmarkComponentNoBindings, BenchmarkComponentWithBindings]); count, [BenchmarkComponentNoBindings, BenchmarkComponentWithBindings]);
var urlResolver = new UrlResolver(); var urlResolver = new UrlResolver(new AppRootUrl(""));
var shadowDomStrategy = new NativeShadowDomStrategy(); var shadowDomStrategy = new NativeShadowDomStrategy();
var renderCompiler = new rc.DefaultDomCompiler(new Parser(new Lexer()), shadowDomStrategy, var renderCompiler = new rc.DefaultDomCompiler(new Parser(new Lexer()), shadowDomStrategy,
new ViewLoader(null, null, null)); new ViewLoader(null, null, null));

View File

@ -37,5 +37,5 @@ class DemoApp {
export function main() { export function main() {
commonDemoSetup(); commonDemoSetup();
bootstrap(DemoApp, [bind(UrlResolver).toValue(new DemoUrlResolver())]); bootstrap(DemoApp, [bind(UrlResolver).toClass(DemoUrlResolver)]);
} }

View File

@ -20,5 +20,5 @@ class DemoApp {
export function main() { export function main() {
commonDemoSetup(); commonDemoSetup();
bootstrap(DemoApp, [bind(UrlResolver).toValue(new DemoUrlResolver())]); bootstrap(DemoApp, [bind(UrlResolver).toClass(DemoUrlResolver)]);
} }

View File

@ -2,22 +2,12 @@ library angular2_examples.material.demo_common;
import 'package:angular2/src/dom/browser_adapter.dart'; import 'package:angular2/src/dom/browser_adapter.dart';
import 'package:angular2/src/services/url_resolver.dart'; import 'package:angular2/src/services/url_resolver.dart';
import 'package:angular2/src/services/app_root_url.dart';
void commonDemoSetup() { void commonDemoSetup() {
BrowserDomAdapter.makeCurrent(); BrowserDomAdapter.makeCurrent();
} }
class DemoUrlResolver extends UrlResolver { class DemoUrlResolver extends UrlResolver {
DemoUrlResolver(AppRootUrl appRootUrl) : super(appRootUrl);
@override
String resolve(String baseUrl, String url) {
const MATERIAL_PKG = 'package:angular2_material/';
// We run a proxy server in front of pub serve that prepends "example" to
// paths
if (url.startsWith(MATERIAL_PKG)) {
return '/examples/packages/angular2_material/' + url.substring(MATERIAL_PKG.length);
}
return super.resolve(baseUrl, url);
}
} }

View File

@ -19,7 +19,7 @@ export function commonDemoSetup(): void {
@Injectable() @Injectable()
export class DemoUrlResolver extends UrlResolver { export class DemoUrlResolver extends UrlResolver {
constructor() { constructor() {
super(); super(null);
} }
resolve(baseUrl: string, url: string): string { resolve(baseUrl: string, url: string): string {

View File

@ -92,5 +92,5 @@ class SimpleDialogComponent {
export function main() { export function main() {
commonDemoSetup(); commonDemoSetup();
bootstrap(DemoApp, [bind(UrlResolver).toValue(new DemoUrlResolver())]); bootstrap(DemoApp, [bind(UrlResolver).toClass(DemoUrlResolver)]);
} }

View File

@ -18,5 +18,5 @@ class DemoApp {
export function main() { export function main() {
commonDemoSetup(); commonDemoSetup();
bootstrap(DemoApp, [bind(UrlResolver).toValue(new DemoUrlResolver())]); bootstrap(DemoApp, [bind(UrlResolver).toClass(DemoUrlResolver)]);
} }

View File

@ -12,5 +12,5 @@ class DemoApp {
export function main() { export function main() {
commonDemoSetup(); commonDemoSetup();
bootstrap(DemoApp, [bind(UrlResolver).toValue(new DemoUrlResolver())]); bootstrap(DemoApp, [bind(UrlResolver).toClass(DemoUrlResolver)]);
} }

View File

@ -20,5 +20,5 @@ class DemoApp {
export function main() { export function main() {
commonDemoSetup(); commonDemoSetup();
bootstrap(DemoApp, [bind(UrlResolver).toValue(new DemoUrlResolver())]); bootstrap(DemoApp, [bind(UrlResolver).toClass(DemoUrlResolver)]);
} }

View File

@ -37,5 +37,5 @@ class DemoApp {
export function main() { export function main() {
commonDemoSetup(); commonDemoSetup();
bootstrap(DemoApp, [bind(UrlResolver).toValue(new DemoUrlResolver())]); bootstrap(DemoApp, [bind(UrlResolver).toClass(DemoUrlResolver)]);
} }

View File

@ -20,5 +20,5 @@ class DemoApp {
export function main() { export function main() {
commonDemoSetup(); commonDemoSetup();
bootstrap(DemoApp, [bind(UrlResolver).toValue(new DemoUrlResolver())]); bootstrap(DemoApp, [bind(UrlResolver).toClass(DemoUrlResolver)]);
} }