devtools/client/accessibility/test/mochitest/test_accessible_relations.html
author Yura Zenevich <yura.zenevich@gmail.com>
Wed, 10 Oct 2018 19:18:03 +0000
changeset 496335 2084a929ec4cbf31dda4df9935ba4bb38002a6bd
child 497926 edc4ae8f78e2fb02647d7cd85cb19830a17dcd1d
permissions -rw-r--r--
Bug 1492866 - add accessible relations to accessibility panel sidebar. r=pbro MozReview-Commit-ID: 5u8SRnlnFyN Differential Revision: https://phabricator.services.mozilla.com/D7208

<!-- 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/. -->
<!DOCTYPE HTML>
<html>
<!--
Test that openLink function is called if accessible object property is rendered as a link.
-->
<head>
  <meta charset="utf-8">
  <title>Accessible component test</title>
  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
  <link rel="stylesheet" href="chrome://devtools/skin/light-theme.css" type="text/css">
</head>
<body>
<pre id="test">
<script src="head.js" type="application/javascript"></script>
<script type="application/javascript">

"use strict";

window.onload = async function() {
  try {
    const ReactDOM = browserRequire("devtools/client/shared/vendor/react-dom");
    const { createFactory, createElement } =
      browserRequire("devtools/client/shared/vendor/react");
    const { Provider } = require("devtools/client/shared/vendor/react-redux");
    const createStore = require("devtools/client/shared/redux/create-store")();
    const { Simulate } =
      browserRequire("devtools/client/shared/vendor/react-dom-test-utils");
    const Accessible = createFactory(
      browserRequire("devtools/client/accessibility/components/Accessible"));

    const a = Accessible({ labelledby: "Test Accessible" });
    ok(a, "Should be able to create Accessible instances");

    const mockState = {
      details: {
        DOMNode: {},
        accessible: {
          on: () => {},
          off: () => {}
        }
      },
      ui: {
        supports: {}
      }
    };

    const mockStore = createStore((state, action) =>
      action ? { ...state, ...action } : state, mockState);
    const provider = createElement(Provider, { store: mockStore }, a);
    const accessible = ReactDOM.render(provider, window.document.body);
    ok(accessible, "Should be able to mount Accessible instances");

    info("Render accessible object when relations are not supported.");
    let relationsNode = document.getElementById("/relations");
    ok(!relationsNode, "Relations are not rendered when not supported.");

    info("Render accessible object when relations are supported but are empty.");
    let state = {
      ...mockState,
      ui: {
        supports: {
          relations: true
        }
      }
    };
    await mockStore.dispatch({ type: "update", ...state });
    relationsNode = document.getElementById("/relations");
    ok(relationsNode, "Relations are rendered when supported.");
    let arrow = relationsNode.querySelector(".arrow.theme-twisty");
    is(arrow.style.visibility, "hidden", "Relations are empty.");

    info("Render accessible object with relations.");
    state = {
      details: {
        ...mockState.details,
        relations: {
          "containing document": {
            actorID: "server1.conn2.child1/accessible29",
            typeName: "accessible",
            name: "New Tab",
            role: "document"
          }
        }
      },
      ui: {
        supports: {
          relations: true
        }
      }
    };
    await mockStore.dispatch({ type: "update", ...state });
    relationsNode = document.getElementById("/relations");
    ok(relationsNode, "Relations are rendered when supported.");
    arrow = relationsNode.querySelector(".arrow.theme-twisty");
    ok(!arrow.style.visibility,
      "There is at least one relation for the current accessible object.");

    Simulate.click(arrow, null);
    const relationNode = document.getElementById("/relations/containing document");
    ok(relationNode, "Relation node is rendered.");
    ok(relationNode.textContent.includes(
      state.details.relations["containing document"].name),
      "Relation target's name is rendered");
    ok(relationNode.textContent.includes(
      state.details.relations["containing document"].role),
      "Relation target's name is rendered");
    ok(relationNode.querySelector(".open-accessibility-inspector"),
      "Select accessible button is rendered.");
  } catch (e) {
    ok(false, "Got an error: " + DevToolsUtils.safeErrorString(e));
  } finally {
    SimpleTest.finish();
  }
};
</script>
</pre>
</body>
</html>