fix(url_resolver): in Dart make package urls relative to AppRootUrl
This commit is contained in:
parent
c2bbda02a1
commit
469afda53e
@ -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();
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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 = `
|
||||||
|
@ -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);
|
||||||
|
@ -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');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
|
@ -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)]);
|
||||||
}
|
}
|
||||||
|
@ -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)]);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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)]);
|
||||||
}
|
}
|
||||||
|
@ -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)]);
|
||||||
}
|
}
|
||||||
|
@ -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)]);
|
||||||
}
|
}
|
||||||
|
@ -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)]);
|
||||||
}
|
}
|
||||||
|
@ -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)]);
|
||||||
}
|
}
|
||||||
|
@ -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)]);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user