From 235dec26fc583c939f983da1c1451c5d6cd8c3b3 Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Tue, 11 Aug 2015 22:17:39 -0700 Subject: [PATCH] fix(browser_adapter.ts): baseElement.getAttribute currently throwing an error ```error Error during instantiation of LocationStrategy! (RouterLink -> Router -> Location -> LocationStrategy). ORIGINAL ERROR: TypeError: baseElement.attr is not a function ``` Closes #3214 --- modules/angular2/src/dom/browser_adapter.dart | 6 ++- modules/angular2/src/dom/browser_adapter.ts | 3 +- modules/angular2/src/dom/dom_adapter.ts | 1 + modules/angular2/src/dom/html_adapter.dart | 4 ++ modules/angular2/src/dom/parse5_adapter.ts | 2 + modules/angular2/test/dom/dom_adapter_spec.ts | 39 ++++++++++++++++++- 6 files changed, 52 insertions(+), 3 deletions(-) diff --git a/modules/angular2/src/dom/browser_adapter.dart b/modules/angular2/src/dom/browser_adapter.dart index a9877015c6..529541ac06 100644 --- a/modules/angular2/src/dom/browser_adapter.dart +++ b/modules/angular2/src/dom/browser_adapter.dart @@ -423,7 +423,11 @@ class BrowserDomAdapter extends GenericBrowserDomAdapter { return null; } var baseUri = Uri.parse(href); - return baseUri.path; + return baseUri.path[0] == '/' ? baseUri.path : ('/' + baseUri.path); + } + + resetBaseElement() { + baseElement = null; } String getUserAgent() { diff --git a/modules/angular2/src/dom/browser_adapter.ts b/modules/angular2/src/dom/browser_adapter.ts index 6bc55fce6a..ddd52cb2f1 100644 --- a/modules/angular2/src/dom/browser_adapter.ts +++ b/modules/angular2/src/dom/browser_adapter.ts @@ -297,6 +297,7 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter { } return relativePath(href); } + resetBaseElement(): void { baseElement = null; } getUserAgent(): string { return window.navigator.userAgent; } setData(element, name: string, value: string) { element.dataset[name] = value; } getData(element, name: string): string { return element.dataset[name]; } @@ -313,7 +314,7 @@ function getBaseElementHref(): string { return null; } } - return baseElement.attr('href'); + return baseElement.getAttribute('href'); } // based on urlUtils.js in AngularJS 1 diff --git a/modules/angular2/src/dom/dom_adapter.ts b/modules/angular2/src/dom/dom_adapter.ts index 8c9e1cb75c..976776d3d0 100644 --- a/modules/angular2/src/dom/dom_adapter.ts +++ b/modules/angular2/src/dom/dom_adapter.ts @@ -127,6 +127,7 @@ export class DomAdapter { getHistory(): History { throw _abstract(); } getLocation(): Location { throw _abstract(); } getBaseHref(): string { throw _abstract(); } + resetBaseElement(): void { throw _abstract(); } getUserAgent(): string { throw _abstract(); } setData(element, name: string, value: string) { throw _abstract(); } getData(element, name: string): string { throw _abstract(); } diff --git a/modules/angular2/src/dom/html_adapter.dart b/modules/angular2/src/dom/html_adapter.dart index 9854ba0cc9..41bdd9b951 100644 --- a/modules/angular2/src/dom/html_adapter.dart +++ b/modules/angular2/src/dom/html_adapter.dart @@ -400,6 +400,10 @@ class Html5LibDomAdapter implements DomAdapter { throw 'not implemented'; } + resetBaseElement() { + throw 'not implemented'; + } + String getUserAgent() { throw 'not implemented'; } diff --git a/modules/angular2/src/dom/parse5_adapter.ts b/modules/angular2/src/dom/parse5_adapter.ts index 7f9c3a40c8..5cba9e858c 100644 --- a/modules/angular2/src/dom/parse5_adapter.ts +++ b/modules/angular2/src/dom/parse5_adapter.ts @@ -532,6 +532,8 @@ export class Parse5DomAdapter extends DomAdapter { return this.defaultDoc().body; } } + getBaseHref(): string { throw 'not implemented'; } + resetBaseElement(): void { throw 'not implemented'; } getHistory(): History { throw 'not implemented'; } getLocation(): Location { throw 'not implemented'; } getUserAgent(): string { return "Fake user agent"; } diff --git a/modules/angular2/test/dom/dom_adapter_spec.ts b/modules/angular2/test/dom/dom_adapter_spec.ts index 978bf1678e..814c0d2f61 100644 --- a/modules/angular2/test/dom/dom_adapter_spec.ts +++ b/modules/angular2/test/dom/dom_adapter_spec.ts @@ -49,5 +49,42 @@ export function main() { expect(DOM.isElementNode(secondChild)).toBe(true); }); + + if (DOM.supportsDOMEvents()) { + describe('getBaseHref', () => { + beforeEach(() => DOM.resetBaseElement()); + + it('should return null if base element is absent', + () => { expect(DOM.getBaseHref()).toBeNull(); }); + + it('should return the value of the base element', () => { + var baseEl = DOM.createElement('base'); + DOM.setAttribute(baseEl, 'href', '/drop/bass/connon/'); + var headEl = DOM.defaultDoc().head; + DOM.appendChild(headEl, baseEl); + + var baseHref = DOM.getBaseHref(); + DOM.removeChild(headEl, baseEl); + DOM.resetBaseElement(); + + expect(baseHref).toEqual('/drop/bass/connon/'); + }); + + it('should return a relative url', () => { + var baseEl = DOM.createElement('base'); + DOM.setAttribute(baseEl, 'href', 'base'); + var headEl = DOM.defaultDoc().head; + DOM.appendChild(headEl, baseEl); + + var baseHref = DOM.getBaseHref(); + DOM.removeChild(headEl, baseEl); + DOM.resetBaseElement(); + + expect(baseHref).toEqual('/base'); + }); + }); + } + + }); -} \ No newline at end of file +}