136 lines
4.9 KiB
JavaScript
136 lines
4.9 KiB
JavaScript
if (window.testRunner) {
|
|
testRunner.waitUntilDone();
|
|
testRunner.dumpAsText();
|
|
}
|
|
|
|
var consoleOutput = null;
|
|
var stopTest = false;
|
|
var focusCount = 0;
|
|
var blurCount = 0;
|
|
var focusedElem = null;
|
|
var failedTestCount = 0;
|
|
|
|
var tagNamesAlwaysFocused = ["A",
|
|
"AREA",
|
|
"BUTTON",
|
|
"IFRAME",
|
|
"INPUT",
|
|
"ISINDEX",
|
|
"SELECT",
|
|
"TEXTAREA",
|
|
"AUDIO",
|
|
"VIDEO"];
|
|
|
|
var tagNamesTransferFocused = ["LABEL"]; // labels always transfer focus to the labeled element
|
|
|
|
var noDisplayTagNamesWithFocus = ["AREA"]; // AREA elements can get focus, but are not displayed.
|
|
|
|
function printToConsole(str)
|
|
{
|
|
if (!consoleOutput) {
|
|
consoleOutput = window.frames[2].document.getElementById("theConsole");
|
|
}
|
|
consoleOutput.appendChild(window.frames[2].document.createTextNode(str));
|
|
consoleOutput.appendChild(window.frames[2].document.createElement("br"));
|
|
}
|
|
|
|
function doFocus(elem)
|
|
{
|
|
focusCount++;
|
|
focusedElem = elem;
|
|
}
|
|
|
|
function doBlur(elem)
|
|
{
|
|
blurCount++;
|
|
}
|
|
|
|
function test()
|
|
{
|
|
for (var i = 0; i < 2; ++i)
|
|
focusEachChild(window.frames[i].document.body);
|
|
|
|
// focus an untested element so that blur can be dispatched on the last iframe tested
|
|
var homeBase = window.frames[1].document.getElementsByClassName('homebase');
|
|
homeBase[0].focus();
|
|
|
|
var resultSummary = focusCount+" focus / "+blurCount+" blur events dispatched, and should be 336 / 336 ";
|
|
resultSummary += (focusCount==blurCount) ? "<span style='color:green'>PASSED</span><br>" : "<span style='color:red'>FAILED</span><br>";
|
|
resultSummary += "Total of "+failedTestCount+" focus test(s) failed.";
|
|
if (failedTestCount)
|
|
resultSummary += "<br>Details:<br>"+consoleOutput.innerHTML;
|
|
else
|
|
resultSummary += " <span style='color:green'>PASSED</span>";
|
|
|
|
document.write(resultSummary);
|
|
document.close();
|
|
|
|
if (window.testRunner)
|
|
testRunner.notifyDone();
|
|
}
|
|
|
|
function focusEachChild(elem) {
|
|
var childNodes = elem.childNodes;
|
|
for (var i = 0; i < childNodes.length; i++) {
|
|
if (childNodes[i].nodeType == Node.ELEMENT_NODE && childNodes[i].id) {
|
|
childNodes[i].addEventListener('focus',function () { doFocus(this) }, false);
|
|
childNodes[i].addEventListener('blur',function () { doBlur(this) }, false);
|
|
testProgrammaticFocus(childNodes[i]);
|
|
}
|
|
if (childNodes[i].childNodes.length)
|
|
focusEachChild(childNodes[i]);
|
|
if (childNodes[i].tagName =="IFRAME") {
|
|
if (childNodes[i].id == "iframe1b") {
|
|
window.frames[0].document.body.focus();
|
|
}
|
|
focusEachChild(childNodes[i].contentDocument.body);
|
|
}
|
|
}
|
|
}
|
|
|
|
Array.prototype.find = function(element) {
|
|
for (var i = 0; i < this.length; i++) {
|
|
if(this[i] == element) {
|
|
return this[i];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function testProgrammaticFocus(elem)
|
|
{
|
|
var elemThatShouldFocus = null;
|
|
var shouldFocusOtherElement = false;
|
|
focusedElem = null;
|
|
|
|
if (elem.tabIndex == elem.getAttribute("tabindex")) // this means tabindex was explicitly set
|
|
elemThatShouldFocus = elem;
|
|
else if (tagNamesAlwaysFocused.find(elem.tagName)) // special case form elements and other controls that are always focusable
|
|
elemThatShouldFocus = elem;
|
|
|
|
// Hidden elements should not be focusable. https://bugs.webkit.org/show_bug.cgi?id=27099
|
|
if (document.defaultView.getComputedStyle(elem).display == "none" && !noDisplayTagNamesWithFocus.find(elem.tagName))
|
|
elemThatShouldFocus = null;
|
|
|
|
// AREA elements with tabindex = -1 should not be focusable.
|
|
if (elem.tabIndex == -1 && elem.tagName == "AREA")
|
|
elemThatShouldFocus = null;
|
|
|
|
if (tagNamesTransferFocused.find(elem.tagName) && elemThatShouldFocus == null)
|
|
shouldFocusOtherElement = true;
|
|
|
|
elem.focus();
|
|
if ((!shouldFocusOtherElement && elemThatShouldFocus == focusedElem) || (shouldFocusOtherElement && elem != focusedElem))
|
|
printToConsole("<"+elem.tagName+"> "+elem.id+" PASSED focus test");
|
|
else {
|
|
failedTestCount++;
|
|
printToConsole(elem.id+" FAILED - was " + (focusedElem ? "" : " not ") + " focused but focus " + (elemThatShouldFocus ? " was " : " wasn\'t") + " expected");
|
|
if (elemThatShouldFocus && focusedElem)
|
|
printToConsole("elemThatShouldFocus is <"+elemThatShouldFocus.tagName+"> "+elemThatShouldFocus.id+", focusedElem is <"+focusedElem.tagName+"> "+focusedElem.id);
|
|
if (!elemThatShouldFocus)
|
|
printToConsole("elemThatShouldFocus is null, focusedElem is <"+focusedElem.tagName+"> "+focusedElem.id);
|
|
if (!focusedElem)
|
|
printToConsole("elemThatShouldFocus is <"+elemThatShouldFocus.tagName+"> "+elemThatShouldFocus.id+", focusedElem is null");
|
|
}
|
|
}
|