Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'android'
- Manifest: toolkit/content/tests/chrome/chrome.toml
<?xml version="1.0"?>
<!--
XUL Widget Test for deck
-->
<window title="Deck Test"
<deck id="deck1" style="padding-top: 5px; padding-bottom: 12px;">
<button id="d1b1" label="Button One"/>
<button id="d1b2" label="Button Two is larger" style="height: 80px; margin: 1px;"/>
</deck>
<deck id="deck2" selectedIndex="1">
<button id="d2b1" label="Button One"/>
<button id="d2b2" label="Button Two"/>
</deck>
<deck id="deck3" selectedIndex="1">
<button id="d3b1" label="Remove me"/>
<button id="d3b2" label="Keep me selected"/>
</deck>
<deck id="deck4" selectedIndex="5">
<button id="d4b1" label="Remove me"/>
<button id="d4b2" label="Remove me"/>
<button id="d4b3" label="Remove me"/>
<button id="d4b4" label="Button 4"/>
<button id="d4b5" label="Button 5"/>
<button id="d4b6" label="Keep me selected"/>
<button id="d4b7" label="Button 7"/>
</deck>
<deck id="deck5" selectedIndex="2">
<button id="d5b1" label="Button 1"/>
<button id="d5b2" label="Button 2"/>
<button id="d5b3" label="Keep me selected"/>
<button id="d5b4" label="Remove me"/>
<button id="d5b5" label="Remove me"/>
<button id="d5b6" label="Remove me"/>
</deck>
<!-- test results are displayed in the html:body -->
<!-- test code goes here -->
<script type="application/javascript"><![CDATA[
add_task(async function run_tests() {
test_deck();
await test_deck_child_removal();
});
function test_deck()
{
var deck = $("deck1");
is(deck.selectedIndex, 0, "deck one selectedIndex");
// this size is the button height, 80, plus the button padding of 1px on each side,
// plus the deck's 5px top padding and the 12px bottom padding.
var rect = deck.getBoundingClientRect();
is(Math.round(rect.bottom) - Math.round(rect.top), 99, "deck size of largest child");
synthesizeMouseExpectEvent(deck, 12, 12, { }, $("d1b1"), "click", "mouse on deck one");
// change the selected page of the deck and ensure that the mouse click goes
// to the button on that page
deck.selectedIndex = 1;
is(deck.selectedIndex, 1, "deck one selectedIndex after change");
synthesizeMouseExpectEvent(deck, 9, 9, { }, $("d1b2"), "click", "mouse on deck one after change");
deck = $("deck2");
is(deck.selectedIndex, 1, "deck two selectedIndex");
synthesizeMouseExpectEvent(deck, 9, 9, { }, $("d2b2"), "click", "mouse on deck two");
}
async function test_deck_child_removal()
{
// Start with a simple case where we have two child nodes in a deck, with
// the second child (index 1) selected. Removing the first node should
// automatically set the selectedIndex at 0.
let deck = $("deck3");
let child = $("d3b1");
is(deck.selectedIndex, 1, "Should have the deck element at index 1 selected");
// Remove the child at the 0th index. The deck should automatically
// set the selectedIndex to "0".
child.remove();
await Promise.resolve();
is(deck.selectedIndex, 0, "Should have the deck element at index 0 selected");
// Now scale it up by using a deck with 7 child nodes, and remove the
// first three, making sure that the selectedIndex is decremented
// each time.
deck = $("deck4");
let expectedIndex = 5;
is(deck.selectedIndex, expectedIndex,
"Should have the deck element at index " + expectedIndex + " selected");
for (let i = 0; i < 3; ++i) {
deck.firstChild.remove();
expectedIndex--;
await Promise.resolve();
is(deck.selectedIndex, expectedIndex,
"Should have the deck element at index " + expectedIndex + " selected");
}
// Check that removing the currently selected node doesn't change
// behaviour.
deck.childNodes[expectedIndex].remove();
await Promise.resolve();
is(deck.selectedIndex, expectedIndex,
"The selectedIndex should not change when removing the node " +
"at the selected index.");
// Finally, make sure we haven't changed the behaviour when removing
// nodes at indexes greater than the selected node.
deck = $("deck5");
expectedIndex = 2;
await Promise.resolve();
is(deck.selectedIndex, expectedIndex,
"Should have the deck element at index " + expectedIndex + " selected");
// And then remove all of the nodes, starting from last to first, making
// sure that the selectedIndex does not change.
while (deck.lastChild) {
deck.lastChild.remove();
await Promise.resolve();
is(deck.selectedIndex, expectedIndex,
"Should have the deck element at index " + expectedIndex + " selected");
}
}
]]>
</script>
</window>