From f139b513c5cf9673dc727fd47124e0d779891e3a Mon Sep 17 00:00:00 2001 From: Niklas von Hertzen Date: Mon, 25 Nov 2019 20:55:28 -0800 Subject: [PATCH] fix: #1868 Clone node, Setting className for SVG element raises error (#2079) * fix: #1868 Clone node, Setting className for SVG element raises error * fix: svg element type information --- src/dom/document-cloner.ts | 10 +++++++++- src/dom/node-parser.ts | 3 ++- tests/reftests/images/svg/native_only.html | 5 ++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/dom/document-cloner.ts b/src/dom/document-cloner.ts index ae1c4cfd5..9603ef2a3 100644 --- a/src/dom/document-cloner.ts +++ b/src/dom/document-cloner.ts @@ -8,6 +8,7 @@ import { isScriptElement, isSelectElement, isStyleElement, + isSVGElementNode, isTextareaElement, isTextNode } from './node-parser'; @@ -409,10 +410,17 @@ export class DocumentCloner { }); anonymousReplacedElement.className = `${PSEUDO_HIDE_ELEMENT_CLASS_BEFORE} ${PSEUDO_HIDE_ELEMENT_CLASS_AFTER}`; - clone.className += + const newClassName = pseudoElt === PseudoElementType.BEFORE ? ` ${PSEUDO_HIDE_ELEMENT_CLASS_BEFORE}` : ` ${PSEUDO_HIDE_ELEMENT_CLASS_AFTER}`; + + if (isSVGElementNode(clone)) { + clone.className.baseValue += newClassName; + } else { + clone.className += newClassName; + } + return anonymousReplacedElement; } diff --git a/src/dom/node-parser.ts b/src/dom/node-parser.ts index 238115edf..791247b26 100644 --- a/src/dom/node-parser.ts +++ b/src/dom/node-parser.ts @@ -103,7 +103,8 @@ export const isTextNode = (node: Node): node is Text => node.nodeType === Node.T export const isElementNode = (node: Node): node is Element => node.nodeType === Node.ELEMENT_NODE; export const isHTMLElementNode = (node: Node): node is HTMLElement => typeof (node as HTMLElement).style !== 'undefined'; - +export const isSVGElementNode = (element: Element): element is SVGElement => + typeof (element as SVGElement).className === 'object'; export const isLIElement = (node: Element): node is HTMLLIElement => node.tagName === 'LI'; export const isOLElement = (node: Element): node is HTMLOListElement => node.tagName === 'OL'; export const isInputElement = (node: Element): node is HTMLInputElement => node.tagName === 'INPUT'; diff --git a/tests/reftests/images/svg/native_only.html b/tests/reftests/images/svg/native_only.html index 8ab8f5d13..a6a7c255b 100644 --- a/tests/reftests/images/svg/native_only.html +++ b/tests/reftests/images/svg/native_only.html @@ -11,13 +11,16 @@ body { font-family: Arial; } + svg:before { + content: " "; + }
- +