-
Notifications
You must be signed in to change notification settings - Fork 792
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'shadowDOM' into sd/table-rules
# Conflicts: # lib/commons/dom/has-content.js # test/commons/dom/has-content.js
- Loading branch information
Showing
20 changed files
with
241 additions
and
47 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
/*global dom */ | ||
/** | ||
* Get an element's parent in the composed tree | ||
* @param DOMNode Element | ||
* @return DOMNode Parent element | ||
*/ | ||
dom.getComposedParent = function getComposedParent (element) { | ||
if (element.assignedSlot) { | ||
return element.assignedSlot; // content of a shadow DOM slot | ||
} else if (element.parentNode) { | ||
var parentNode = element.parentNode; | ||
if (parentNode.nodeType === 1) { | ||
return parentNode; // Regular node | ||
} else if (parentNode.host) { | ||
return parentNode.host; // Shadow root | ||
} | ||
} | ||
return null; // Root node | ||
}; |
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,46 +1,81 @@ | ||
/* global xit */ | ||
describe('hidden content', function () { | ||
'use strict'; | ||
|
||
var fixture = document.getElementById('fixture'); | ||
|
||
var fixture = document.getElementById('fixture'); | ||
var shadowSupport = axe.testUtils.shadowSupport.v1; | ||
var checkContext = { | ||
_data: null, | ||
data: function (d) { | ||
this._data = d; | ||
} | ||
}; | ||
|
||
function checkSetup (html, options, target) { | ||
fixture.innerHTML = html; | ||
axe._tree = axe.utils.getFlattenedTree(fixture); | ||
var node = fixture.querySelector(target || '#target'); | ||
var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); | ||
return [node, options, virtualNode]; | ||
} | ||
|
||
afterEach(function () { | ||
fixture.innerHTML = ''; | ||
checkContext._data = null; | ||
axe._tree = undefined; | ||
}); | ||
|
||
it('should return undefined with display:none and children', function () { | ||
fixture.innerHTML = '<div id="target" style="display: none;"><p>Some paragraph text.</p></div>'; | ||
var node = fixture.querySelector('#target'); | ||
assert.isUndefined(checks['hidden-content'].evaluate.call(checkContext, node)); | ||
var params = checkSetup('<div id="target" style="display: none;"><p>Some paragraph text.</p></div>'); | ||
assert.isUndefined(checks['hidden-content'].evaluate.apply(checkContext, params)); | ||
}); | ||
|
||
it('should return undefined with visibility:hidden and children', function () { | ||
fixture.innerHTML = '<div id="target" style="visibility: hidden;"><p>Some paragraph text.</p></div>'; | ||
var node = fixture.querySelector('#target'); | ||
assert.isUndefined(checks['hidden-content'].evaluate.call(checkContext, node)); | ||
var params = checkSetup('<div id="target" style="visibility: hidden;"><p>Some paragraph text.</p></div>'); | ||
assert.isUndefined(checks['hidden-content'].evaluate.apply(checkContext, params)); | ||
}); | ||
|
||
it('should return true with visibility:hidden and parent with visibility:hidden', function () { | ||
fixture.innerHTML = '<div style="visibility: hidden;"><p id="target" style="visibility: hidden;">Some paragraph text.</p></div>'; | ||
var node = fixture.querySelector('#target'); | ||
assert.isTrue(checks['hidden-content'].evaluate.call(checkContext, node)); | ||
var params = checkSetup('<div style="visibility: hidden;"><p id="target" style="visibility: hidden;">Some paragraph text.</p></div>'); | ||
assert.isTrue(checks['hidden-content'].evaluate.apply(checkContext, params)); | ||
}); | ||
|
||
it('should return true with aria-hidden and no content', function () { | ||
fixture.innerHTML = '<span id="target" class="icon" aria-hidden="true"></span>'; | ||
var node = fixture.querySelector('#target'); | ||
assert.isTrue(checks['hidden-content'].evaluate.call(checkContext, node)); | ||
var params = checkSetup('<span id="target" class="icon" aria-hidden="true"></span>'); | ||
assert.isTrue(checks['hidden-content'].evaluate.apply(checkContext, params)); | ||
}); | ||
|
||
it('should skip whitelisted elements', function () { | ||
var node = document.querySelector('head'); | ||
assert.isTrue(checks['hidden-content'].evaluate.call(checkContext, node)); | ||
axe._tree = axe.utils.getFlattenedTree(document.documentElement); | ||
var virtualNode = axe.utils.getNodeFromTree(axe._tree[0], node); | ||
assert.isTrue(checks['hidden-content'].evaluate(node, undefined, virtualNode)); | ||
}); | ||
|
||
(shadowSupport ? it : xit)('works on elements in a shadow DOM', function () { | ||
fixture.innerHTML = '<div id="shadow"> <div id="content">text</div> </div>'; | ||
var shadowRoot = document.getElementById('shadow').attachShadow({ mode: 'open' }); | ||
shadowRoot.innerHTML = '<div id="target" style="display:none">' + | ||
'<slot></slot>' + | ||
'</div>'; | ||
axe._tree = axe.utils.getFlattenedTree(fixture); | ||
|
||
var shadow = document.querySelector('#shadow'); | ||
var virtualShadow = axe.utils.getNodeFromTree(axe._tree[0], shadow); | ||
assert.isTrue( | ||
checks['hidden-content'].evaluate(shadow, undefined, virtualShadow) | ||
); | ||
|
||
var target = shadowRoot.querySelector('#target'); | ||
var virtualTarget = axe.utils.getNodeFromTree(axe._tree[0], target); | ||
assert.isUndefined( | ||
checks['hidden-content'].evaluate(target, undefined, virtualTarget) | ||
); | ||
|
||
var content = document.querySelector('#content'); | ||
var virtualContent = axe.utils.getNodeFromTree(axe._tree[0], content); | ||
assert.isTrue( | ||
checks['hidden-content'].evaluate(content, undefined, virtualContent) | ||
); | ||
}); | ||
}); |
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 |
---|---|---|
@@ -0,0 +1,72 @@ | ||
/* global xit */ | ||
describe('dom.getComposedParent', function () { | ||
'use strict'; | ||
var getComposedParent = axe.commons.dom.getComposedParent; | ||
var fixture = document.getElementById('fixture'); | ||
var shadowSupport = axe.testUtils.shadowSupport.v1; | ||
|
||
afterEach(function () { | ||
fixture.innerHTML = ''; | ||
}); | ||
|
||
it('returns the parentNode normally', function () { | ||
fixture.innerHTML = '<div id="parent"><div id="target"></div></div>'; | ||
|
||
var actual = getComposedParent(document.getElementById('target')); | ||
assert.instanceOf(actual, Node); | ||
assert.equal(actual, document.getElementById('parent')); | ||
}); | ||
|
||
it('returns null from the documentElement', function () { | ||
assert.isNull( | ||
getComposedParent(document.documentElement) | ||
); | ||
}); | ||
|
||
(shadowSupport ? it : xit)('returns the slot node for slotted content', function () { | ||
fixture.innerHTML = '<div id="shadow"><div id="target"></div></div>'; | ||
var shadowRoot = document.getElementById('shadow').attachShadow({ mode: 'open' }); | ||
shadowRoot.innerHTML = '<div id="grand-parent">' + | ||
'<slot id="parent"></slot>' + | ||
'</div>'; | ||
|
||
var actual = getComposedParent(fixture.querySelector('#target')); | ||
assert.instanceOf(actual, Node); | ||
assert.equal(actual, shadowRoot.querySelector('#parent')); | ||
}); | ||
|
||
(shadowSupport ? it : xit)('returns explicitly slotted nodes', function () { | ||
fixture.innerHTML = '<div id="shadow"><div id="target" slot="bar"></div></div>'; | ||
var shadowRoot = document.getElementById('shadow').attachShadow({ mode: 'open' }); | ||
shadowRoot.innerHTML = '<div id="grand-parent">' + | ||
'<slot name="foo"></slot>' + | ||
'<slot id="parent" name="bar"></slot>' + | ||
'</div>'; | ||
|
||
var actual = getComposedParent(fixture.querySelector('#target')); | ||
assert.instanceOf(actual, Node); | ||
assert.equal(actual, shadowRoot.querySelector('#parent')); | ||
}); | ||
|
||
(shadowSupport ? it : xit)('returns elements within a shadow tree', function () { | ||
fixture.innerHTML = '<div id="shadow"> content </div>'; | ||
var shadowRoot = document.getElementById('shadow').attachShadow({ mode: 'open' }); | ||
shadowRoot.innerHTML = '<div id="parent">' + | ||
'<slot id="target"></slot>' + | ||
'</div>'; | ||
|
||
var actual = getComposedParent(shadowRoot.querySelector('#target')); | ||
assert.instanceOf(actual, Node); | ||
assert.equal(actual, shadowRoot.querySelector('#parent')); | ||
}); | ||
|
||
(shadowSupport ? it : xit)('returns the host when it reaches the shadow root', function () { | ||
fixture.innerHTML = '<div id="parent"> content </div>'; | ||
var shadowRoot = document.getElementById('parent').attachShadow({ mode: 'open' }); | ||
shadowRoot.innerHTML = '<div id="target"> <slot></slot> </div>'; | ||
|
||
var actual = getComposedParent(shadowRoot.querySelector('#target')); | ||
assert.instanceOf(actual, Node); | ||
assert.equal(actual, fixture.querySelector('#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
Oops, something went wrong.