<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<script>
description('Blurring and focusing the window should blur and focus the focused element');

var divElement = document.createElement('div');
divElement.tabIndex = 0;
divElement.textContent = 'Outer';
document.body.appendChild(divElement);

var iframeElement = document.createElement('iframe');
document.body.appendChild(iframeElement);
var iframe = window.frames[0];
var innerDiv = iframeElement.contentDocument.createElement('div');
innerDiv.textContent = 'Inner';
innerDiv.tabIndex = 0;
iframeElement.contentDocument.body.appendChild(innerDiv);

var thisObjects = [];
var events = [];
var targets = [];

// Focus before setting up event listeners.
divElement.focus();

divElement.onfocus = divElement.onblur = window.onfocus = window.onblur =
    innerDiv.onfocus = innerDiv.onblur = iframe.onfocus = iframe.onblur = function(e)
{    
    thisObjects.push(this);
    events.push(e.type);
    targets.push(e.target);
};

if (window.testRunner) {
    window.testRunner.setWindowIsKey(false);
    window.testRunner.setWindowIsKey(true);
    
    innerDiv.focus();
    divElement.focus();
}

var i = 0;
function testNextEvent(target, eventType)
{
    shouldBe('thisObjects[' + i + ']', target);
    shouldBeEqualToString('events[' + i + ']', eventType);
    shouldBe('targets[' + i + ']', target);
    i++;
}

testNextEvent('divElement', 'blur');
testNextEvent('window', 'blur');
testNextEvent('window', 'focus');
testNextEvent('divElement', 'focus');

testNextEvent('divElement', 'blur');
testNextEvent('window', 'blur');
testNextEvent('iframe', 'focus');
testNextEvent('innerDiv', 'focus');

testNextEvent('innerDiv', 'blur');
testNextEvent('iframe', 'blur');
testNextEvent('window', 'focus');
testNextEvent('divElement', 'focus');

document.body.removeChild(divElement);
document.body.removeChild(iframeElement);
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
