Skip to content

Commit 540b8c2

Browse files
committed
fix(renderer): support xlink:href attribute in svg
Closes #4956
1 parent dc6a066 commit 540b8c2

4 files changed

Lines changed: 27 additions & 18 deletions

File tree

modules/angular2/src/core/dom/browser_adapter.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,14 @@ class BrowserDomAdapter extends GenericBrowserDomAdapter {
346346
String tagName(Element element) => element.tagName;
347347

348348
Map<String, String> attributeMap(Element element) {
349-
return new Map.from(element.attributes);
349+
var result = {};
350+
result.addAll(element.attributes);
351+
// TODO(tbosch): element.getNamespacedAttributes() somehow does not return the attribute value
352+
var xlinkHref = element.getAttributeNS('http://www.w3.org/1999/xlink', 'href');
353+
if (xlinkHref != null) {
354+
result['xlink:href'] = xlinkHref;
355+
}
356+
return result;
350357
}
351358

352359
bool hasAttribute(Element element, String attribute) =>

modules/angular2/src/core/dom/browser_adapter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter {
226226
hasAttribute(element, attribute: string): boolean { return element.hasAttribute(attribute); }
227227
getAttribute(element, attribute: string): string { return element.getAttribute(attribute); }
228228
setAttribute(element, name: string, value: string) { element.setAttribute(name, value); }
229-
setAttributeNS(ns: string, element, name: string, value: string) {
229+
setAttributeNS(element, ns: string, name: string, value: string) {
230230
element.setAttributeNS(ns, name, value);
231231
}
232232
removeAttribute(element, attribute: string) { element.removeAttribute(attribute); }

modules/angular2/src/core/render/dom/dom_renderer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ const SVG_ELEMENT_NAMES = CONST_EXPR({
116116
'vkern': true
117117
});
118118

119-
const SVG_ATTR_NAMESPACES = CONST_EXPR({'href': XLINK_NAMESPACE});
119+
const SVG_ATTR_NAMESPACES = CONST_EXPR({'href': XLINK_NAMESPACE, 'xlink:href': XLINK_NAMESPACE});
120120

121121
export abstract class DomRenderer extends Renderer implements NodeFactory<Node> {
122122
abstract registerComponentTemplate(templateId: number, commands: RenderTemplateCmd[],

modules/angular2/test/core/linker/integration_spec.ts

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1745,22 +1745,24 @@ export function main() {
17451745
if (DOM.supportsDOMEvents()) {
17461746
describe('svg', () => {
17471747
it('should support svg elements',
1748-
inject([TestComponentBuilder, AsyncTestCompleter],
1749-
(tcb: TestComponentBuilder, async) => {
1750-
tcb.overrideView(MyComp, new ViewMetadata({template: '<svg><g></g></svg>'}))
1751-
.createAsync(MyComp)
1752-
.then((rootTC) => {
1753-
var el = rootTC.debugElement.nativeElement;
1754-
var svg = DOM.childNodes(el)[0];
1755-
var g = DOM.childNodes(svg)[0];
1756-
expect(DOM.getProperty(<Element>svg, 'namespaceURI'))
1757-
.toEqual('http://www.w3.org/2000/svg');
1758-
expect(DOM.getProperty(<Element>g, 'namespaceURI'))
1759-
.toEqual('http://www.w3.org/2000/svg');
1748+
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder,
1749+
async) => {
1750+
tcb.overrideView(MyComp,
1751+
new ViewMetadata({template: '<svg><use xlink:href="Port" /></svg>'}))
1752+
.createAsync(MyComp)
1753+
.then((rootTC) => {
1754+
var el = rootTC.debugElement.nativeElement;
1755+
var svg = DOM.childNodes(el)[0];
1756+
var use = DOM.childNodes(svg)[0];
1757+
expect(DOM.getProperty(<Element>svg, 'namespaceURI'))
1758+
.toEqual('http://www.w3.org/2000/svg');
1759+
expect(DOM.getProperty(<Element>use, 'namespaceURI'))
1760+
.toEqual('http://www.w3.org/2000/svg');
1761+
expect(DOM.getOuterHTML(<HTMLElement>use)).toContain('xmlns:xlink');
17601762

1761-
async.done();
1762-
});
1763-
}));
1763+
async.done();
1764+
});
1765+
}));
17641766

17651767
});
17661768
}

0 commit comments

Comments
 (0)