diff options
Diffstat (limited to 'ext/js/display')
| -rw-r--r-- | ext/js/display/display-anki.js | 18 | ||||
| -rw-r--r-- | ext/js/display/display-audio.js | 18 | ||||
| -rw-r--r-- | ext/js/display/display-notification.js | 5 | ||||
| -rw-r--r-- | ext/js/display/display-profile-selection.js | 15 | ||||
| -rw-r--r-- | ext/js/display/display.js | 40 | ||||
| -rw-r--r-- | ext/js/display/query-parser.js | 7 | ||||
| -rw-r--r-- | ext/js/display/search-display-controller.js | 13 | 
7 files changed, 71 insertions, 45 deletions
| diff --git a/ext/js/display/display-anki.js b/ext/js/display/display-anki.js index 574e90ee..81791285 100644 --- a/ext/js/display/display-anki.js +++ b/ext/js/display/display-anki.js @@ -20,6 +20,7 @@ import {EventListenerCollection, deferPromise} from '../core.js';  import {AnkiNoteBuilder} from '../data/anki-note-builder.js';  import {AnkiUtil} from '../data/anki-util.js';  import {PopupMenu} from '../dom/popup-menu.js'; +import {querySelectorNotNull} from '../dom/query-selector.js';  import {yomitan} from '../yomitan.js';  export class DisplayAnki { @@ -91,7 +92,7 @@ export class DisplayAnki {              ['term', ['term-kanji', 'term-kana']]          ]);          /** @type {HTMLElement} */ -        this._menuContainer = /** @type {HTMLElement} */ (document.querySelector('#popup-menus')); +        this._menuContainer = querySelectorNotNull(document, '#popup-menus');          /** @type {(event: MouseEvent) => void} */          this._onShowTagsBind = this._onShowTags.bind(this);          /** @type {(event: MouseEvent) => void} */ @@ -827,7 +828,8 @@ export class DisplayAnki {          button.hidden = disabled;          button.dataset.noteIds = allNoteIds.join(' '); -        const badge = /** @type {?HTMLElement} */ (button.querySelector('.action-button-badge')); +        /** @type {?HTMLElement} */ +        const badge = button.querySelector('.action-button-badge');          if (badge !== null) {              const badgeData = badge.dataset;              if (allNoteIds.length > 1) { @@ -866,13 +868,17 @@ export class DisplayAnki {          const noteIds = this._getNodeNoteIds(node);          if (noteIds.length === 0) { return; } -        const menuContainerNode = /** @type {HTMLElement} */ (this._display.displayGenerator.instantiateTemplate('view-note-button-popup-menu')); -        const menuBodyNode = /** @type {HTMLElement} */ (menuContainerNode.querySelector('.popup-menu-body')); +        /** @type {HTMLElement} */ +        const menuContainerNode = this._display.displayGenerator.instantiateTemplate('view-note-button-popup-menu'); +        /** @type {HTMLElement} */ +        const menuBodyNode = querySelectorNotNull(menuContainerNode, '.popup-menu-body');          for (let i = 0, ii = noteIds.length; i < ii; ++i) {              const noteId = noteIds[i]; -            const item = /** @type {HTMLElement} */ (this._display.displayGenerator.instantiateTemplate('view-note-button-popup-menu-item')); -            const label = /** @type {Element} */ (item.querySelector('.popup-menu-item-label')); +            /** @type {HTMLElement} */ +            const item = this._display.displayGenerator.instantiateTemplate('view-note-button-popup-menu-item'); +            /** @type {Element} */ +            const label = querySelectorNotNull(item, '.popup-menu-item-label');              label.textContent = `Note ${i + 1}: ${noteId}`;              item.dataset.menuAction = 'viewNote';              item.dataset.noteIds = `${noteId}`; diff --git a/ext/js/display/display-audio.js b/ext/js/display/display-audio.js index 3576decb..1f279030 100644 --- a/ext/js/display/display-audio.js +++ b/ext/js/display/display-audio.js @@ -18,6 +18,7 @@  import {EventListenerCollection} from '../core.js';  import {PopupMenu} from '../dom/popup-menu.js'; +import {querySelectorNotNull} from '../dom/query-selector.js';  import {AudioSystem} from '../media/audio-system.js';  import {yomitan} from '../yomitan.js'; @@ -45,7 +46,7 @@ export class DisplayAudio {          /** @type {Map<string, import('display-audio').CacheItem>} */          this._cache = new Map();          /** @type {Element} */ -        this._menuContainer = /** @type {Element} */ (document.querySelector('#popup-menus')); +        this._menuContainer = querySelectorNotNull(document, '#popup-menus');          /** @type {import('core').TokenObject} */          this._entriesToken = {};          /** @type {Set<PopupMenu>} */ @@ -715,7 +716,8 @@ export class DisplayAudio {              button.dataset.potentialAvailableAudioCount = `${potentialAvailableAudioCount}`;          } -        const badge = /** @type {?HTMLElement} */ (button.querySelector('.action-button-badge')); +        /** @type {?HTMLElement} */ +        const badge = button.querySelector('.action-button-badge');          if (badge === null) { return; }          const badgeData = badge.dataset; @@ -804,7 +806,8 @@ export class DisplayAudio {      _createMenu(sourceButton, term, reading) {          // Create menu          const menuContainerNode = /** @type {HTMLElement} */ (this._display.displayGenerator.instantiateTemplate('audio-button-popup-menu')); -        const menuBodyNode = /** @type {HTMLElement} */ (menuContainerNode.querySelector('.popup-menu-body')); +        /** @type {HTMLElement} */ +        const menuBodyNode = querySelectorNotNull(menuContainerNode, '.popup-menu-body');          menuContainerNode.dataset.term = term;          menuContainerNode.dataset.reading = reading; @@ -837,7 +840,8 @@ export class DisplayAudio {                  const existingNode = this._getOrCreateMenuItem(currentItems, index, subIndex);                  const node = existingNode !== null ? existingNode : /** @type {HTMLElement} */ (displayGenerator.instantiateTemplate('audio-button-popup-menu-item')); -                const labelNode = /** @type {HTMLElement} */ (node.querySelector('.popup-menu-item-audio-button .popup-menu-item-label')); +                /** @type {HTMLElement} */ +                const labelNode = querySelectorNotNull(node, '.popup-menu-item-audio-button .popup-menu-item-label');                  let label = name;                  if (!nameUnique) {                      label = `${label} ${nameIndex + 1}`; @@ -847,11 +851,13 @@ export class DisplayAudio {                  if (typeof subName === 'string' && subName.length > 0) { label += `: ${subName}`; }                  labelNode.textContent = label; -                const cardButton = /** @type {HTMLElement} */ (node.querySelector('.popup-menu-item-set-primary-audio-button')); +                /** @type {HTMLElement} */ +                const cardButton = querySelectorNotNull(node, '.popup-menu-item-set-primary-audio-button');                  cardButton.hidden = !downloadable;                  if (valid !== null) { -                    const icon = /** @type {HTMLElement} */ (node.querySelector('.popup-menu-item-audio-button .popup-menu-item-icon')); +                    /** @type {HTMLElement} */ +                    const icon = querySelectorNotNull(node, '.popup-menu-item-audio-button .popup-menu-item-icon');                      icon.dataset.icon = valid ? 'checkmark' : 'cross';                      showIcons = true;                  } diff --git a/ext/js/display/display-notification.js b/ext/js/display/display-notification.js index d1cfa537..a0e9e35c 100644 --- a/ext/js/display/display-notification.js +++ b/ext/js/display/display-notification.js @@ -17,6 +17,7 @@   */  import {EventListenerCollection} from '../core.js'; +import {querySelectorNotNull} from '../dom/query-selector.js';  export class DisplayNotification {      /** @@ -29,9 +30,9 @@ export class DisplayNotification {          /** @type {HTMLElement} */          this._node = node;          /** @type {HTMLElement} */ -        this._body = /** @type {HTMLElement} */ (node.querySelector('.footer-notification-body')); +        this._body = querySelectorNotNull(node, '.footer-notification-body');          /** @type {HTMLElement} */ -        this._closeButton = /** @type {HTMLElement} */ (node.querySelector('.footer-notification-close-button')); +        this._closeButton = querySelectorNotNull(node, '.footer-notification-close-button');          /** @type {EventListenerCollection} */          this._eventListeners = new EventListenerCollection();          /** @type {?import('core').Timeout} */ diff --git a/ext/js/display/display-profile-selection.js b/ext/js/display/display-profile-selection.js index c5cb7d06..f2ebd3e4 100644 --- a/ext/js/display/display-profile-selection.js +++ b/ext/js/display/display-profile-selection.js @@ -18,6 +18,7 @@  import {EventListenerCollection, generateId} from '../core.js';  import {PanelElement} from '../dom/panel-element.js'; +import {querySelectorNotNull} from '../dom/query-selector.js';  import {yomitan} from '../yomitan.js';  export class DisplayProfileSelection { @@ -28,12 +29,14 @@ export class DisplayProfileSelection {          /** @type {import('./display.js').Display} */          this._display = display;          /** @type {HTMLElement} */ -        this._profielList = /** @type {HTMLElement} */ (document.querySelector('#profile-list')); +        this._profielList = querySelectorNotNull(document, '#profile-list');          /** @type {HTMLButtonElement} */ -        this._profileButton = /** @type {HTMLButtonElement} */ (document.querySelector('#profile-button')); +        this._profileButton = querySelectorNotNull(document, '#profile-button'); +        /** @type {HTMLElement} */ +        const profilePanelElement = querySelectorNotNull(document, '#profile-panel');          /** @type {PanelElement} */          this._profilePanel = new PanelElement({ -            node: /** @type {HTMLElement} */ (document.querySelector('#profile-panel')), +            node: profilePanelElement,              closingAnimationDuration: 375 // Milliseconds; includes buffer          });          /** @type {boolean} */ @@ -98,9 +101,11 @@ export class DisplayProfileSelection {          for (let i = 0, ii = profiles.length; i < ii; ++i) {              const {name} = profiles[i];              const entry = displayGenerator.createProfileListItem(); -            const radio = /** @type {HTMLInputElement} */ (entry.querySelector('.profile-entry-is-default-radio')); +            /** @type {HTMLInputElement} */ +            const radio = querySelectorNotNull(entry, '.profile-entry-is-default-radio');              radio.checked = (i === profileCurrent); -            const nameNode = /** @type {Element} */ (entry.querySelector('.profile-list-item-name')); +            /** @type {Element} */ +            const nameNode = querySelectorNotNull(entry, '.profile-list-item-name');              nameNode.textContent = name;              fragment.appendChild(entry);              this._eventListeners.addEventListener(radio, 'change', this._onProfileRadioChange.bind(this, i), false); diff --git a/ext/js/display/display.js b/ext/js/display/display.js index 9c2d97f2..b6a818ba 100644 --- a/ext/js/display/display.js +++ b/ext/js/display/display.js @@ -22,6 +22,7 @@ import {ThemeController} from '../app/theme-controller.js';  import {FrameEndpoint} from '../comm/frame-endpoint.js';  import {DynamicProperty, EventDispatcher, EventListenerCollection, clone, deepEqual, invokeMessageHandler, log, promiseTimeout} from '../core.js';  import {PopupMenu} from '../dom/popup-menu.js'; +import {querySelectorNotNull} from '../dom/query-selector.js';  import {ScrollElement} from '../dom/scroll-element.js';  import {HotkeyHelpController} from '../input/hotkey-help-controller.js';  import {TextScanner} from '../language/text-scanner.js'; @@ -62,7 +63,7 @@ export class Display extends EventDispatcher {          /** @type {import('../input/hotkey-handler.js').HotkeyHandler} */          this._hotkeyHandler = hotkeyHandler;          /** @type {HTMLElement} */ -        this._container = /** @type {HTMLElement} */ (document.querySelector('#dictionary-entries')); +        this._container = querySelectorNotNull(document, '#dictionary-entries');          /** @type {import('dictionary').DictionaryEntry[]} */          this._dictionaryEntries = [];          /** @type {HTMLElement[]} */ @@ -116,7 +117,7 @@ export class Display extends EventDispatcher {          /** @type {number} */          this._queryOffset = 0;          /** @type {HTMLElement} */ -        this._progressIndicator = /** @type {HTMLElement} */ (document.querySelector('#progress-indicator')); +        this._progressIndicator = querySelectorNotNull(document, '#progress-indicator');          /** @type {?import('core').Timeout} */          this._progressIndicatorTimer = null;          /** @type {DynamicProperty<boolean>} */ @@ -126,24 +127,24 @@ export class Display extends EventDispatcher {          /** @type {?boolean} */          this._queryParserVisibleOverride = null;          /** @type {HTMLElement} */ -        this._queryParserContainer = /** @type {HTMLElement} */ (document.querySelector('#query-parser-container')); +        this._queryParserContainer = querySelectorNotNull(document, '#query-parser-container');          /** @type {QueryParser} */          this._queryParser = new QueryParser({              getSearchContext: this._getSearchContext.bind(this),              japaneseUtil          });          /** @type {HTMLElement} */ -        this._contentScrollElement = /** @type {HTMLElement} */ (document.querySelector('#content-scroll')); +        this._contentScrollElement = querySelectorNotNull(document, '#content-scroll');          /** @type {HTMLElement} */ -        this._contentScrollBodyElement = /** @type {HTMLElement} */ (document.querySelector('#content-body')); +        this._contentScrollBodyElement = querySelectorNotNull(document, '#content-body');          /** @type {ScrollElement} */          this._windowScroll = new ScrollElement(this._contentScrollElement); -        /** @type {HTMLButtonElement} */ -        this._closeButton = /** @type {HTMLButtonElement} */ (document.querySelector('#close-button')); -        /** @type {HTMLButtonElement} */ -        this._navigationPreviousButton = /** @type {HTMLButtonElement} */ (document.querySelector('#navigate-previous-button')); -        /** @type {HTMLButtonElement} */ -        this._navigationNextButton = /** @type {HTMLButtonElement} */ (document.querySelector('#navigate-next-button')); +        /** @type {?HTMLButtonElement} */ +        this._closeButton = document.querySelector('#close-button'); +        /** @type {?HTMLButtonElement} */ +        this._navigationPreviousButton = document.querySelector('#navigate-previous-button'); +        /** @type {?HTMLButtonElement} */ +        this._navigationNextButton = document.querySelector('#navigate-next-button');          /** @type {?Frontend} */          this._frontend = null;          /** @type {?Promise<void>} */ @@ -171,7 +172,7 @@ export class Display extends EventDispatcher {          /** @type {?import('./display-notification.js').DisplayNotification} */          this._tagNotification = null;          /** @type {HTMLElement} */ -        this._footerNotificationContainer = /** @type {HTMLElement} */ (document.querySelector('#content-footer')); +        this._footerNotificationContainer = querySelectorNotNull(document, '#content-footer');          /** @type {OptionToggleHotkeyHandler} */          this._optionToggleHotkeyHandler = new OptionToggleHotkeyHandler(this);          /** @type {ElementOverflowController} */ @@ -179,7 +180,7 @@ export class Display extends EventDispatcher {          /** @type {boolean} */          this._frameVisible = (pageType === 'search');          /** @type {HTMLElement} */ -        this._menuContainer = /** @type {HTMLElement} */ (document.querySelector('#popup-menus')); +        this._menuContainer = querySelectorNotNull(document, '#popup-menus');          /** @type {(event: MouseEvent) => void} */          this._onEntryClickBind = this._onEntryClick.bind(this);          /** @type {(event: MouseEvent) => void} */ @@ -1041,7 +1042,8 @@ export class Display extends EventDispatcher {          const node = /** @type {HTMLElement} */ (e.currentTarget);          const menuContainerNode = /** @type {HTMLElement} */ (this._displayGenerator.instantiateTemplate('dictionary-entry-popup-menu')); -        const menuBodyNode = /** @type {HTMLElement} */ (menuContainerNode.querySelector('.popup-menu-body')); +        /** @type {HTMLElement} */ +        const menuBodyNode = querySelectorNotNull(menuContainerNode, '.popup-menu-body');          /**           * @param {string} menuAction @@ -1049,7 +1051,9 @@ export class Display extends EventDispatcher {           */          const addItem = (menuAction, label) => {              const item = /** @type {HTMLElement} */ (this._displayGenerator.instantiateTemplate('dictionary-entry-popup-menu-item')); -            /** @type {HTMLElement} */ (item.querySelector('.popup-menu-item-label')).textContent = label; +            /** @type {HTMLElement} */ +            const labelElement = querySelectorNotNull(item, '.popup-menu-item-label'); +            labelElement.textContent = label;              item.dataset.menuAction = menuAction;              menuBodyNode.appendChild(item);          }; @@ -1291,7 +1295,8 @@ export class Display extends EventDispatcher {      /** */      _setContentExtensionUnloaded() { -        const errorExtensionUnloaded = /** @type {?HTMLElement} */ (document.querySelector('#error-extension-unloaded')); +        /** @type {?HTMLElement} */ +        const errorExtensionUnloaded = document.querySelector('#error-extension-unloaded');          if (this._container !== null) {              this._container.hidden = true; @@ -1323,7 +1328,8 @@ export class Display extends EventDispatcher {       * @param {boolean} visible       */      _setNoContentVisible(visible) { -        const noResults = /** @type {?HTMLElement} */ (document.querySelector('#no-results')); +        /** @type {?HTMLElement} */ +        const noResults = document.querySelector('#no-results');          if (noResults !== null) {              noResults.hidden = !visible; diff --git a/ext/js/display/query-parser.js b/ext/js/display/query-parser.js index 03b54fd5..e71c7251 100644 --- a/ext/js/display/query-parser.js +++ b/ext/js/display/query-parser.js @@ -17,6 +17,7 @@   */  import {EventDispatcher, log} from '../core.js'; +import {querySelectorNotNull} from '../dom/query-selector.js';  import {TextScanner} from '../language/text-scanner.js';  import {yomitan} from '../yomitan.js'; @@ -50,11 +51,11 @@ export class QueryParser extends EventDispatcher {          /** @type {import('api').ParseTextResult} */          this._parseResults = [];          /** @type {HTMLElement} */ -        this._queryParser = /** @type {HTMLElement} */ (document.querySelector('#query-parser-content')); +        this._queryParser = querySelectorNotNull(document, '#query-parser-content');          /** @type {HTMLElement} */ -        this._queryParserModeContainer = /** @type {HTMLElement} */ (document.querySelector('#query-parser-mode-container')); +        this._queryParserModeContainer = querySelectorNotNull(document, '#query-parser-mode-container');          /** @type {HTMLSelectElement} */ -        this._queryParserModeSelect = /** @type {HTMLSelectElement} */ (document.querySelector('#query-parser-mode-select')); +        this._queryParserModeSelect = querySelectorNotNull(document, '#query-parser-mode-select');          /** @type {TextScanner} */          this._textScanner = new TextScanner({              node: this._queryParser, diff --git a/ext/js/display/search-display-controller.js b/ext/js/display/search-display-controller.js index 2778c4cd..b512a16d 100644 --- a/ext/js/display/search-display-controller.js +++ b/ext/js/display/search-display-controller.js @@ -19,6 +19,7 @@  import * as wanakana from '../../lib/wanakana.js';  import {ClipboardMonitor} from '../comm/clipboard-monitor.js';  import {EventListenerCollection, invokeMessageHandler} from '../core.js'; +import {querySelectorNotNull} from '../dom/query-selector.js';  import {yomitan} from '../yomitan.js';  export class SearchDisplayController { @@ -42,17 +43,17 @@ export class SearchDisplayController {          /** @type {import('./search-persistent-state-controller.js').SearchPersistentStateController} */          this._searchPersistentStateController = searchPersistentStateController;          /** @type {HTMLButtonElement} */ -        this._searchButton = /** @type {HTMLButtonElement} */ (document.querySelector('#search-button')); +        this._searchButton = querySelectorNotNull(document, '#search-button');          /** @type {HTMLButtonElement} */ -        this._searchBackButton = /** @type {HTMLButtonElement} */ (document.querySelector('#search-back-button')); +        this._searchBackButton = querySelectorNotNull(document, '#search-back-button');          /** @type {HTMLTextAreaElement} */ -        this._queryInput = /** @type {HTMLTextAreaElement} */ (document.querySelector('#search-textbox')); +        this._queryInput = querySelectorNotNull(document, '#search-textbox');          /** @type {HTMLElement} */ -        this._introElement = /** @type {HTMLElement} */ (document.querySelector('#intro')); +        this._introElement = querySelectorNotNull(document, '#intro');          /** @type {HTMLInputElement} */ -        this._clipboardMonitorEnableCheckbox = /** @type {HTMLInputElement} */ (document.querySelector('#clipboard-monitor-enable')); +        this._clipboardMonitorEnableCheckbox = querySelectorNotNull(document, '#clipboard-monitor-enable');          /** @type {HTMLInputElement} */ -        this._wanakanaEnableCheckbox = /** @type {HTMLInputElement} */ (document.querySelector('#wanakana-enable')); +        this._wanakanaEnableCheckbox = querySelectorNotNull(document, '#wanakana-enable');          /** @type {EventListenerCollection} */          this._queryInputEvents = new EventListenerCollection();          /** @type {boolean} */ |