<!DOCTYPE html>
<html>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<label inert for="submit">Label for Submit</label>
<input id="text" type="text">
<input id="submit" type="submit">
<script>
function clickOn(element) {
    return new Promise(function(resolve, reject) {
        if (!window.eventSender)
            reject();

        var absoluteTop = 0;
        var absoluteLeft = 0;
        for (var parentNode = element; parentNode; parentNode = parentNode.offsetParent) {
            absoluteLeft += parentNode.offsetLeft;
            absoluteTop += parentNode.offsetTop;
        }

        var x = absoluteLeft + element.offsetWidth / 2;
        var y = absoluteTop + element.offsetHeight / 2;
        var pointerActions = [{
            source: "mouse",
            actions: [
                { name: "pointerMove", x: x, y: y },
                { name: "pointerDown", x: x, y: x },
                { name: "pointerUp" },
                { name: "pointerMove", x: 0, y: 0}
            ]
        }];
        chrome.gpuBenchmarking.pointerActionSequence(pointerActions, resolve);
    });
}

document.querySelector('#text').focus();

test(function() {
    label = document.querySelector('label');
    label.focus();
    assert_equals(document.activeElement, document.querySelector('#submit'));
}, 'Calling focus() on an inert label should still send focus to its target.');

test(function() {
    clickOn(label).then(() => {
        assert_equals(document.activeElement, document.body);
    });
}, 'Clicking on an inert label should send focus to document.body.');
</script>
</html>
