smartxml: fix - adding nodes before/after root node is not allowed
authorAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Thu, 26 Jun 2014 12:26:44 +0000 (14:26 +0200)
committerAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Thu, 26 Jun 2014 12:34:07 +0000 (14:34 +0200)
src/smartxml/core.js
src/smartxml/smartxml.test.js

index fdce751..7118584 100644 (file)
@@ -23,7 +23,7 @@ var INSERTION = function(implementation) {
             next.detach();
         }
         returned = implementation.call(this, insertion.ofNode);
             next.detach();
         }
         returned = implementation.call(this, insertion.ofNode);
-        if(!options.silent && returned.sameNode(insertion.ofNode)) {
+        if(!options.silent && returned && returned.sameNode(insertion.ofNode)) {
             if(!insertion.insertsNew) {
                 this.triggerChangeEvent('nodeDetached', {node: insertion.ofNode, parent: nodeParent, move: true});
             }
             if(!insertion.insertsNew) {
                 this.triggerChangeEvent('nodeDetached', {node: insertion.ofNode, parent: nodeParent, move: true});
             }
@@ -63,7 +63,11 @@ var documentNodeTransformations = {
     },
 
     after: INSERTION(function(node) {
     },
 
     after: INSERTION(function(node) {
+        if(this.isRoot()) {
+            return;
+        }
         var next = this.next();
         var next = this.next();
+
         if(next && next.nodeType === Node.TEXT_NODE && node.nodeType === Node.TEXT_NODE) {
             next.setText(node.getText() + next.getText());
             node.detach();
         if(next && next.nodeType === Node.TEXT_NODE && node.nodeType === Node.TEXT_NODE) {
             next.setText(node.getText() + next.getText());
             node.detach();
@@ -74,6 +78,9 @@ var documentNodeTransformations = {
     }),
 
     before: INSERTION(function(node) {
     }),
 
     before: INSERTION(function(node) {
+        if(this.isRoot()) {
+            return;
+        }
         var prev = this.prev();
         if(prev && prev.nodeType === Node.TEXT_NODE && node.nodeType === Node.TEXT_NODE) {
             prev.setText(prev.getText() + node.getText());
         var prev = this.prev();
         if(prev && prev.nodeType === Node.TEXT_NODE && node.nodeType === Node.TEXT_NODE) {
             prev.setText(prev.getText() + node.getText());
index 6b2f91d..b50da7f 100644 (file)
@@ -240,6 +240,29 @@ describe('smartxml', function() {
                 });
             });
         });
                 });
             });
         });
+
+        describe('Putting nodes around', function() {
+            it('will not allow to put node before or after root node', function() {
+                var doc = getDocumentFromXML('<root></root>'),
+                    spy = sinon.spy(),
+                    root = doc.root,
+                    result;
+
+                doc.on('change', spy);
+
+                result = doc.root.before({tagName: 'test'});
+
+                expect(spy.callCount).to.equal(0);
+                expect(result).to.undefined;
+
+                result = doc.root.after({tagName: 'test'});
+                
+                expect(spy.callCount).to.equal(0);
+                expect(result).to.undefined;
+
+                expect(doc.root.sameNode(root));
+            });
+        });
     });
 
     describe('Basic TextNode properties', function() {
     });
 
     describe('Basic TextNode properties', function() {