From: Aleksander Ɓukasz Date: Tue, 17 Jun 2014 11:35:19 +0000 (+0200) Subject: wlxml: getParent/isInside takes context roots into account X-Git-Url: https://git.mdrn.pl/fnpeditor.git/commitdiff_plain/e28164ab55a10982219bd2a00a08010ef0bb8bcc?ds=sidebyside;hp=7a55de7fa64363dcc4bdcf31dabe2e155018597a wlxml: getParent/isInside takes context roots into account --- diff --git a/src/wlxml/wlxml.js b/src/wlxml/wlxml.js index c38810d..df93b3e 100644 --- a/src/wlxml/wlxml.js +++ b/src/wlxml/wlxml.js @@ -24,9 +24,10 @@ var WLXMLDocumentNodeMethods = { me.concat(this.parents()).some(function(node) { if(node.is(query)) { toret = node; - return true; } - }); + return !!toret || (!node.sameNode(this) && node.isContextRoot()); + }.bind(this)); + return toret; }, isContextRoot: function() { diff --git a/src/wlxml/wlxml.test.js b/src/wlxml/wlxml.test.js index cf8aa74..93b6df9 100644 --- a/src/wlxml/wlxml.test.js +++ b/src/wlxml/wlxml.test.js @@ -240,23 +240,34 @@ describe('WLXMLDocument', function() { }); }); - describe('Declaring context roots', function() { - it('allows extensions declaring a node as a context root', function() { - var doc = getDocumentFromXML('
'); - doc.registerExtension({wlxmlClass: {a: {methods: { - isContextRoot: function(node) { - return node.getClass() === 'b'; - } - }}}}); - - var divA = doc.root.contents()[0], - divB = divA.contents()[0], - divC = divB.contents()[0]; + describe('Context roots', function() { + var doc = getDocumentFromXML('
'); + doc.registerExtension({wlxmlClass: {a: {methods: { + isContextRoot: function(node) { + return node.getClass() === 'b'; + } + }}}}); + + var divA = doc.root.contents()[0], + divB = divA.contents()[0], + divC = divB.contents()[0]; + it('allows extensions declaring a node as a context root', function() { expect(divC.isContextRoot()).to.equal(false, 'c is not a context root'); expect(divB.isContextRoot()).to.equal(true, 'b is a context root'); expect(divA.isContextRoot()).to.equal(false, 'a is not a context root'); }); + + it('closes context for parent context quering methods', function() { + expect(divC.isInside('b')).to.equal(true, 'c inside b'); + expect(divC.isInside('a')).to.equal(false, 'c not inside a'); + expect(divC.isInside({tagName: 'section'})).to.equal(false, 'c not inside section'); + + expect(divB.isInside('a')).to.equal(true, 'b inside a'); + expect(divB.isInside({tagName: 'section'})).to.equal(true, 'b inside section'); + + expect(divA.isInside({tagName: 'section'})).to.equal(true, 'a inside section'); + }); }); });