chromium/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-summary-element/activation-behavior.html

<!DOCTYPE html>
<meta charset="utf-8">
<title>summary element: activation behavior</title>
<link rel="author" title="Domenic Denicola" href="mailto:[email protected]">
<link rel="help" href="https://html.spec.whatwg.org/multipage/#the-summary-element">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<div id="log"></div>

<details id="happy-path-starts-closed">
  <summary id="happy-path-starts-closed-summary">Summary</summary>
  <p>Contents</p>
</details>

<details id="happy-path-starts-open" open>
  <summary id="happy-path-starts-open-summary">Summary</summary>
  <p>Contents</p>
</details>

<details id="details-not-being-rendered" style="display: none">
  <summary id="details-not-being-rendered-summary">Summary</summary>
  <p>Contents</p>
</details>

<details id="summary-not-being-rendered">
  <summary id="summary-not-being-rendered-summary" style="display: none">Summary</summary>
  <p>Contents</p>
</details>

<details id="has-preceding-element">
  <span></span>
  <summary id="has-preceding-element-summary">Summary</summary>
  <p>Contents</p>
</details>

<details id="has-preceding-summary">
  <summary>Summary 1</summary>
  <summary id="has-preceding-summary-summary">Summary 2</summary>
  <p>Contents</p>
</details>

<details id="has-preceding-summary-descendant">
  <span><summary>Summary 1</summary></span>
  <summary id="has-preceding-summary-descendant-summary">Summary 2</summary>
  <p>Contents</p>
</details>

<details id="summary-nested">
  <span><summary id="summary-nested-summary">Summary</summary></span>
  <p>Contents</p>
</details>

<details id="toggle-tester">
  <summary>Summary</summary>
  <p>Contents</p>
</details>

<script>
"use strict";

testSummary(
  "happy-path-starts-closed", false, true,
  "Should open a closed details if all conditions are met"
);

testSummary(
  "happy-path-starts-open", true, false,
  "Should close an open details if all conditions are met"
);

testSummary(
  "details-not-being-rendered", false, true,
  "Should open a closed details even if the details is not being rendered"
);

testSummary(
  "summary-not-being-rendered", false, true,
  "Should open a closed details even if the summary is not being rendered"
);

testSummary(
  "has-preceding-element", false, true,
  "Should open a closed details if a span element precedes the summary"
);

testSummary(
  "has-preceding-summary", false, false,
  "Should stay closed if another summary element precedes the summary"
);

testSummary(
  "has-preceding-summary-descendant", false, true,
  "Should open a closed details if another summary element *nested inside a span* precedes the summary"
);

testSummary(
  "summary-nested", false, false,
  "Should stay closed if the summary element is nested inside a span element"
);

async_test(t => {
  const details = document.getElementById("toggle-tester");
  const summary = details.firstElementChild;

  let timesToggleFired = 0;
  details.addEventListener("toggle", t.step_func(() => {
    ++timesToggleFired;
  }));

  t.step_timeout(() => {
    assert_equals(timesToggleFired, 1, "Expected toggle to fire exactly once");
    t.done();
  }, 200);

  summary.click();
  summary.click();
  summary.click();
  summary.click();
  Promise.resolve().then(() => summary.click());

}, "toggle events should be coalesced even when using the activation behavior of a summary");

function testSummary(detailsId, expectedBefore, expectedAfter, name) {
  test(() => {
    const details = document.getElementById(detailsId);
    const summary = document.getElementById(detailsId + "-summary");

    assert_equals(details.open, expectedBefore, "Before activation: expected open to be " + expectedBefore);
    summary.click();
    assert_equals(details.open, expectedAfter, "After activation: expected open to be " + expectedAfter);
  }, name);
}
</script>