From: Ulrich-Matthias Schäfer Date: Thu, 1 Mar 2018 11:42:16 +0000 (+0100) Subject: fixed all that errors which come along when removing an object. Fixed tests, too... X-Git-Tag: 3.0.0~66^2 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=75c3893a7c7af76f9bb1fe9be72e03b99d17a1e0;p=svg.js.git fixed all that errors which come along when removing an object. Fixed tests, too and added isRoot test --- diff --git a/spec/SpecRunner.html b/spec/SpecRunner.html index 7461bdd..bd47626 100644 --- a/spec/SpecRunner.html +++ b/spec/SpecRunner.html @@ -78,7 +78,6 @@ - diff --git a/spec/spec/doc.js b/spec/spec/doc.js index 1e1c54c..5accd5b 100644 --- a/spec/spec/doc.js +++ b/spec/spec/doc.js @@ -16,11 +16,11 @@ describe('Doc', function() { expect(draw instanceof SVG.Doc).toBe(true) }) - it('returns itself as Doc', function() { + it('returns itself as Doc when root', function() { expect(draw.doc()).toBe(draw) }) - it('has a defs element', function() { + it('has a defs element when root', function() { expect(draw.defs() instanceof SVG.Defs).toBe(true) }) @@ -33,6 +33,23 @@ describe('Doc', function() { }) }) + describe('isRoot()', function() { + it('returns true when the doc is not attached to dom', function() { + expect(SVG().isRoot()).toBe(true) + }) + it('returns true when its outer element is not an svg element', function () { + expect(SVG().addTo(document.createElement('div')).isRoot()).toBe(true) + }) + it('returns true when its the root element of the dom', function () { + if(parserInDoc) { + expect(draw.isRoot()).toBe(true) + } + }) + it('returns false when parent is svg element', function () { + expect(SVG().addTo(SVG()).isRoot()).toBe(false) + }) + }) + describe('remove()', function() { it('removes the doc from the dom only if doc is not root element', function() { var cnt = window.document.querySelectorAll('svg').length diff --git a/spec/spec/element.js b/spec/spec/element.js index a5b26a1..53ed84f 100644 --- a/spec/spec/element.js +++ b/spec/spec/element.js @@ -476,11 +476,12 @@ describe('Element', function() { it('ungroups everything to the doc root when called on SVG.Doc / does not ungroup defs/parser', function() { draw.flatten() + expect(rect1.parent()).toBe(draw) expect(rect2.parent()).toBe(draw) expect(g1.node.parentNode).toBeFalsy() - expect(g1.node.parentNode).toBeFalsy() + expect(g2.node.parentNode).toBeFalsy() expect(nested.node.parentNode).toBeFalsy() expect(rect1.transform()).toEqual(jasmine.objectContaining({ diff --git a/spec/spec/nested.js b/spec/spec/nested.js deleted file mode 100644 index 3113880..0000000 --- a/spec/spec/nested.js +++ /dev/null @@ -1,13 +0,0 @@ -describe('Nested', function() { - - afterEach(function() { - draw.clear() - }) - - describe('()', function() { - it('creates a nested svg of type SVG.Nested', function() { - expect(draw.nested() instanceof SVG.Nested).toBeTruthy() - }) - }) - -}) diff --git a/spec/spec/svg.js b/spec/spec/svg.js index 2485a32..ea51703 100644 --- a/spec/spec/svg.js +++ b/spec/spec/svg.js @@ -52,10 +52,10 @@ describe('SVG', function() { expect(SVG(rect).node).toBe(rect) }) - it('creates an instanceof SVG.Nested when importing a whole svg', function() { + it('creates an instanceof SVG.Doc when importing a whole svg', function() { var doc = SVG('') - expect(doc instanceof SVG.Nested).toBe(true) + expect(doc instanceof SVG.Doc).toBe(true) expect(doc.node.nodeName).toBe('svg') expect(doc.width()).toBe(200) expect(doc.get(0).node.nodeName).toBe('rect') diff --git a/src/HtmlNode.js b/src/HtmlNode.js index 30cb4cf..e7dae10 100644 --- a/src/HtmlNode.js +++ b/src/HtmlNode.js @@ -8,15 +8,9 @@ SVG.HtmlNode = SVG.invent({ extend: { add: function (element, i) { element = createElement(element) - if (element instanceof SVG.Nested) { - element = new SVG.Doc(element.node) - element.setData(JSON.parse(element.node.getAttribute('svgjs:data')) || {}) - } - if (i === null) { - this.node.appendChild(element.node) - } else if (element.node !== this.node.children[i]) { - this.node.insertBefore(element.node, this.node.children[i]) + if (element.node !== this.node.children[i]) { + this.node.insertBefore(element.node, this.node.children[i] || null) } return this diff --git a/src/boxes.js b/src/boxes.js index a5ca1e8..f0154bd 100644 --- a/src/boxes.js +++ b/src/boxes.js @@ -127,7 +127,7 @@ SVG.Box = SVG.invent({ } }) -SVG.extend([SVG.Doc, SVG.Nested, SVG.Symbol, SVG.Image, SVG.Pattern, SVG.Marker, SVG.ForeignObject, SVG.View], { +SVG.extend([SVG.Doc, SVG.Symbol, SVG.Image, SVG.Pattern, SVG.Marker, SVG.ForeignObject, SVG.View], { viewbox: function (x, y, width, height) { // act as getter if (x == null) return new SVG.Box(this.attr('viewBox')) diff --git a/src/doc.js b/src/doc.js index d4bf7e5..72ea59c 100644 --- a/src/doc.js +++ b/src/doc.js @@ -4,7 +4,7 @@ SVG.Doc = SVG.invent({ this.constructor(node || SVG.create('svg')) // set svg element attributes and ensure defs node - this.namespace().defs() + this.namespace() }, // Inherit from @@ -12,40 +12,41 @@ SVG.Doc = SVG.invent({ // Add class methods extend: { - isRoot: function() { - return !this.node.parentNode || !this.node.parentNode instanceof window.SVGElement || this.node.parentNode.nodeName == '#document' + isRoot: function () { + return !this.node.parentNode || !(this.node.parentNode instanceof window.SVGElement) || this.node.parentNode.nodeName === '#document' }, - doc: function() { - if(this.isRoot()) return this - - var parent - while(parent = this.parent(SVG.Doc)) { - if(parent.isRoot()) return parent - } - - // this can only happen when you have something like - // ... - return null + // Check if this is a root svg. If not, call docs from this element + doc: function () { + if (this.isRoot()) return this + return SVG.Element.prototype.doc.call(this) }, // Add namespaces - namespace: function() { - if(!this.isRoot()) return this.doc().namespace() + namespace: function () { + if (!this.isRoot()) return this.doc().namespace() return this .attr({ xmlns: SVG.ns, version: '1.1' }) .attr('xmlns:xlink', SVG.xlink, SVG.xmlns) .attr('xmlns:svgjs', SVG.svgjs, SVG.xmlns) }, // Creates and returns defs element - defs: function() { - if(!this.isRoot()) return this.doc().defs() + defs: function () { + if (!this.isRoot()) return this.doc().defs() return SVG.adopt(this.node.getElementsByTagName('defs')[0]) || this.put(new SVG.Defs()) }, // custom parent method - parent: function () { - return this.node.parentNode.nodeName === '#document' ? null : this.node.parentNode + parent: function (type) { + if (this.isRoot()) { + return this.node.parentNode.nodeName === '#document' ? null : this.node.parentNode + } + + return SVG.Element.prototype.parent.call(this, type) }, // Removes the doc from the DOM remove: function () { + if (!this.isRoot()) { + return SVG.Element.prototype.remove.call(this) + } + if (this.parent()) { this.parent().removeChild(this.node) } @@ -62,8 +63,8 @@ SVG.Doc = SVG.invent({ }, construct: { // Create nested svg document - nested: function() { - return this.put(new SVG.Doc) + nested: function () { + return this.put(new SVG.Doc()) } } }) diff --git a/src/element.js b/src/element.js index e7b5326..0d08579 100644 --- a/src/element.js +++ b/src/element.js @@ -218,7 +218,8 @@ SVG.Element = SVG.invent({ // Get parent document doc: function () { - return this.parent(SVG.Doc).doc() + var p = this.parent(SVG.Doc) + return p && p.doc() }, // Get defs diff --git a/src/flatten.js b/src/flatten.js index 1c32a76..3ba6e22 100644 --- a/src/flatten.js +++ b/src/flatten.js @@ -2,7 +2,7 @@ SVG.extend(SVG.Parent, { flatten: function (parent) { if (this instanceof SVG.Defs) return this - parent = parent || (this instanceof SVG.Doc ? this : this.parent(SVG.Parent)) + parent = parent || (this instanceof SVG.Doc && this.isRoot() ? this : this.parent(SVG.Parent)) this.each(function () { if (this instanceof SVG.Defs) return this diff --git a/src/matrix.js b/src/matrix.js index 6e918d8..e823a81 100644 --- a/src/matrix.js +++ b/src/matrix.js @@ -185,7 +185,7 @@ SVG.Matrix = SVG.invent({ This is needed because FF does not return the transformation matrix for the inner coordinate system when getScreenCTM() is called on nested svgs. However all other Browsers do that */ - if (this instanceof SVG.Nested) { + if (this instanceof SVG.Doc && !this.isRoot()) { var rect = this.rect(1, 1) var m = rect.node.getScreenCTM() rect.remove() diff --git a/src/parent.js b/src/parent.js index 0ff1765..d48e086 100644 --- a/src/parent.js +++ b/src/parent.js @@ -21,10 +21,8 @@ SVG.Parent = SVG.invent({ add: function (element, i) { element = createElement(element) - if (i == null) { - this.node.appendChild(element.node) - } else if (element.node !== this.node.children[i]) { - this.node.insertBefore(element.node, this.node.children[i]) + if (element.node !== this.node.children[i]) { + this.node.insertBefore(element.node, this.node.children[i] || null) } return this diff --git a/src/parser.js b/src/parser.js index c3ab7a4..84c8d77 100644 --- a/src/parser.js +++ b/src/parser.js @@ -11,7 +11,7 @@ SVG.parser = function () { } SVG.parser.nodes = { - svg: new SVG.Nested().size(2, 0).css({ + svg: SVG().size(2, 0).css({ opacity: 0, position: 'absolute', left: '-100%', diff --git a/src/svg.js b/src/svg.js index 4cb6f26..9b3bfd6 100644 --- a/src/svg.js +++ b/src/svg.js @@ -87,13 +87,15 @@ SVG.adopt = function (node) { var element // adopt with element-specific settings - if (node.nodeName == 'svg') + if (node.nodeName === 'svg') { element = new SVG.Doc(node) - else if (node.nodeName === 'linearGradient' || node.nodeName === 'radialGradient') + } else if (node.nodeName === 'linearGradient' || node.nodeName === 'radialGradient') { element = new SVG.Gradient(node) } else if (SVG[capitalize(node.nodeName)]) { element = new SVG[capitalize(node.nodeName)](node) - } else { element = new SVG.Parent(node) } + } else { + element = new SVG.Parent(node) + } return element }