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;