]> source.dussan.org Git - svg.js.git/commitdiff
Return null if `until` not in parent chain
authorMorgan Harris <gormster@me.com>
Tue, 23 Nov 2021 02:12:44 +0000 (13:12 +1100)
committerMorgan Harris <gormster@me.com>
Tue, 23 Nov 2021 02:12:44 +0000 (13:12 +1100)
spec/spec/elements/Element.js
src/elements/Element.js

index 507637361646deb80446b9f3d6b0b98677b337c2..38b862f3272eab55109f2aeab566eefc848f423c 100644 (file)
@@ -188,6 +188,20 @@ describe('Element.js', function () {
       expect(rect.parents('.foo')).toEqual([ group3 ])
       expect(rect.parents('.test:not(.foo)')).toEqual([ group3, group2, group1 ])
     })
+
+    it('returns null if the passed element is not an ancestor', () => {
+      const canvas = SVG().addTo(container)
+      const groupA = canvas.group().addClass('test')
+      const group1 = canvas.group()
+      const group2 = group1.group()
+      const group3 = group2.group()
+      const rect = group3.rect(100, 100)
+
+
+      expect(rect.parents('.does-not-exist')).toEqual(null)
+      expect(rect.parents('.test')).toEqual(null)
+      expect(rect.parents(groupA)).toEqual(null)
+    })
   })
 
   describe('reference()', () => {
index a1e7236bdf688372ad0254b3083bfb0967bc6b2c..2aaeab516cf9b3ca3c7271b9957206ade57bef1f 100644 (file)
@@ -87,11 +87,8 @@ export default class Element extends Dom {
 
   // return array of all ancestors of given type up to the root svg
   parents (until = this.root()) {
-    let selector = null
-    if (typeof until === 'string') {
-      selector = until
-      until = this.root()
-    } else {
+    const isSelector = typeof until === 'string'
+    if (!isSelector) {
       until = makeInstance(until)
     }
     const parents = new List()
@@ -104,12 +101,16 @@ export default class Element extends Dom {
 
       parents.push(parent)
 
-      if (parent.node === until.node) {
+      if (!isSelector && (parent.node === until.node)) {
         break
       }
-      if (selector && parent.matches(selector)) {
+      if (isSelector && parent.matches(until)) {
         break
       }
+      if (parent.node === this.root().node) {
+        // We worked our way to the root and didn't match `until`
+        return null
+      }
     }
 
     return parents