/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

"use strict";

/* import-globals-from ../../mochitest/role.js */
loadScripts({ name: "role.js", dir: MOCHITESTS_DIR });

async function testTreeOnHide(browser, accDoc, containerID, id, before, after) {
  let acc = findAccessibleChildByID(accDoc, containerID);
  testAccessibleTree(acc, before);

  let onReorder = waitForEvent(EVENT_REORDER, containerID);
  await invokeSetStyle(browser, id, "visibility", "hidden");
  await onReorder;

  testAccessibleTree(acc, after);
}

async function test3(browser, accessible) {
  let tree = {
    SECTION: [
      // container
      {
        SECTION: [
          // parent
          {
            SECTION: [
              // child
              { TEXT_LEAF: [] },
            ],
          },
        ],
      },
      {
        SECTION: [
          // parent2
          {
            SECTION: [
              // child2
              { TEXT_LEAF: [] },
            ],
          },
        ],
      },
    ],
  };
  testAccessibleTree(accessible, tree);

  let onReorder = waitForEvent(EVENT_REORDER, "t3_container");
  await invokeContentTask(browser, [], () => {
    let doc = content.document;
    doc.getElementById("t3_container").style.color = "red";
    doc.getElementById("t3_parent").style.visibility = "hidden";
    doc.getElementById("t3_parent2").style.visibility = "hidden";
  });
  await onReorder;

  tree = {
    SECTION: [
      // container
      {
        SECTION: [
          // child
          { TEXT_LEAF: [] },
        ],
      },
      {
        SECTION: [
          // child2
          { TEXT_LEAF: [] },
        ],
      },
    ],
  };
  testAccessibleTree(accessible, tree);
}

async function test4(browser, accessible) {
  let tree = {
    SECTION: [{ TABLE: [{ ROW: [{ CELL: [] }] }] }],
  };
  testAccessibleTree(accessible, tree);

  let onReorder = waitForEvent(EVENT_REORDER, "t4_parent");
  await invokeContentTask(browser, [], () => {
    let doc = content.document;
    doc.getElementById("t4_container").style.color = "red";
    doc.getElementById("t4_child").style.visibility = "visible";
  });
  await onReorder;

  tree = {
    SECTION: [
      {
        TABLE: [
          {
            ROW: [
              {
                CELL: [
                  {
                    SECTION: [
                      {
                        TEXT_LEAF: [],
                      },
                    ],
                  },
                ],
              },
            ],
          },
        ],
      },
    ],
  };
  testAccessibleTree(accessible, tree);
}

addAccessibleTask(
  "e10s/doc_treeupdate_visibility.html",
  async function (browser, accDoc) {
    let t3Container = findAccessibleChildByID(accDoc, "t3_container");
    let t4Container = findAccessibleChildByID(accDoc, "t4_container");

    await testTreeOnHide(
      browser,
      accDoc,
      "t1_container",
      "t1_parent",
      {
        SECTION: [
          {
            SECTION: [
              {
                SECTION: [{ TEXT_LEAF: [] }],
              },
            ],
          },
        ],
      },
      {
        SECTION: [
          {
            SECTION: [{ TEXT_LEAF: [] }],
          },
        ],
      }
    );

    await testTreeOnHide(
      browser,
      accDoc,
      "t2_container",
      "t2_grandparent",
      {
        SECTION: [
          {
            // container
            SECTION: [
              {
                // grand parent
                SECTION: [
                  {
                    SECTION: [
                      {
                        // child
                        TEXT_LEAF: [],
                      },
                    ],
                  },
                  {
                    SECTION: [
                      {
                        // child2
                        TEXT_LEAF: [],
                      },
                    ],
                  },
                ],
              },
            ],
          },
        ],
      },
      {
        SECTION: [
          {
            // container
            SECTION: [
              {
                // child
                TEXT_LEAF: [],
              },
            ],
          },
          {
            SECTION: [
              {
                // child2
                TEXT_LEAF: [],
              },
            ],
          },
        ],
      }
    );

    await test3(browser, t3Container);
    await test4(browser, t4Container);

    await testTreeOnHide(
      browser,
      accDoc,
      "t5_container",
      "t5_subcontainer",
      {
        SECTION: [
          {
            // container
            SECTION: [
              {
                // subcontainer
                TABLE: [
                  {
                    ROW: [
                      {
                        CELL: [
                          {
                            SECTION: [
                              {
                                // child
                                TEXT_LEAF: [],
                              },
                            ],
                          },
                        ],
                      },
                    ],
                  },
                ],
              },
            ],
          },
        ],
      },
      {
        SECTION: [
          {
            // container
            SECTION: [
              {
                // child
                TEXT_LEAF: [],
              },
            ],
          },
        ],
      }
    );

    await testTreeOnHide(
      browser,
      accDoc,
      "t6_container",
      "t6_subcontainer",
      {
        SECTION: [
          {
            // container
            SECTION: [
              {
                // subcontainer
                TABLE: [
                  {
                    ROW: [
                      {
                        CELL: [
                          {
                            TABLE: [
                              {
                                // nested table
                                ROW: [
                                  {
                                    CELL: [
                                      {
                                        SECTION: [
                                          {
                                            // child
                                            TEXT_LEAF: [],
                                          },
                                        ],
                                      },
                                    ],
                                  },
                                ],
                              },
                            ],
                          },
                        ],
                      },
                    ],
                  },
                ],
              },
              {
                SECTION: [
                  {
                    // child2
                    TEXT_LEAF: [],
                  },
                ],
              },
            ],
          },
        ],
      },
      {
        SECTION: [
          {
            // container
            SECTION: [
              {
                // child
                TEXT_LEAF: [],
              },
            ],
          },
          {
            SECTION: [
              {
                // child2
                TEXT_LEAF: [],
              },
            ],
          },
        ],
      }
    );
  },
  { iframe: true, remoteIframe: true }
);

/**
 * Test that display: contents children are correctly omitted from a visibility:
 * hidden subtree.
 */
addAccessibleTask(
  `
<div id="container">
  <div id="visibility" style="overflow: hidden;">
    <a href="/" style="display: contents;">test</a>
  </div>
</div>
  `,
  async function testDisplayContentsInHidden(browser, docAcc) {
    await testTreeOnHide(
      browser,
      docAcc,
      "container",
      "visibility",
      { SECTION: [{ SECTION: [{ LINK: [{ TEXT_LEAF: [] }] }] }] },
      { SECTION: [] }
    );
  },
  { chrome: true, topLevel: true }
);
