axe-core
Version:
Accessibility engine for automated Web UI testing
45 lines (40 loc) • 1.31 kB
JavaScript
/**
* Wrapper for Node#contains; PhantomJS does not support Node#contains and erroneously reports that it does
* @method contains
* @memberof axe.utils
* @param {VirtualNode} vNode The candidate container VirtualNode
* @param {VirtualNode} otherVNode The vNode to test is contained by `vNode`
* @return {Boolean} Whether `vNode` contains `otherVNode`
*/
axe.utils.contains = function(vNode, otherVNode) {
/*eslint no-bitwise: 0*/
'use strict';
function containsShadowChild(vNode, otherVNode) {
if (vNode.shadowId === otherVNode.shadowId) {
return true;
}
return !!vNode.children.find(child => {
return containsShadowChild(child, otherVNode);
});
}
if (vNode.shadowId || otherVNode.shadowId) {
return containsShadowChild(vNode, otherVNode);
}
if (vNode.actualNode) {
if (typeof vNode.actualNode.contains === 'function') {
return vNode.actualNode.contains(otherVNode.actualNode);
}
return !!(
vNode.actualNode.compareDocumentPosition(otherVNode.actualNode) & 16
);
} else {
// fallback for virtualNode only contexts (e.g. linting)
// @see https://github.com/Financial-Times/polyfill-service/pull/183/files
do {
if (otherVNode === vNode) {
return true;
}
} while ((otherVNode = otherVNode && otherVNode.parent));
}
return false;
};