chromium/third_party/blink/web_tests/html/details_summary/details-open-toggle-event.html

<!DOCTYPE html>
<html>
<head>
<link rel="help" href="http://www.whatwg.org/specs/web-apps/current-work/multipage/interactive-elements.html#attr-details-open">
<script src="../../resources/js-test.js"></script>
</head>
<body>
<details id="details" ontoggle="handleToggleEventFromHTMLAttribute(event)">
    <summary>details</summary>
    <input>
</details>
<script>
description("Tests that a 'toggle' event is fired asynchronously whenever the open attribute is added to or removed from a details element.");
window.jsTestIsAsync = true;

var toggleEventCount = 0;
var toggleEventCountFromHTMLAttribute = 0;
var testEvent;

function handleToggleEventFromHTMLAttribute(ev) {
    testEvent = ev;
    shouldBe("testEvent.__proto__", "ToggleEvent.prototype");
    shouldBeEqualToString("testEvent.type", "toggle");
    ++toggleEventCountFromHTMLAttribute;
}

function handleToggleEvent(ev) {
    testEvent = ev;
    shouldBe("testEvent.__proto__", "ToggleEvent.prototype");
    shouldBeEqualToString("testEvent.type", "toggle");
    ++toggleEventCount;
}

function checkSingleToggleEvent() {
    shouldBe("toggleEventCount", "1");
    shouldBe("toggleEventCountFromHTMLAttribute", "1");
    shouldBeTrue("details.open");
    testEventsCoalesced();
}

function testToogleEventFired() {
    shouldBe("toggleEventCount", "0");
    shouldBe("toggleEventCountFromHTMLAttribute", "0");
    details.open = true;
    shouldBe("toggleEventCount", "0");
    shouldBe("toggleEventCountFromHTMLAttribute", "0");
    setTimeout(checkSingleToggleEvent, 0);
}

function checkEventsCoalesced() {
    shouldBe("toggleEventCount", "2");
    shouldBe("toggleEventCountFromHTMLAttribute", "2");
    shouldBeFalse("details.open");
    finishJSTest();
}

function testEventsCoalesced() {
    // When the open attribute is toggled several times in succession,
    // these steps essentially get coalesced so that only one event is
    // fired.
    details.open = false;
    details.open = true;
    details.open = false;
    setTimeout(checkEventsCoalesced, 0);
}

var details = document.getElementById("details");
shouldBe("details.ontoggle.__proto__", "Function.prototype");
details.addEventListener("toggle", handleToggleEvent);
shouldBeFalse("details.open");
testToogleEventFired();
</script>
</body>
</html>