-
Notifications
You must be signed in to change notification settings - Fork 784
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(performance): significantly improve the performance of the dom.fi…
…ndUp utility fixes #696
- Loading branch information
Showing
21 changed files
with
342 additions
and
121 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,34 +1,54 @@ | ||
/* global dom, axe */ | ||
/** | ||
* recusively walk up the DOM, checking for a node which matches a selector | ||
* Find the virtual node and call dom.fundUpVirtual | ||
* | ||
* **WARNING:** this should be used sparingly, as it's not even close to being performant | ||
* @method findUp | ||
* @memberof axe.commons.dom | ||
* @instance | ||
* @param {HTMLElement|String} element The starting HTMLElement | ||
* @param {HTMLElement} element The starting HTMLElement | ||
* @param {String} target The selector for the HTMLElement | ||
* @return {HTMLElement|null} Either the matching HTMLElement or `null` if there was no match | ||
*/ | ||
dom.findUp = function (element, target) { | ||
let doc, matches, | ||
parent = element; | ||
return dom.findUpVirtual(axe.utils.getNodeFromTree(axe._tree[0], element), target); | ||
}; | ||
|
||
/** | ||
* recusively walk up the DOM, checking for a node which matches a selector | ||
* | ||
* **WARNING:** this should be used sparingly, as it's not even close to being performant | ||
* @method findUpVirtual | ||
* @memberof axe.commons.dom | ||
* @instance | ||
* @param {VirtualNode} element The starting virtualNode | ||
* @param {String} target The selector for the HTMLElement | ||
* @return {HTMLElement|null} Either the matching HTMLElement or `null` if there was no match | ||
*/ | ||
dom.findUpVirtual = function (element, target) { | ||
let parent; | ||
|
||
parent = element.actualNode; | ||
// virtualNode will have a shadowId if the element lives inside a shadow DOM or is | ||
// slotted into a shadow DOM | ||
if (!element.shadowId && typeof element.actualNode.closest === 'function') { | ||
// non-shadow DOM elements | ||
let match = element.actualNode.closest(target); | ||
if (match) { | ||
return match; | ||
} | ||
return null; | ||
} | ||
// handle shadow DOM elements and older browsers | ||
do {// recursively walk up the DOM, checking each parent node | ||
parent = (parent.assignedSlot ? parent.assignedSlot : parent.parentNode); | ||
if (parent && parent.nodeType === 11) { | ||
matches = null; | ||
parent = parent.host; | ||
} | ||
if (!matches) { | ||
doc = axe.commons.dom.getRootNode(parent); | ||
matches = doc.querySelectorAll(target); | ||
matches = axe.utils.toArray(matches); | ||
if (doc === document && !matches.length) { | ||
return null; | ||
} | ||
} | ||
} while (parent && !matches.includes(parent)); | ||
} while (parent && !axe.utils.matchesSelector(parent, target) && parent !== document.documentElement); | ||
|
||
if (!axe.utils.matchesSelector(parent, target)) { | ||
return null; | ||
} | ||
return parent; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.