]> source.dussan.org Git - svg.js.git/commitdiff
fixed all that errors which come along when removing an object. Fixed tests, too... 811/head
authorUlrich-Matthias Schäfer <ulima.ums@googlemail.com>
Thu, 1 Mar 2018 11:42:16 +0000 (12:42 +0100)
committerUlrich-Matthias Schäfer <ulima.ums@googlemail.com>
Thu, 1 Mar 2018 11:42:16 +0000 (12:42 +0100)
14 files changed:
spec/SpecRunner.html
spec/spec/doc.js
spec/spec/element.js
spec/spec/nested.js [deleted file]
spec/spec/svg.js
src/HtmlNode.js
src/boxes.js
src/doc.js
src/element.js
src/flatten.js
src/matrix.js
src/parent.js
src/parser.js
src/svg.js

index 7461bdd3655c46132cdb7ccffce6aae5b73d56cd..bd47626352039647138c654ed31b8d9c5b14eacc 100644 (file)
@@ -78,7 +78,6 @@
   <script src="spec/mask.js"></script>
   <script src="spec/matrix.js"></script>
   <script src="spec/memory.js"></script>
-  <script src="spec/nested.js"></script>
   <script src="spec/number.js"></script>
   <script src="spec/path.js"></script>
   <script src="spec/pattern.js"></script>
index 1e1c54ccc7733926f64510074f86b89bbc61dae3..5accd5b22230c6ac2f78452303a0cd36d07aff2d 100644 (file)
@@ -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
index a5b26a113e08aa293a23b6963f609e9fe5488299..53ed84f29c74fffdee71f34c2b8d15f1ff793d50 100644 (file)
@@ -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 (file)
index 3113880..0000000
+++ /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()
-    })
-  })
-
-})
index 2485a32c1241abc901e671850c55be6a5040235f..ea51703ad82890aef7ebfe6f7dd4c8450498a35a 100644 (file)
@@ -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('<svg width="200"><rect></rect></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')
index 30cb4cf71ede3ab12b16dc1cd29429d34bb91c7a..e7dae10c44ccc9e639897dc9a08a435b920a67bd 100644 (file)
@@ -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
index a5ca1e8b9d0cc574f91de68892c4a78da21098dd..f0154bd55a8a5d04b9b65d38ca4e3e8af678da4c 100644 (file)
@@ -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'))
index d4bf7e59368a26b3dbcdc8ee0d014619da1526e9..72ea59c6e16af3311e667efa4d2f7cdd6f1b0476 100644 (file)
@@ -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
-      // <g><svg>...</svg></g>
-      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())
     }
   }
 })
index e7b53267646d845713717c9101ba9640d1549fa7..0d08579c0c64e206bb96a8ea87822311096f0ae4 100644 (file)
@@ -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
index 1c32a7665d7502c9089f9f2a08a6f62d5af97e4c..3ba6e22a516d15e76c5b727526f6bfc261fc8bb3 100644 (file)
@@ -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
index 6e918d8207e26a1277be6a406b697f53049c9877..e823a8100af739aaac1499235df9567ef66bc315 100644 (file)
@@ -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()
index 0ff176596a78386bbd8e9c79e70f8a0306a6680b..d48e086396a2a6605e68a3f56dc90a0e8876770f 100644 (file)
@@ -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
index c3ab7a4f486db527dc7a16b907e6f529cf5a3352..84c8d776da67f5e965a8d74e71782f8911c47a60 100644 (file)
@@ -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%',
index 4cb6f26f33d36cc63b76677c8944a9ee050f3747..9b3bfd6f8618b2392ed20c0ed2d1318f383c7093 100644 (file)
@@ -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
 }