GEN_INCLUDE(['node_util.js']);
GEN_INCLUDE(['../testing/webstore_extension_test_base.js']);
NodeUtilUnitTest = class extends WebstoreExtensionTest {};
TEST_F('NodeUtilUnitTest', 'IsFocusable', function() {
assertFalse(NodeUtil.isFocusable(null));
const noTabIndex = document.createElement('div');
assertFalse(NodeUtil.isFocusable(noTabIndex));
const positiveTabIndex = document.createElement('div');
positiveTabIndex.tabIndex = 1;
assertTrue(NodeUtil.isFocusable(positiveTabIndex));
const zeroTabIndex = document.createElement('div');
zeroTabIndex.tabIndex = 0;
assertTrue(NodeUtil.isFocusable(zeroTabIndex));
const button = document.createElement('button');
assertTrue(NodeUtil.isFocusable(button));
const negativeTwoTabIndex = document.createElement('button');
negativeTwoTabIndex.tabIndex = -2;
assertFalse(NodeUtil.isFocusable(negativeTwoTabIndex));
const negativeOneDiv = document.createElement('div');
negativeOneDiv.tabIndex = -1;
assertTrue(NodeUtil.isFocusable(negativeOneDiv));
const negativeOneButton = document.createElement('button');
negativeOneButton.tabIndex = -1;
assertTrue(NodeUtil.isFocusable(negativeOneButton));
});
TEST_F('NodeUtilUnitTest', 'IsDescendantOfNode', function() {
const grandparent = document.createElement('div');
const parent = document.createElement('p');
const child = document.createElement('span');
const orphan = document.createElement('img');
grandparent.appendChild(parent);
parent.appendChild(child);
assertTrue(NodeUtil.isDescendantOfNode(parent, grandparent));
assertTrue(NodeUtil.isDescendantOfNode(child, grandparent));
assertTrue(NodeUtil.isDescendantOfNode(child, parent));
assertFalse(NodeUtil.isDescendantOfNode(orphan, parent));
assertFalse(NodeUtil.isDescendantOfNode(orphan, grandparent));
assertFalse(NodeUtil.isDescendantOfNode(orphan, parent));
assertFalse(NodeUtil.isDescendantOfNode(grandparent, parent));
assertFalse(NodeUtil.isDescendantOfNode(grandparent, child));
assertFalse(NodeUtil.isDescendantOfNode(parent, child));
assertFalse(NodeUtil.isDescendantOfNode(grandparent, orphan));
assertFalse(NodeUtil.isDescendantOfNode(parent, orphan));
assertFalse(NodeUtil.isDescendantOfNode(child, orphan));
});
TEST_F('NodeUtilUnitTest', 'SetFocusToNode', function() {
let focusCount;
let selectCount;
const button = document.createElement('button');
button.focus = () => focusCount++;
button.select = () => selectCount--;
focusCount = 0;
selectCount = 0;
assertTrue(NodeUtil.setFocusToNode(button));
assertEquals(1, focusCount);
assertEquals(0, selectCount);
const iframe = document.createElement('iframe');
iframe.tabIndex = 0;
iframe.focus = () => focusCount--;
iframe.select = () => selectCount--;
focusCount = 0;
selectCount = 0;
assertFalse(NodeUtil.setFocusToNode(iframe));
assertEquals(0, focusCount);
assertEquals(0, selectCount);
const input = document.createElement('input');
input.focus = () => focusCount++;
input.select = () => selectCount++;
focusCount = 0;
selectCount = 0;
assertTrue(NodeUtil.setFocusToNode(input));
assertEquals(1, focusCount);
assertEquals(1, selectCount);
const focusableDiv = document.createElement('div');
focusableDiv.tabIndex = 0;
focusableDiv.focus = () => focusCount++;
focusableDiv.select = () => selectCount--;
const p = document.createElement('p');
p.focus = () => focusCount--;
p.select = () => selectCount--;
focusableDiv.appendChild(p);
focusCount = 0;
selectCount = 0;
assertTrue(NodeUtil.setFocusToNode(p));
assertEquals(1, focusCount);
assertEquals(0, selectCount);
const img = document.createElement('img');
img.focus = () => focusCount--;
img.select = () => selectCount--;
document.body.appendChild(img);
document.body.focus = () => focusCount--;
document.body.select = () => selectCount--;
focusCount = 0;
selectCount = 0;
assertFalse(NodeUtil.setFocusToNode(img));
assertEquals(0, focusCount);
assertEquals(0, selectCount);
});
TEST_F('NodeUtilUnitTest', 'SetFocusToFirstFocusable', function() {
let focusACount = 0;
let focusPCount = 0;
let focusButtonCount = 0;
const a = document.createElement('a');
a.focus = () => focusACount++;
const p = document.createElement('p');
p.focus = () => focusPCount++;
const button = document.createElement('button');
button.focus = () => focusButtonCount++;
assertTrue(NodeUtil.setFocusToFirstFocusable([a, p, button]));
assertEquals(1, focusACount);
assertEquals(0, focusPCount);
assertEquals(0, focusButtonCount);
focusACount = 0;
assertTrue(NodeUtil.setFocusToFirstFocusable([p, button, a]));
assertEquals(0, focusACount);
assertEquals(0, focusPCount);
assertEquals(1, focusButtonCount);
assertFalse(NodeUtil.setFocusToFirstFocusable([p]));
assertFalse(NodeUtil.setFocusToFirstFocusable([]));
});