summaryrefslogtreecommitdiffstats
path: root/devtools/client/accessibility/picker.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/accessibility/picker.js')
-rw-r--r--devtools/client/accessibility/picker.js189
1 files changed, 189 insertions, 0 deletions
diff --git a/devtools/client/accessibility/picker.js b/devtools/client/accessibility/picker.js
new file mode 100644
index 0000000000..49ba2b5bfc
--- /dev/null
+++ b/devtools/client/accessibility/picker.js
@@ -0,0 +1,189 @@
+/* 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 {
+ L10N,
+} = require("resource://devtools/client/accessibility/utils/l10n.js");
+
+class Picker {
+ constructor(panel) {
+ this._panel = panel;
+
+ this.isPicking = false;
+
+ this.onPickerAccessibleHovered = this.onPickerAccessibleHovered.bind(this);
+ this.onPickerAccessiblePicked = this.onPickerAccessiblePicked.bind(this);
+ this.onPickerAccessiblePreviewed =
+ this.onPickerAccessiblePreviewed.bind(this);
+ this.onPickerAccessibleCanceled =
+ this.onPickerAccessibleCanceled.bind(this);
+ }
+
+ get toolbox() {
+ return this._panel._toolbox;
+ }
+
+ get accessibilityProxy() {
+ return this._panel.accessibilityProxy;
+ }
+
+ get pickerButton() {
+ return this.toolbox.pickerButton;
+ }
+
+ get _telemetry() {
+ return this._panel._telemetry;
+ }
+
+ release() {
+ this._panel = null;
+ }
+
+ emit(event, data) {
+ this.toolbox.emit(event, data);
+ }
+
+ /**
+ * Select accessible object in the tree.
+ * @param {Object} accessible
+ * Accessiblle object to be selected in the inspector tree.
+ */
+ select(accessible) {
+ this._panel.selectAccessible(accessible);
+ }
+
+ /**
+ * Highlight accessible object in the tree.
+ * @param {Object} accessible
+ * Accessiblle object to be selected in the inspector tree.
+ */
+ highlight(accessible) {
+ this._panel.highlightAccessible(accessible);
+ }
+
+ getStr(key) {
+ return L10N.getStr(key);
+ }
+
+ /**
+ * Override the default presentation of the picker button in toolbox's top
+ * level toolbar.
+ */
+ updateButton() {
+ this.pickerButton.description = this.getStr("accessibility.pick");
+ this.pickerButton.className = "accessibility";
+ this.pickerButton.disabled = !this.accessibilityProxy.enabled;
+ if (!this.accessibilityProxy.enabled && this.isPicking) {
+ this.cancel();
+ }
+ }
+
+ /**
+ * Handle an event when a new accessible object is hovered over.
+ * @param {Object} accessible
+ * newly hovered accessible object
+ */
+ onPickerAccessibleHovered(accessible) {
+ if (accessible) {
+ this.emit("picker-accessible-hovered", accessible);
+ this.highlight(accessible);
+ }
+ }
+
+ /**
+ * Handle an event when a new accessible is picked by the user.
+ * @param {Object} accessible
+ * newly picked accessible object
+ */
+ onPickerAccessiblePicked(accessible) {
+ if (accessible) {
+ this.select(accessible);
+ }
+ this.stop();
+ }
+
+ /**
+ * Handle an event when a new accessible is previewed by the user.
+ * @param {Object} accessible
+ * newly previewed accessible object
+ */
+ onPickerAccessiblePreviewed(accessible) {
+ if (accessible) {
+ this.select(accessible);
+ }
+ }
+
+ /**
+ * Handle an event when picking is cancelled by the user.s
+ */
+ onPickerAccessibleCanceled() {
+ this.cancel();
+ this.emit("picker-accessible-canceled");
+ }
+
+ /**
+ * Cancel picking.
+ */
+ async cancel() {
+ await this.stop();
+ }
+
+ /**
+ * Stop picking.
+ */
+ async stop() {
+ if (!this.isPicking) {
+ return;
+ }
+
+ this.isPicking = false;
+ this.pickerButton.isChecked = false;
+
+ await this.accessibilityProxy.cancelPick();
+ this._telemetry.toolClosed("accessibility_picker", this);
+ this.emit("picker-stopped");
+ }
+
+ /**
+ * Start picking.
+ * @param {Boolean} doFocus
+ * If true, move keyboard focus into content.
+ */
+ async start(doFocus = true) {
+ if (this.isPicking) {
+ return;
+ }
+
+ this.isPicking = true;
+ this.pickerButton.isChecked = true;
+
+ await this.accessibilityProxy.pick(
+ doFocus,
+ this.onPickerAccessibleHovered,
+ this.onPickerAccessiblePicked,
+ this.onPickerAccessiblePreviewed,
+ this.onPickerAccessibleCanceled
+ );
+
+ this._telemetry.toolOpened("accessibility_picker", this);
+ this.emit("picker-started");
+ }
+
+ /**
+ * Toggle between starting and canceling the picker.
+ * @param {Boolean} doFocus
+ * If true, move keyboard focus into content.
+ */
+ toggle(doFocus) {
+ if (this.isPicking) {
+ return this.cancel();
+ }
+
+ return this.start(doFocus);
+ }
+}
+
+exports.Picker = Picker;