This fixes the case where new node, which wasn't inserted into document
tree yet was moved (via append/prepend/before/after) into another
out of document node which was triggering nodeDetached event.
var INSERTION = function(implementation) {
var toret = function(node) {
var insertion = this.getNodeInsertion(node),
var INSERTION = function(implementation) {
var toret = function(node) {
var insertion = this.getNodeInsertion(node),
+ nodeWasContained = this.document.containsNode(insertion.ofNode),
nodeParent;
if(!(this.document.containsNode(this))) {
nodeParent = insertion.ofNode.parent();
}
implementation.call(this, insertion.ofNode.nativeNode);
nodeParent;
if(!(this.document.containsNode(this))) {
nodeParent = insertion.ofNode.parent();
}
implementation.call(this, insertion.ofNode.nativeNode);
- this.triggerChangeEvent(insertion.insertsNew ? 'nodeAdded' : 'nodeMoved', {node: insertion.ofNode}, nodeParent);
+ this.triggerChangeEvent(insertion.insertsNew ? 'nodeAdded' : 'nodeMoved', {node: insertion.ofNode}, nodeParent, nodeWasContained);
return insertion.ofNode;
};
return toret;
return insertion.ofNode;
};
return toret;
- triggerChangeEvent: function(type, metaData, origParent) {
+ triggerChangeEvent: function(type, metaData, origParent, nodeWasContained) {
var node = (metaData && metaData.node) ? metaData.node : this,
event = new events.ChangeEvent(type, $.extend({node: node}, metaData || {}));
if(type === 'nodeDetached' || this.document.containsNode(event.meta.node)) {
this.document.trigger('change', event);
}
var node = (metaData && metaData.node) ? metaData.node : this,
event = new events.ChangeEvent(type, $.extend({node: node}, metaData || {}));
if(type === 'nodeDetached' || this.document.containsNode(event.meta.node)) {
this.document.trigger('change', event);
}
- if((type === 'nodeAdded' || type === 'nodeMoved') && !(this.document.containsNode(this))) {
+ if((type === 'nodeAdded' || type === 'nodeMoved') && !this.document.containsNode(this) && nodeWasContained) {
event = new events.ChangeEvent('nodeDetached', {node: node, parent: origParent});
this.document.trigger('change', event);
}
event = new events.ChangeEvent('nodeDetached', {node: node, parent: origParent});
this.document.trigger('change', event);
}
expect(event.type).to.equal('nodeDetached');
expect(event.meta.node.sameNode(a));
});
expect(event.type).to.equal('nodeDetached');
expect(event.meta.node.sameNode(a));
});
+
+ it('doesn\'t emit nodeDetached event for already out of document moved to out of document node: ' + insertionMethod, function() {
+ var doc = getDocumentFromXML('<div><a></a></div>'),
+ a = doc.root.contents()[0],
+ spy = sinon.spy();
+
+ doc.on('change', spy);
+
+ var newNode = doc.createDocumentNode({tagName: 'b'});
+ var newNodeInner = newNode.append({tagName:'c'});
+
+ expect(spy.callCount).to.equal(0);
+ });