<!DOCTYPE html>
To test manually, click on all the form elements (except the textbox) and the details/summary
element. The anchor shouldn't be activated (i.e. you shouldn't see any "anchor activated" messages).
<a href="javascript:anchorActivated()">
    <form action="javascript:formSubmitted()">
        <input type=text>
        <input type=submit>
        <input type=image>
        <button>button</button>
        <input type=reset>
        <button type=reset>button reset</button>
        <input type=checkbox>
        <input type=radio>
        <input type=file>
	</form>
    <details><summary>summary</summary>details</details>
</a>

<pre>

</pre>

<script>
if (window.testRunner)
    testRunner.dumpAsText();

function log(message) { document.querySelector("pre").innerHTML += message + "\n"; }
function formSubmitted() { log("form submitted\n"); }
function anchorActivated() { log("anchor activated\n"); }

document.forms[0].children[0].value = "blah";

for (var i=0; i < document.forms[0].children.length; i++) {
    var element = document.forms[0].children[i];

    element.addEventListener("click", function () {
        log("Activated " + this + " type=" + this.type);
    }, false);

    if (!window.eventSender)
        continue;

    if (element.type == "text") {
        log("Focusing " + element + " type=" + element.type + " and pressing enter");
        element.focus();
        eventSender.keyDown("\n");
        continue;
    }

    eventSender.mouseMoveTo(element.offsetLeft + element.clientWidth / 2, element.offsetTop + element.clientHeight / 2);
    eventSender.mouseDown();
    eventSender.mouseUp();

    if (element.type == "radio" || element.type == "checkbox")
        continue;

    log("Focusing " + element + " type=" + element.type + " and pressing enter");
    element.focus();
    eventSender.keyDown("\n");
}

if (window.eventSender) {
    var details = document.querySelector("details");
    eventSender.mouseMoveTo(details.offsetLeft + details.clientWidth / 2, details.offsetTop + details.clientHeight / 2);
    eventSender.mouseDown();
    eventSender.mouseUp();
    log("\nThe details element was " + (details.open ? "" : "not ") + "opened");
}

if (window.testRunner)
    document.querySelector("a").style.display = "none";
</script>
