| if (window.testRunner) { |
| testRunner.overridePreference("WebKitJavaEnabled", "0"); |
| 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"); |
| } |
| } |