From 643d726b32f530502411247a087274284e3f9c3a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aleksander=20=C5=81ukasz?= Date: Thu, 26 Jun 2014 14:26:44 +0200 Subject: [PATCH] smartxml: fix - adding nodes before/after root node is not allowed --- src/smartxml/core.js | 9 ++++++++- src/smartxml/smartxml.test.js | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/smartxml/core.js b/src/smartxml/core.js index fdce751..7118584 100644 --- a/src/smartxml/core.js +++ b/src/smartxml/core.js @@ -23,7 +23,7 @@ var INSERTION = function(implementation) { 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}); } @@ -63,7 +63,11 @@ var documentNodeTransformations = { }, after: INSERTION(function(node) { + if(this.isRoot()) { + return; + } var next = this.next(); + 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) { + 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()); diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js index 6b2f91d..b50da7f 100644 --- a/src/smartxml/smartxml.test.js +++ b/src/smartxml/smartxml.test.js @@ -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(''), + 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() { -- 2.20.1