diff --git a/modules/angular2/src/compiler/html_parser.ts b/modules/angular2/src/compiler/html_parser.ts index 301f1a3ad7..af1fe27c08 100644 --- a/modules/angular2/src/compiler/html_parser.ts +++ b/modules/angular2/src/compiler/html_parser.ts @@ -16,7 +16,7 @@ import {HtmlAst, HtmlAttrAst, HtmlTextAst, HtmlElementAst} from './html_ast'; import {Injectable} from 'angular2/src/core/di'; import {HtmlToken, HtmlTokenType, tokenizeHtml} from './html_lexer'; import {ParseError, ParseLocation, ParseSourceSpan} from './parse_util'; -import {HtmlTagDefinition, getHtmlTagDefinition, getNsPrefix, mergeNsAndName} from './html_tags'; +import {HtmlTagDefinition, getHtmlTagDefinition, getNsPrefix} from './html_tags'; export class HtmlTreeError extends ParseError { static create(elementName: string, location: ParseLocation, msg: string): HtmlTreeError { @@ -238,6 +238,10 @@ class TreeBuilder { } } +function mergeNsAndName(prefix: string, localName: string): string { + return isPresent(prefix) ? `@${prefix}:${localName}` : localName; +} + function getElementFullName(prefix: string, localName: string, parentElement: HtmlElementAst): string { if (isBlank(prefix)) { diff --git a/modules/angular2/src/compiler/html_tags.ts b/modules/angular2/src/compiler/html_tags.ts index 315f0521dd..d749cf3844 100644 --- a/modules/angular2/src/compiler/html_tags.ts +++ b/modules/angular2/src/compiler/html_tags.ts @@ -420,7 +420,3 @@ export function splitNsName(elementName: string): string[] { export function getNsPrefix(elementName: string): string { return splitNsName(elementName)[0]; } - -export function mergeNsAndName(prefix: string, localName: string): string { - return isPresent(prefix) ? `@${prefix}:${localName}` : localName; -} diff --git a/modules/angular2/src/compiler/template_parser.ts b/modules/angular2/src/compiler/template_parser.ts index f7796caaff..dd3c970d8a 100644 --- a/modules/angular2/src/compiler/template_parser.ts +++ b/modules/angular2/src/compiler/template_parser.ts @@ -7,10 +7,11 @@ import {Parser, AST, ASTWithSource} from 'angular2/src/core/change_detection/cha import {TemplateBinding} from 'angular2/src/core/change_detection/parser/ast'; import {CompileDirectiveMetadata, CompilePipeMetadata} from './directive_metadata'; import {HtmlParser} from './html_parser'; -import {splitNsName, mergeNsAndName} from './html_tags'; +import {splitNsName} from './html_tags'; import {ParseSourceSpan, ParseError, ParseLocation} from './parse_util'; import {RecursiveAstVisitor, BindingPipe} from 'angular2/src/core/change_detection/parser/ast'; + import { ElementAst, BoundElementPropertyAst, @@ -583,12 +584,6 @@ class TemplateParseVisitor implements HtmlAstVisitor { } else { if (parts[0] == ATTRIBUTE_PREFIX) { boundPropertyName = parts[1]; - let nsSeparatorIdx = boundPropertyName.indexOf(':'); - if (nsSeparatorIdx > -1) { - let ns = boundPropertyName.substring(0, nsSeparatorIdx); - let name = boundPropertyName.substring(nsSeparatorIdx + 1); - boundPropertyName = mergeNsAndName(ns, name); - } bindingType = PropertyBindingType.Attribute; } else if (parts[0] == CLASS_PREFIX) { boundPropertyName = parts[1]; diff --git a/modules/angular2/src/platform/browser/browser_adapter.dart b/modules/angular2/src/platform/browser/browser_adapter.dart index 8ad87e73b1..34ace25a21 100644 --- a/modules/angular2/src/platform/browser/browser_adapter.dart +++ b/modules/angular2/src/platform/browser/browser_adapter.dart @@ -365,15 +365,9 @@ class BrowserDomAdapter extends GenericBrowserDomAdapter { bool hasAttribute(Element element, String attribute) => element.attributes.containsKey(attribute); - bool hasAttributeNS(Element element, String ns, String attribute) => - element.getAttributeNS(ns, attribute) != null; - String getAttribute(Element element, String attribute) => element.getAttribute(attribute); - String getAttributeNS(Element element, String ns, String attribute) => - element.getAttributeNS(ns, attribute); - void setAttribute(Element element, String name, String value) { element.setAttribute(name, value); } @@ -388,10 +382,6 @@ class BrowserDomAdapter extends GenericBrowserDomAdapter { element.attributes.remove(name); } - void removeAttributeNS(Element element, String ns, String name) { - element.getNamespacedAttributes(ns).remove(name); - } - Node templateAwareRoot(Element el) => el is TemplateElement ? el.content : el; HtmlDocument createHtmlDocument() => diff --git a/modules/angular2/src/platform/browser/browser_adapter.ts b/modules/angular2/src/platform/browser/browser_adapter.ts index 474e4ea1ff..d01b723923 100644 --- a/modules/angular2/src/platform/browser/browser_adapter.ts +++ b/modules/angular2/src/platform/browser/browser_adapter.ts @@ -225,19 +225,12 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter { return res; } hasAttribute(element, attribute: string): boolean { return element.hasAttribute(attribute); } - hasAttributeNS(element, ns: string, attribute: string): boolean { - return element.hasAttributeNS(ns, attribute); - } getAttribute(element, attribute: string): string { return element.getAttribute(attribute); } - getAttributeNS(element, ns: string, name: string): string { - return element.getAttributeNS(ns, name); - } setAttribute(element, name: string, value: string) { element.setAttribute(name, value); } setAttributeNS(element, ns: string, name: string, value: string) { element.setAttributeNS(ns, name, value); } removeAttribute(element, attribute: string) { element.removeAttribute(attribute); } - removeAttributeNS(element, ns: string, name: string) { element.removeAttributeNS(ns, name); } templateAwareRoot(el): any { return this.isTemplateElement(el) ? this.content(el) : el; } createHtmlDocument(): HTMLDocument { return document.implementation.createHTMLDocument('fakeTitle'); diff --git a/modules/angular2/src/platform/dom/dom_adapter.ts b/modules/angular2/src/platform/dom/dom_adapter.ts index b058046cc4..6f183da665 100644 --- a/modules/angular2/src/platform/dom/dom_adapter.ts +++ b/modules/angular2/src/platform/dom/dom_adapter.ts @@ -97,13 +97,10 @@ export abstract class DomAdapter { abstract tagName(element): string; abstract attributeMap(element): Map; abstract hasAttribute(element, attribute: string): boolean; - abstract hasAttributeNS(element, ns: string, attribute: string): boolean; abstract getAttribute(element, attribute: string): string; - abstract getAttributeNS(element, ns: string, attribute: string): string; abstract setAttribute(element, name: string, value: string); abstract setAttributeNS(element, ns: string, name: string, value: string); abstract removeAttribute(element, attribute: string); - abstract removeAttributeNS(element, ns: string, attribute: string); abstract templateAwareRoot(el); abstract createHtmlDocument(): HTMLDocument; abstract defaultDoc(): HTMLDocument; diff --git a/modules/angular2/src/platform/dom/dom_renderer.ts b/modules/angular2/src/platform/dom/dom_renderer.ts index d64ce1094e..5b7f36551f 100644 --- a/modules/angular2/src/platform/dom/dom_renderer.ts +++ b/modules/angular2/src/platform/dom/dom_renderer.ts @@ -178,21 +178,17 @@ export class DomRenderer implements Renderer { var attrNs; var nsAndName = splitNamespace(attributeName); if (isPresent(nsAndName[0])) { - attributeName = nsAndName[1]; + attributeName = nsAndName[0] + ':' + nsAndName[1]; attrNs = NAMESPACE_URIS[nsAndName[0]]; } if (isPresent(attributeValue)) { if (isPresent(attrNs)) { DOM.setAttributeNS(renderElement, attrNs, attributeName, attributeValue); } else { - DOM.setAttribute(renderElement, attributeName, attributeValue); + DOM.setAttribute(renderElement, nsAndName[1], attributeValue); } } else { - if (isPresent(attrNs)) { - DOM.removeAttributeNS(renderElement, attrNs, attributeName); - } else { - DOM.removeAttribute(renderElement, attributeName); - } + DOM.removeAttribute(renderElement, attributeName); } } @@ -336,4 +332,4 @@ function splitNamespace(name: string): string[] { } let match = RegExpWrapper.firstMatch(NS_PREFIX_RE, name); return [match[1], match[2]]; -} +} \ No newline at end of file diff --git a/modules/angular2/src/platform/server/abstract_html_adapter.dart b/modules/angular2/src/platform/server/abstract_html_adapter.dart index f0b009eee0..7b136601a6 100644 --- a/modules/angular2/src/platform/server/abstract_html_adapter.dart +++ b/modules/angular2/src/platform/server/abstract_html_adapter.dart @@ -295,10 +295,6 @@ abstract class AbstractHtml5LibAdapter implements DomAdapter { return element.attributes.keys.any((key) => '$key' == attribute); } - hasAttributeNS(element, String ns, String attribute) { - throw 'not implemented'; - } - getAttribute(element, String attribute) { // `attributes` keys can be {@link AttributeName}s. var key = element.attributes.keys.firstWhere((key) => '$key' == attribute, @@ -306,10 +302,6 @@ abstract class AbstractHtml5LibAdapter implements DomAdapter { return element.attributes[key]; } - getAttributeNS(element, String ns, String attribute) { - throw 'not implemented'; - } - setAttribute(element, String name, String value) { element.attributes[name] = value; } @@ -322,10 +314,6 @@ abstract class AbstractHtml5LibAdapter implements DomAdapter { element.attributes.remove(attribute); } - removeAttributeNS(element, String ns, String attribute) { - throw 'not implemented'; - } - templateAwareRoot(el) => el; createHtmlDocument() { diff --git a/modules/angular2/src/platform/server/parse5_adapter.ts b/modules/angular2/src/platform/server/parse5_adapter.ts index 1d9e776229..9570c74e74 100644 --- a/modules/angular2/src/platform/server/parse5_adapter.ts +++ b/modules/angular2/src/platform/server/parse5_adapter.ts @@ -429,13 +429,11 @@ export class Parse5DomAdapter extends DomAdapter { hasAttribute(element, attribute: string): boolean { return element.attribs && element.attribs.hasOwnProperty(attribute); } - hasAttributeNS(element, ns: string, attribute: string): boolean { throw 'not implemented'; } getAttribute(element, attribute: string): string { return element.attribs && element.attribs.hasOwnProperty(attribute) ? element.attribs[attribute] : null; } - getAttributeNS(element, ns: string, attribute: string): string { throw 'not implemented'; } setAttribute(element, attribute: string, value: string) { if (attribute) { element.attribs[attribute] = value; @@ -450,7 +448,6 @@ export class Parse5DomAdapter extends DomAdapter { StringMapWrapper.delete(element.attribs, attribute); } } - removeAttributeNS(element, ns: string, name: string) { throw 'not implemented'; } templateAwareRoot(el): any { return this.isTemplateElement(el) ? this.content(el) : el; } createHtmlDocument(): Document { var newDoc = treeAdapter.createDocument(); diff --git a/modules/angular2/test/core/linker/integration_spec.ts b/modules/angular2/test/core/linker/integration_spec.ts index 8318aea3a5..6eca60cb15 100644 --- a/modules/angular2/test/core/linker/integration_spec.ts +++ b/modules/angular2/test/core/linker/integration_spec.ts @@ -1848,7 +1848,7 @@ function declareTests() { if (!IS_DART) { var firstAttribute = DOM.getProperty(use, 'attributes')[0]; - expect(firstAttribute.name).toEqual('href'); + expect(firstAttribute.name).toEqual('xlink:href'); expect(firstAttribute.namespaceURI).toEqual('http://www.w3.org/1999/xlink'); } else { // For Dart where '_Attr' has no instance getter 'namespaceURI' @@ -1860,48 +1860,6 @@ function declareTests() { })); }); - - describe('attributes', () => { - - it('should support attributes with namespace', - inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, - async) => { - tcb.overrideView(SomeCmp, new ViewMetadata({template: ''})) - .createAsync(SomeCmp) - .then((fixture) => { - let useEl = DOM.firstChild(fixture.debugElement.nativeElement); - expect(DOM.getAttributeNS(useEl, 'http://www.w3.org/1999/xlink', 'href')) - .toEqual('#id'); - async.done(); - }); - })); - - it('should support binding to attributes with namespace', - inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, - async) => { - tcb.overrideView(SomeCmp, - new ViewMetadata({template: ''})) - .createAsync(SomeCmp) - .then((fixture) => { - let cmp = fixture.debugElement.componentInstance; - let useEl = DOM.firstChild(fixture.debugElement.nativeElement); - - cmp.value = "#id"; - fixture.detectChanges(); - - expect(DOM.getAttributeNS(useEl, 'http://www.w3.org/1999/xlink', 'href')) - .toEqual('#id'); - - cmp.value = null; - fixture.detectChanges(); - - expect(DOM.hasAttributeNS(useEl, 'http://www.w3.org/1999/xlink', 'href')) - .toEqual(false); - - async.done(); - }); - })); - }); } }); } @@ -2481,8 +2439,3 @@ class DirectiveWithPropDecorators { fireEvent(msg) { ObservableWrapper.callEmit(this.event, msg); } } - -@Component({selector: 'some-cmp'}) -class SomeCmp { - value: any; -} diff --git a/modules/angular2/test/public_api_spec.ts b/modules/angular2/test/public_api_spec.ts index 1a1e118939..61051abdeb 100644 --- a/modules/angular2/test/public_api_spec.ts +++ b/modules/angular2/test/public_api_spec.ts @@ -1556,7 +1556,6 @@ var NG_PLATFORM_BROWSER = [ 'BrowserDomAdapter.firstChild():js', 'BrowserDomAdapter.getAnimationPrefix():js', 'BrowserDomAdapter.getAttribute():js', - 'BrowserDomAdapter.getAttributeNS():js', 'BrowserDomAdapter.getBaseHref():js', 'BrowserDomAdapter.getBoundingClientRect():js', 'BrowserDomAdapter.getChecked():js', @@ -1583,7 +1582,6 @@ var NG_PLATFORM_BROWSER = [ 'BrowserDomAdapter.getValue():js', 'BrowserDomAdapter.getXHR():js', 'BrowserDomAdapter.hasAttribute():js', - 'BrowserDomAdapter.hasAttributeNS():js', 'BrowserDomAdapter.hasClass():js', 'BrowserDomAdapter.hasProperty():js', 'BrowserDomAdapter.hasShadowRoot():js', @@ -1617,7 +1615,6 @@ var NG_PLATFORM_BROWSER = [ 'BrowserDomAdapter.querySelectorAll():js', 'BrowserDomAdapter.remove():js', 'BrowserDomAdapter.removeAttribute():js', - 'BrowserDomAdapter.removeAttributeNS():js', 'BrowserDomAdapter.removeChild():js', 'BrowserDomAdapter.removeClass():js', 'BrowserDomAdapter.removeStyle():js', diff --git a/tools/public_api_guard/public_api_spec.ts b/tools/public_api_guard/public_api_spec.ts index da842083c0..fbd6a20ac3 100644 --- a/tools/public_api_guard/public_api_spec.ts +++ b/tools/public_api_guard/public_api_spec.ts @@ -987,7 +987,6 @@ const BROWSER = [ 'BrowserDomAdapter.elementMatches(n:any, selector:string):boolean', 'BrowserDomAdapter.firstChild(el:any):Node', 'BrowserDomAdapter.getAttribute(element:any, attribute:string):string', - 'BrowserDomAdapter.getAttributeNS(element:any, ns:string, name:string):string', 'BrowserDomAdapter.getBaseHref():string', 'BrowserDomAdapter.getBoundingClientRect(el:any):any', 'BrowserDomAdapter.getChecked(el:any):boolean', @@ -1011,7 +1010,6 @@ const BROWSER = [ 'BrowserDomAdapter.getUserAgent():string', 'BrowserDomAdapter.getValue(el:any):string', 'BrowserDomAdapter.hasAttribute(element:any, attribute:string):boolean', - 'BrowserDomAdapter.hasAttributeNS(element:any, ns:string, attribute:string):boolean', 'BrowserDomAdapter.hasClass(element:any, className:string):boolean', 'BrowserDomAdapter.hasProperty(element:any, name:string):boolean', 'BrowserDomAdapter.hasShadowRoot(node:any):boolean', @@ -1046,7 +1044,6 @@ const BROWSER = [ 'BrowserDomAdapter.querySelectorAll(el:any, selector:string):any[]', 'BrowserDomAdapter.remove(node:any):Node', 'BrowserDomAdapter.removeAttribute(element:any, attribute:string):any', - 'BrowserDomAdapter.removeAttributeNS(element:any, ns:string, name:string):any', 'BrowserDomAdapter.removeChild(el:any, node:any):any', 'BrowserDomAdapter.removeClass(element:any, className:string):any', 'BrowserDomAdapter.removeStyle(element:any, stylename:string):any',