/** * Returns the parent of a node. * Breaks through shadow roots. * Returns null if node has no parent. * @param {Node} node */ function getParent(node) { let parent = node.parentNode if (!parent) return null return parent.host ? parent.host : parent } /** * Returns an Iterator that walks the DOM tree upwards. * @param {Node} node */ export function createParentsIterator(node) { let curNode = node return { next: function() { curNode = getParent(curNode) return curNode ? { value: curNode } : { done: true } }, [Symbol.iterator]: function() { return this } } }