--- /dev/null
+/**
+ * @file
+ * A Backbone view for the aural feedback of the toolbar.
+ */
+
+(function (Backbone, Drupal) {
+ Drupal.toolbar.ToolbarAuralView = Backbone.View.extend(/** @lends Drupal.toolbar.ToolbarAuralView# */{
+
+ /**
+ * Backbone view for the aural feedback of the toolbar.
+ *
+ * @constructs
+ *
+ * @augments Backbone.View
+ *
+ * @param {object} options
+ * Options for the view.
+ * @param {object} options.strings
+ * Various strings to use in the view.
+ */
+ initialize(options) {
+ this.strings = options.strings;
+
+ this.listenTo(this.model, 'change:orientation', this.onOrientationChange);
+ this.listenTo(this.model, 'change:activeTray', this.onActiveTrayChange);
+ },
+
+ /**
+ * Announces an orientation change.
+ *
+ * @param {Drupal.toolbar.ToolbarModel} model
+ * The toolbar model in question.
+ * @param {string} orientation
+ * The new value of the orientation attribute in the model.
+ */
+ onOrientationChange(model, orientation) {
+ Drupal.announce(Drupal.t('Tray orientation changed to @orientation.', {
+ '@orientation': orientation,
+ }));
+ },
+
+ /**
+ * Announces a changed active tray.
+ *
+ * @param {Drupal.toolbar.ToolbarModel} model
+ * The toolbar model in question.
+ * @param {HTMLElement} tray
+ * The new value of the tray attribute in the model.
+ */
+ onActiveTrayChange(model, tray) {
+ const relevantTray = (tray === null) ? model.previous('activeTray') : tray;
+ // Current activeTray and previous activeTray are empty, no state change
+ // to announce.
+ if (!relevantTray) {
+ return;
+ }
+ const action = (tray === null) ? Drupal.t('closed') : Drupal.t('opened');
+ const trayNameElement = relevantTray.querySelector('.toolbar-tray-name');
+ let text;
+ if (trayNameElement !== null) {
+ text = Drupal.t('Tray "@tray" @action.', {
+ '@tray': trayNameElement.textContent, '@action': action,
+ });
+ }
+ else {
+ text = Drupal.t('Tray @action.', { '@action': action });
+ }
+ Drupal.announce(text);
+ },
+ });
+}(Backbone, Drupal));