<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Delete editable range around elements having inert attribute</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../editing/include/editor-test-utils.js"></script>
<script>
document.addEventListener("DOMContentLoaded", () => {
  const editingHost = document.querySelector("div[contenteditable]");
  const utils = new EditorTestUtils(editingHost);

  test(t => {
    utils.setupEditingHost(t.name, { selection: "setBaseAndExtent" });
    const initialInnerHTML = editingHost.innerHTML;
    document.execCommand("delete");
    const desc = `execCommand("delete") at ${t.name}`
    assert_equals(
      editingHost.innerHTML,
      initialInnerHTML,
      `${desc}: <span> content should not be deleted because anchor node of Selection is in the <span inert>`
    );
  }, "<span inert>a[bc</span><span>de]f</span>");

  test(t => {
    utils.setupEditingHost(t.name, { selection: "setBaseAndExtent" });
    const initialInnerHTML = editingHost.innerHTML;
    document.execCommand("delete");
    const desc = `execCommand("delete") at ${t.name}`
    assert_equals(
      !!editingHost.querySelector("span[inert]"),
      true,
      `${desc}: <span inert> should not be deleted`
    );
    assert_equals(
      editingHost.querySelector("span[inert]").textContent,
      "def",
      `${desc}: <span inert> content should not be deleted`
    );
    assert_not_equals(
      editingHost.innerHTML,
      initialInnerHTML,
      `${desc}: <span> content should be deleted (but how to handle it is not tested here)`
    );
  }, "<span>a[bc</span><span inert>de]f</span>");

  test(t => {
    utils.setupEditingHost(t.name, { selection: "setBaseAndExtent-reverse" });
    const initialInnerHTML = editingHost.innerHTML;
    document.execCommand("delete");
    const desc = `execCommand("delete") at ${t.name} (selection range direction is inverted)`
    assert_equals(
      !!editingHost.querySelector("span[inert]"),
      true,
      `${desc}: <span inert> should not be deleted`
    );
    assert_equals(
      editingHost.querySelector("span[inert]").textContent,
      "def",
      `${desc}: <span inert> content should not be deleted`
    );
    assert_not_equals(
      editingHost.innerHTML,
      initialInnerHTML,
      `${desc}: <span> content should be deleted (but how to handle it is not tested here)`
    );
  }, "<span inert>d[ef</span><span>ab]c</span>");

  test(t => {
    utils.setupEditingHost(t.name, { selection: "setBaseAndExtent-reverse" });
    const initialInnerHTML = editingHost.innerHTML;
    document.execCommand("delete");
    const desc = `execCommand("delete") at ${t.name} (selection range direction is inverted)`
    assert_equals(
      editingHost.innerHTML,
      initialInnerHTML,
      `${desc}: <span> content should not be deleted because anchor node of Selection is in the <span inert>`
    );
  }, "<span>d[ef</span><span inert>ab]c</span>");

  test(t => {
    utils.setupEditingHost(t.name, { selection: "setBaseAndExtent" });
    document.execCommand("delete");
    const desc = `execCommand("delete") at ${t.name}`
    assert_equals(editingHost.innerHTML, "af", `${desc}: <span inert> should be deleted`);
  }, "a[bc<span inert>XYZ</span>de]f");

  test(t => {
    utils.setupEditingHost(t.name, { selection: "setBaseAndExtent" });
    const initialInnerHTML = editingHost.innerHTML;
    document.execCommand("delete");
    const desc = `execCommand("delete") at ${t.name}`
    assert_equals(
      editingHost.innerHTML,
      initialInnerHTML,
      `${desc}: <span> content should not be deleted because anchor node of Selection is in the <span inert>`
    );
  }, `<span inert style="display:contents">a[bc</span><span>de]f</span>`);

  test(t => {
    utils.setupEditingHost(t.name, { selection: "setBaseAndExtent" });
    const initialInnerHTML = editingHost.innerHTML;
    document.execCommand("delete");
    const desc = `execCommand("delete") at ${t.name}`
    assert_equals(
      editingHost.innerHTML,
      initialInnerHTML,
      `${desc}: <span> content should not be deleted because anchor node of Selection is in the <span inert>`
    );
  }, `<span inert style="display:contents">{abc</span><span>de]f</span>`);

  test(t => {
    utils.setupEditingHost(t.name, { selection: "setBaseAndExtent" });
    const initialInnerHTML = editingHost.innerHTML;
    document.execCommand("delete");
    const desc = `execCommand("delete") at ${t.name}`
    assert_equals(
      editingHost.innerHTML,
      initialInnerHTML,
      `${desc}: <span> content should not be deleted because anchor node of Selection is in the <span inert>`
    );
  }, `<span inert><span style="display:contents">a[bc</span></span><span>de]f</span>`);

  test(t => {
    utils.setupEditingHost(t.name, { selection: "setBaseAndExtent" });
    const initialInnerHTML = editingHost.innerHTML;
    document.execCommand("delete");
    const desc = `execCommand("delete") at ${t.name}`
    assert_equals(
      editingHost.innerHTML,
      initialInnerHTML,
      `${desc}: <span> content should not be deleted because anchor node of Selection is in the <span inert>`
    );
  }, `<span inert><span style="display:contents">{abc</span></span><span>de]f</span>`);

  test(t => {
    utils.setupEditingHost(t.name, { selection: "setBaseAndExtent" });
    const initialInnerHTML = editingHost.innerHTML;
    document.execCommand("delete");
    const desc = `execCommand("delete") at ${t.name}`
    assert_equals(
      editingHost.innerHTML,
      initialInnerHTML,
      `${desc}: <span> content should not be deleted because anchor node of Selection is in the <span inert>`
    );
  }, `<span inert style="display:none">a[bc</span><span>de]f</span>`);

  test(t => {
    utils.setupEditingHost(t.name, { selection: "setBaseAndExtent" });
    const initialInnerHTML = editingHost.innerHTML;
    document.execCommand("delete");
    const desc = `execCommand("delete") at ${t.name}`
    assert_equals(
      editingHost.innerHTML,
      initialInnerHTML,
      `${desc}: <span> content should not be deleted because anchor node of Selection is in the <span inert>`
    );
  }, `<span inert style="display:none">{abc</span><span>de]f</span>`);

  test(t => {
    utils.setupEditingHost(t.name, { selection: "setBaseAndExtent" });
    const initialInnerHTML = editingHost.innerHTML;
    document.execCommand("delete");
    const desc = `execCommand("delete") at ${t.name}`
    assert_equals(
      editingHost.innerHTML,
      initialInnerHTML,
      `${desc}: <span> content should not be deleted because anchor node of Selection is in the <span inert>`
    );
  }, `<span inert><span style="display:none">a[bc</span></span><span>de]f</span>`);

  test(t => {
    utils.setupEditingHost(t.name, { selection: "setBaseAndExtent" });
    const initialInnerHTML = editingHost.innerHTML;
    document.execCommand("delete");
    const desc = `execCommand("delete") at ${t.name}`
    assert_equals(
      editingHost.innerHTML,
      initialInnerHTML,
      `${desc}: <span> content should not be deleted because anchor node of Selection is in the <span inert>`
    );
  }, `<span inert><span style="display:none">{abc</span></span><span>de]f</span>`);
});
</script>
</head>
<body>
<div contenteditable></div>
</body>
</html>
