<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p>This test ensures that the focus ring is shown on the only anchor after tabbing out and inside the window.</p>
<a id="anchor" href="javascript:log('anchor was clicked')">Anchor</a>
<input id="input">
<pre id="console">
</pre>

<script>
var anchor = document.getElementById('anchor');
var input = document.getElementById('input');
window.onfocus = function() {
    log('window was focused');
};
window.onblur = function() {
    log('window was blurred');
};
anchor.onfocus = function() {
    log('anchor was focused');
};
anchor.onblur = function() {
    log('anchor was blurred');
};
input.onfocus = function() {
    log('input was focused');
};
input.onblur = function() {
    log('input was blurred');
};
window.onload = function() {
    if (window.eventSender) {
        // Click the link.
        eventSender.mouseMoveTo(anchor.offsetLeft + 2, anchor.offsetTop + 2);
        eventSender.mouseDown();
        eventSender.mouseUp();
        // Shift focus to input element.
        eventSender.keyDown('\t');
        internals.setFocused(false);
        testRunner.overridePreference('WebKitTabToLinksPreferenceKey', true);
        // Set focus to the anchor.
        internals.setInitialFocus(false);
        // Upon focus, the default focus ring should be displayed because the
        // focus was triggered by the keyboard (tab).
        internals.setFocused(true);
    }
};

function log(message) {
    var console = document.getElementById("console");
    console.textContent += message + '\n';
}
</script>
</body>
</html>
