From: Aleksander Ɓukasz Date: Mon, 12 May 2014 13:24:52 +0000 (+0200) Subject: smartxml: Allow Fragments to refresh their node references using their initial paths X-Git-Url: https://git.mdrn.pl/fnpeditor.git/commitdiff_plain/94e78db871e2d12a5698fced12f656dac563869f?ds=inline smartxml: Allow Fragments to refresh their node references using their initial paths This allows client code to refresh Fragment object to reference proper node instances after some potentially invalidating changes to a document has been made while the logical structure of the document is known to be the same. An example of such a scenario would be a fragment instance created before performing a transaction that was later undone using full document reload. --- diff --git a/src/smartxml/fragments.js b/src/smartxml/fragments.js index 9bb92cc..62a7a4c 100644 --- a/src/smartxml/fragments.js +++ b/src/smartxml/fragments.js @@ -19,11 +19,15 @@ $.extend(Fragment.prototype, { var NodeFragment = function(document, params) { Fragment.call(this, document); this.node = params.node; + this.nodePath = params.node.getPath(); }; NodeFragment.prototype = Object.create(Fragment.prototype); $.extend(NodeFragment.prototype, { isValid: function() { return this.document.containsNode(this.node); + }, + restoreFromPaths: function() { + this.node = this.document.getNodeByPath(this.nodePath); } }); @@ -58,12 +62,18 @@ var RangeFragment = function(document, params) { this[prefix + 'Node'] = params['node'+(idx+1)]; }.bind(this)); } + this.startNodePath = this.startNode.getPath(); + this.endNodePath = this.endNode.getPath(); }; RangeFragment.prototype = Object.create(Fragment.prototype); $.extend(RangeFragment.prototype, { isValid: function() { return this.document.containsNode(this.startNode) && this.document.containsNode(this.endNode); }, + restoreFromPaths: function() { + this.startNode = this.document.getNodeByPath(this.startNodePath); + this.endNode = this.document.getNodeByPath(this.endNodePath); + }, hasSiblingBoundries: function() { return this.isValid() && this.startNode.isSiblingOf(this.endNode); },