fix(render): create svg elements with the right namespace
Temporary fix for #4506 Closes #4949
This commit is contained in:
@@ -32,6 +32,92 @@ import {createRenderView, NodeFactory} from '../view_factory';
|
||||
import {DefaultRenderView, DefaultRenderFragmentRef, DefaultProtoViewRef} from '../view';
|
||||
import {camelCaseToDashCase} from './util';
|
||||
|
||||
// TODO(tbosch): solve SVG properly once https://github.com/angular/angular/issues/4417 is done
|
||||
const XLINK_NAMESPACE = 'http://www.w3.org/1999/xlink';
|
||||
const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
|
||||
const SVG_ELEMENT_NAMES = CONST_EXPR({
|
||||
'altGlyph': true,
|
||||
'altGlyphDef': true,
|
||||
'altGlyphItem': true,
|
||||
'animate': true,
|
||||
'animateColor': true,
|
||||
'animateMotion': true,
|
||||
'animateTransform': true,
|
||||
'circle': true,
|
||||
'clipPath': true,
|
||||
'color-profile': true,
|
||||
'cursor': true,
|
||||
'defs': true,
|
||||
'desc': true,
|
||||
'ellipse': true,
|
||||
'feBlend': true,
|
||||
'feColorMatrix': true,
|
||||
'feComponentTransfer': true,
|
||||
'feComposite': true,
|
||||
'feConvolveMatrix': true,
|
||||
'feDiffuseLighting': true,
|
||||
'feDisplacementMap': true,
|
||||
'feDistantLight': true,
|
||||
'feFlood': true,
|
||||
'feFuncA': true,
|
||||
'feFuncB': true,
|
||||
'feFuncG': true,
|
||||
'feFuncR': true,
|
||||
'feGaussianBlur': true,
|
||||
'feImage': true,
|
||||
'feMerge': true,
|
||||
'feMergeNode': true,
|
||||
'feMorphology': true,
|
||||
'feOffset': true,
|
||||
'fePointLight': true,
|
||||
'feSpecularLighting': true,
|
||||
'feSpotLight': true,
|
||||
'feTile': true,
|
||||
'feTurbulence': true,
|
||||
'filter': true,
|
||||
'font': true,
|
||||
'font-face': true,
|
||||
'font-face-format': true,
|
||||
'font-face-name': true,
|
||||
'font-face-src': true,
|
||||
'font-face-uri': true,
|
||||
'foreignObject': true,
|
||||
'g': true,
|
||||
'glyph': true,
|
||||
'glyphRef': true,
|
||||
'hkern': true,
|
||||
'image': true,
|
||||
'line': true,
|
||||
'linearGradient': true,
|
||||
'marker': true,
|
||||
'mask': true,
|
||||
'metadata': true,
|
||||
'missing-glyph': true,
|
||||
'mpath': true,
|
||||
'path': true,
|
||||
'pattern': true,
|
||||
'polygon': true,
|
||||
'polyline': true,
|
||||
'radialGradient': true,
|
||||
'rect': true,
|
||||
'set': true,
|
||||
'stop': true,
|
||||
'style': true,
|
||||
'svg': true,
|
||||
'switch': true,
|
||||
'symbol': true,
|
||||
'text': true,
|
||||
'textPath': true,
|
||||
'title': true,
|
||||
'tref': true,
|
||||
'tspan': true,
|
||||
'use': true,
|
||||
'view': true,
|
||||
'vkern': true
|
||||
});
|
||||
|
||||
const SVG_ATTR_NAMESPACES = CONST_EXPR({'href': XLINK_NAMESPACE});
|
||||
|
||||
export abstract class DomRenderer extends Renderer implements NodeFactory<Node> {
|
||||
abstract registerComponentTemplate(templateId: number, commands: RenderTemplateCmd[],
|
||||
styles: string[], nativeShadow: boolean);
|
||||
@@ -271,17 +357,25 @@ export class DomRenderer_ extends DomRenderer {
|
||||
wtfLeave(s);
|
||||
}
|
||||
createElement(name: string, attrNameAndValues: string[]): Node {
|
||||
var el = DOM.createElement(name);
|
||||
this._setAttributes(el, attrNameAndValues);
|
||||
var isSvg = SVG_ELEMENT_NAMES[name] == true;
|
||||
var el = isSvg ? DOM.createElementNS(SVG_NAMESPACE, name) : DOM.createElement(name);
|
||||
this._setAttributes(el, attrNameAndValues, isSvg);
|
||||
return el;
|
||||
}
|
||||
mergeElement(existing: Node, attrNameAndValues: string[]) {
|
||||
DOM.clearNodes(existing);
|
||||
this._setAttributes(existing, attrNameAndValues);
|
||||
this._setAttributes(existing, attrNameAndValues, false);
|
||||
}
|
||||
private _setAttributes(node: Node, attrNameAndValues: string[]) {
|
||||
private _setAttributes(node: Node, attrNameAndValues: string[], isSvg: boolean) {
|
||||
for (var attrIdx = 0; attrIdx < attrNameAndValues.length; attrIdx += 2) {
|
||||
DOM.setAttribute(node, attrNameAndValues[attrIdx], attrNameAndValues[attrIdx + 1]);
|
||||
var attrName = attrNameAndValues[attrIdx];
|
||||
var attrValue = attrNameAndValues[attrIdx + 1];
|
||||
var attrNs = isSvg ? SVG_ATTR_NAMESPACES[attrName] : null;
|
||||
if (isPresent(attrNs)) {
|
||||
DOM.setAttributeNS(node, XLINK_NAMESPACE, attrName, attrValue);
|
||||
} else {
|
||||
DOM.setAttribute(node, attrName, attrValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
createRootContentInsertionPoint(): Node {
|
||||
|
||||
Reference in New Issue
Block a user