js/domreplay/domhound/tracker.js

/**
 * Recursively tracks down the element according to its trail.
 * @param element
 * @param trail
 * @returns {*}
 * @access private
 */
const _recursiveTracker = (element, trail) => {
	if (!trail.child) {
		return element;
	} else {
		return _recursiveTracker(element.children.item(trail.childIndex), trail.child);
	}
	return null;
}

/**
 * Tracks down element according to trail.
 * @param trail
 * @returns {Promise<HTMLElement> | Promise<null>}
 * @access public
 */
export const tracker = (trail) => {
	return new Promise((resolve, reject) => {
		let element;
		if (trail.id && !trail.child) {
			element = document.getElementById(trail.id);
		} else if (trail.id && trail.child) {
			element = _recursiveTracker(document.getElementById(trail.id), trail);
		} else if (trail.tag === 'body' && trail.child) {
			element = _recursiveTracker(document.body, trail);
		}
		if (!element) {
			reject(null);
		} else {
			resolve(element);
		}
	});
}