| <!DOCTYPE html> | 
 | <html> | 
 | <head> | 
 | <style> | 
 | .square { | 
 |     -webkit-box-align: center; | 
 |     -webkit-user-select: none; | 
 |     background-color: blue; | 
 |     color: red; | 
 |     display: -webkit-box; | 
 |     font-weight: bold; | 
 |     height: 128px; | 
 |     left: 700px; | 
 |     position: absolute; | 
 |     text-align: center; | 
 |     top: 105%; /* Position the element such that we must scroll to it. */ | 
 |     width: 128px; | 
 | } | 
 |  | 
 | .square:hover { | 
 |     background-color: yellow; | 
 | } | 
 |  | 
 | </style> | 
 | </head> | 
 | <body> | 
 | <p>This test can be used to verify that we don't temporarily remove the CSS hover style between the touchend and click events when finger-pressing and -releasing on the same element that is positioned outside the visible content area initially. Perform the following:</p> | 
 | <ol> | 
 |     <li>Scroll the page until the blue square is visible.</li> | 
 |     <li>Tap on the blue square.</li> | 
 | </ol> | 
 | <p>This test PASSED if there are three PASS messages followed by TEST COMPLETE below; otherwise, it FAILED.</p> | 
 | <div id="square" class="square">Tap me then scroll up to see results</div> | 
 | <pre id="console"></pre> | 
 | <script> | 
 | function addOrRemoveEventListeners(element, shouldAddListeners) | 
 | { | 
 |     var functionToCall = shouldAddListeners == undefined || shouldAddListeners ? "addEventListener" : "removeEventListener"; | 
 |     element[functionToCall]("touchstart", checkHoverState, true); | 
 |     element[functionToCall]("touchend", checkHoverState, true); | 
 |     element[functionToCall]("click", checkHoverState, true); | 
 | } | 
 |  | 
 | function log(message) | 
 | { | 
 |     document.getElementById("console").appendChild(document.createTextNode(message + "\n")); | 
 | } | 
 |  | 
 | function testElementBackgroundColor(element, eventType, expectedResult) | 
 | { | 
 |     var actualResult = window.getComputedStyle(square, null).backgroundColor; | 
 |     if (actualResult === expectedResult) | 
 |         log("PASS, backgroundColor on " +  eventType + " is " + expectedResult + "."); | 
 |     else | 
 |         log("FAIL, backgroundColor on " + eventType + " should be " + expectedResult + ". Was " + actualResult + "."); | 
 | } | 
 |  | 
 | function checkHoverState(e) | 
 | { | 
 |     testElementBackgroundColor(square, e.type, "rgb(255, 255, 0)" /* Yellow */); | 
 |     if (e.type === "click") { | 
 |         addOrRemoveEventListeners(square, false /* Remove event listeners */); | 
 |         log("TEST COMPLETE"); | 
 |     } | 
 | } | 
 |  | 
 | var square = document.getElementById("square"); | 
 | addOrRemoveEventListeners(square); | 
 | </script> | 
 | </body> | 
 | </html> |