summaryrefslogtreecommitdiffstats
path: root/devtools/client/accessibility/provider.js
blob: 1efe50466867e6f12b4a7a014a5646b038839c73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/* 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";

const {
  fetchChildren,
} = require("devtools/client/accessibility/actions/accessibles");

/**
 * Data provider that is responsible for mapping of an accessibles cache to the
 * data format that is supported by the TreeView component.
 * @param {Map}      accessibles accessibles object cache
 * @param {Function} dispatch    react dispatch function that triggers a redux
 *                               action.
 */

class Provider {
  constructor(accessibles, filtered, dispatch) {
    this.accessibles = accessibles;
    this.filtered = filtered;
    this.dispatch = dispatch;
  }

  /**
   * Get accessible's cached children if available, if not fetch them from
   * backend.
   * @param {Object}  accessible accessible object whose children to get.
   * @returns {Array} arraof of accessible children.
   */
  getChildren(accessible) {
    if (!accessible || !accessible.actorID || accessible.childCount === 0) {
      return [];
    }

    const obj = this.accessibles.get(accessible.actorID);
    if (!obj || !obj.children) {
      return this.dispatch(fetchChildren(accessible));
    }

    return obj.children;
  }

  /**
   * Return a flag indicating if an accessible object has any children.
   * @param {Object}    accessible accessible object whose children to get.
   * @returns {Boolean} idicator of whether accessible object has children.
   */
  hasChildren(accessible) {
    return accessible.childCount > 0;
  }

  /**
   * Get a value for an accessible object. Used to render the second (value)
   * column of the accessible tree. Corresponds to an accesible object name, if
   * available.
   * @param {Object}   accessible accessible object
   * @returns {String} accessible object value.
   */
  getValue(accessible) {
    return accessible.name || "";
  }

  /**
   * Get a label for an accessible object. Used to render the first column of
   * the accessible tree. Corresponds to an accessible object role.
   * @param {Object}   accessible accessible object
   * @returns {String} accessible object label.
   */
  getLabel(accessible) {
    return accessible.role;
  }

  /**
   * Get a unique key for an accessible object. Corresponds to an accessible
   * front's actorID.
   * @param {Object}   accessible accessible object
   * @returns {String} a key for an accessible object.
   */
  getKey(accessible) {
    return accessible.actorID;
  }

  /**
   * Get a type of an accesible object. Corresponds to the type of an accessible
   * front.
   * @param {Object}   accessible accessible object
   * @returns {String} accessible object type
   */
  getType(accessible) {
    return accessible.typeName;
  }

  /**
   * Get the depth of the accesible object in the accessibility tree. When the
   * tree is filtered it is flattened and the level is set to 0. Otherwise use
   * internal TreeView level.
   *
   * @param {Object}   accessible
   *                   accessible object
   * @param {Number}   defaultLevel
   *                   default level provided by the TreeView component.
   *
   * @returns {null|Number}
   *          depth level of the accessible object.
   */
  getLevel(accessible, defaultLevel) {
    return this.filtered ? 0 : defaultLevel;
  }
}

exports.Provider = Provider;