tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

picker.js (4398B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 "use strict";
      6 
      7 const {
      8  L10N,
      9 } = require("resource://devtools/client/accessibility/utils/l10n.js");
     10 
     11 class Picker {
     12  constructor(panel) {
     13    this._panel = panel;
     14 
     15    this.isPicking = false;
     16 
     17    this.onPickerAccessibleHovered = this.onPickerAccessibleHovered.bind(this);
     18    this.onPickerAccessiblePicked = this.onPickerAccessiblePicked.bind(this);
     19    this.onPickerAccessiblePreviewed =
     20      this.onPickerAccessiblePreviewed.bind(this);
     21    this.onPickerAccessibleCanceled =
     22      this.onPickerAccessibleCanceled.bind(this);
     23  }
     24 
     25  get toolbox() {
     26    return this._panel._toolbox;
     27  }
     28 
     29  get accessibilityProxy() {
     30    return this._panel.accessibilityProxy;
     31  }
     32 
     33  get pickerButton() {
     34    return this.toolbox.pickerButton;
     35  }
     36 
     37  get _telemetry() {
     38    return this._panel._telemetry;
     39  }
     40 
     41  release() {
     42    this._panel = null;
     43  }
     44 
     45  emit(event, data) {
     46    this.toolbox.emit(event, data);
     47  }
     48 
     49  /**
     50   * Select accessible object in the tree.
     51   *
     52   * @param  {object} accessible
     53   *         Accessiblle object to be selected in the inspector tree.
     54   */
     55  select(accessible) {
     56    this._panel.selectAccessible(accessible);
     57  }
     58 
     59  /**
     60   * Highlight accessible object in the tree.
     61   *
     62   * @param  {object} accessible
     63   *         Accessiblle object to be selected in the inspector tree.
     64   */
     65  highlight(accessible) {
     66    this._panel.highlightAccessible(accessible);
     67  }
     68 
     69  getStr(key) {
     70    return L10N.getStr(key);
     71  }
     72 
     73  /**
     74   * Override the default presentation of the picker button in toolbox's top
     75   * level toolbar.
     76   */
     77  updateButton() {
     78    this.pickerButton.description = this.getStr("accessibility.pick");
     79    this.pickerButton.className = "accessibility";
     80    this.pickerButton.disabled = !this.accessibilityProxy.enabled;
     81    if (!this.accessibilityProxy.enabled && this.isPicking) {
     82      this.cancel();
     83    }
     84  }
     85 
     86  /**
     87   * Handle an event when a new accessible object is hovered over.
     88   *
     89   * @param  {object} accessible
     90   *         newly hovered accessible object
     91   */
     92  onPickerAccessibleHovered(accessible) {
     93    if (accessible) {
     94      this.emit("picker-accessible-hovered", accessible);
     95      this.highlight(accessible);
     96    }
     97  }
     98 
     99  /**
    100   * Handle an event when a new accessible is picked by the user.
    101   *
    102   * @param  {object} accessible
    103   *         newly picked accessible object
    104   */
    105  onPickerAccessiblePicked(accessible) {
    106    if (accessible) {
    107      this.select(accessible);
    108    }
    109    this.stop();
    110  }
    111 
    112  /**
    113   * Handle an event when a new accessible is previewed by the user.
    114   *
    115   * @param  {object} accessible
    116   *         newly previewed accessible object
    117   */
    118  onPickerAccessiblePreviewed(accessible) {
    119    if (accessible) {
    120      this.select(accessible);
    121    }
    122  }
    123 
    124  /**
    125   * Handle an event when picking is cancelled by the user.s
    126   */
    127  onPickerAccessibleCanceled() {
    128    this.cancel();
    129    this.emit("picker-accessible-canceled");
    130  }
    131 
    132  /**
    133   * Cancel picking.
    134   */
    135  async cancel() {
    136    await this.stop();
    137  }
    138 
    139  /**
    140   * Stop picking.
    141   */
    142  async stop() {
    143    if (!this.isPicking) {
    144      return;
    145    }
    146 
    147    this.isPicking = false;
    148    this.pickerButton.isChecked = false;
    149 
    150    await this.accessibilityProxy.cancelPick();
    151    this._telemetry.toolClosed("accessibility_picker", this);
    152    this.emit("picker-stopped");
    153  }
    154 
    155  /**
    156   * Start picking.
    157   *
    158   * @param  {boolean} doFocus
    159   *         If true, move keyboard focus into content.
    160   */
    161  async start(doFocus = true) {
    162    if (this.isPicking) {
    163      return;
    164    }
    165 
    166    this.isPicking = true;
    167    this.pickerButton.isChecked = true;
    168 
    169    await this.accessibilityProxy.pick(
    170      doFocus,
    171      this.onPickerAccessibleHovered,
    172      this.onPickerAccessiblePicked,
    173      this.onPickerAccessiblePreviewed,
    174      this.onPickerAccessibleCanceled
    175    );
    176 
    177    this._telemetry.toolOpened("accessibility_picker", this);
    178    this.emit("picker-started");
    179  }
    180 
    181  /**
    182   * Toggle between starting and canceling the picker.
    183   *
    184   * @param  {boolean} doFocus
    185   *         If true, move keyboard focus into content.
    186   */
    187  toggle(doFocus) {
    188    if (this.isPicking) {
    189      return this.cancel();
    190    }
    191 
    192    return this.start(doFocus);
    193  }
    194 }
    195 
    196 exports.Picker = Picker;