aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dev/jsconfig.json2
-rw-r--r--ext/js/app/frontend.js11
-rw-r--r--ext/js/background/backend.js4
-rw-r--r--ext/js/background/offscreen.js4
-rw-r--r--ext/js/comm/api.js2
-rw-r--r--ext/js/comm/clipboard-monitor.js2
-rw-r--r--ext/js/comm/cross-frame-api.js21
-rw-r--r--ext/js/comm/frame-ancestry-handler.js2
-rw-r--r--ext/js/comm/frame-client.js2
-rw-r--r--ext/js/comm/mecab.js2
-rw-r--r--ext/js/core.js2
-rw-r--r--ext/js/display/display-audio.js2
-rw-r--r--ext/js/display/display-notification.js2
-rw-r--r--ext/js/display/display.js2
-rw-r--r--ext/js/display/element-overflow-controller.js8
-rw-r--r--ext/js/display/option-toggle-hotkey-handler.js2
-rw-r--r--ext/js/display/search-display-controller.js2
-rw-r--r--ext/js/dom/document-util.js2
-rw-r--r--ext/js/dom/panel-element.js2
-rw-r--r--ext/js/language/text-scanner.js6
-rw-r--r--ext/js/media/audio-downloader.js2
-rw-r--r--ext/js/pages/settings/popup-preview-frame.js2
-rw-r--r--test/jsconfig.json2
-rw-r--r--types/ext/core.d.ts2
-rw-r--r--types/ext/cross-frame-api.d.ts2
-rw-r--r--types/ext/offscreen.d.ts2
-rw-r--r--types/other/globals.d.ts (renamed from types/other/web-set-timeout.d.ts)10
27 files changed, 59 insertions, 45 deletions
diff --git a/dev/jsconfig.json b/dev/jsconfig.json
index 518f97ad..d4efe694 100644
--- a/dev/jsconfig.json
+++ b/dev/jsconfig.json
@@ -71,7 +71,7 @@
"../ext/js/language/translator.js",
"../ext/js/media/media-util.js",
"../types/dev/**/*.ts",
- "../types/other/web-set-timeout.d.ts"
+ "../types/other/globals.d.ts"
],
"exclude": [
"../node_modules"
diff --git a/ext/js/app/frontend.js b/ext/js/app/frontend.js
index 628c504e..e1f8d8c9 100644
--- a/ext/js/app/frontend.js
+++ b/ext/js/app/frontend.js
@@ -99,7 +99,7 @@ export class Frontend {
this._popupEventListeners = new EventListenerCollection();
/** @type {?import('core').TokenObject} */
this._updatePopupToken = null;
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
this._clearSelectionTimer = null;
/** @type {boolean} */
this._isPointerOverPopup = false;
@@ -840,7 +840,7 @@ export class Frontend {
*/
async _waitForFrontendReady(frameId, timeout) {
return new Promise((resolve, reject) => {
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
let timeoutId = null;
const cleanup = () => {
@@ -973,6 +973,13 @@ export class Frontend {
await yomitan.api.loadExtensionScripts([
'/js/accessibility/google-docs-util.js'
]);
+ this._prepareGoogleDocs2();
+ }
+
+ /**
+ * @returns {Promise<void>}
+ */
+ async _prepareGoogleDocs2() {
if (typeof GoogleDocsUtil === 'undefined') { return; }
DocumentUtil.registerGetRangeFromPointHandler(GoogleDocsUtil.getRangeFromPoint.bind(GoogleDocsUtil));
}
diff --git a/ext/js/background/backend.js b/ext/js/background/backend.js
index 44f5a42d..f1a47e7f 100644
--- a/ext/js/background/backend.js
+++ b/ext/js/background/backend.js
@@ -138,7 +138,7 @@ export class Backend {
/** @type {?string} */
this._defaultBrowserActionTitle = null;
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
this._badgePrepareDelayTimer = null;
/** @type {?import('log').LogLevel} */
this._logErrorLevel = null;
@@ -1981,7 +1981,7 @@ export class Backend {
*/
_waitUntilTabFrameIsReady(tabId, frameId, timeout=null) {
return new Promise((resolve, reject) => {
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
let timer = null;
/** @type {?import('extension').ChromeRuntimeOnMessageCallback} */
let onMessage = (message, sender) => {
diff --git a/ext/js/background/offscreen.js b/ext/js/background/offscreen.js
index 45345c01..8da661ad 100644
--- a/ext/js/background/offscreen.js
+++ b/ext/js/background/offscreen.js
@@ -51,7 +51,7 @@ export class Offscreen {
});
/** @type {import('offscreen').MessageHandlerMap} */
- this._messageHandlers = new Map([
+ const messageHandlers = new Map([
['clipboardGetTextOffscreen', {async: true, handler: this._getTextHandler.bind(this)}],
['clipboardGetImageOffscreen', {async: true, handler: this._getImageHandler.bind(this)}],
['clipboardSetBrowserOffscreen', {async: false, handler: this._setClipboardBrowser.bind(this)}],
@@ -65,6 +65,8 @@ export class Offscreen {
['getTermFrequenciesOffscreen', {async: true, handler: this._getTermFrequenciesHandler.bind(this)}],
['clearDatabaseCachesOffscreen', {async: false, handler: this._clearDatabaseCachesHandler.bind(this)}]
]);
+ /** @type {import('offscreen').MessageHandlerMap<string>} */
+ this._messageHandlers = messageHandlers;
const onMessage = this._onMessage.bind(this);
chrome.runtime.onMessage.addListener(onMessage);
diff --git a/ext/js/comm/api.js b/ext/js/comm/api.js
index 0cfdba59..26218595 100644
--- a/ext/js/comm/api.js
+++ b/ext/js/comm/api.js
@@ -431,7 +431,7 @@ export class API {
*/
_createActionPort(timeout) {
return new Promise((resolve, reject) => {
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
let timer = null;
const portDetails = deferPromise();
diff --git a/ext/js/comm/clipboard-monitor.js b/ext/js/comm/clipboard-monitor.js
index 06e95438..3b3a56a9 100644
--- a/ext/js/comm/clipboard-monitor.js
+++ b/ext/js/comm/clipboard-monitor.js
@@ -31,7 +31,7 @@ export class ClipboardMonitor extends EventDispatcher {
this._japaneseUtil = japaneseUtil;
/** @type {import('clipboard-monitor').ClipboardReaderLike} */
this._clipboardReader = clipboardReader;
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
this._timerId = null;
/** @type {?import('core').TokenObject} */
this._timerToken = null;
diff --git a/ext/js/comm/cross-frame-api.js b/ext/js/comm/cross-frame-api.js
index 34f3f36a..3ac38cf2 100644
--- a/ext/js/comm/cross-frame-api.js
+++ b/ext/js/comm/cross-frame-api.js
@@ -25,14 +25,14 @@ import {yomitan} from '../yomitan.js';
*/
class CrossFrameAPIPort extends EventDispatcher {
/**
- * @param {?number} otherTabId
+ * @param {number} otherTabId
* @param {number} otherFrameId
* @param {chrome.runtime.Port} port
* @param {import('core').MessageHandlerMap} messageHandlers
*/
constructor(otherTabId, otherFrameId, port, messageHandlers) {
super();
- /** @type {?number} */
+ /** @type {number} */
this._otherTabId = otherTabId;
/** @type {number} */
this._otherFrameId = otherFrameId;
@@ -48,7 +48,7 @@ class CrossFrameAPIPort extends EventDispatcher {
this._eventListeners = new EventListenerCollection();
}
- /** @type {?number} */
+ /** @type {number} */
get otherTabId() {
return this._otherTabId;
}
@@ -299,7 +299,7 @@ export class CrossFrameAPI {
this._ackTimeout = 3000; // 3 seconds
/** @type {number} */
this._responseTimeout = 10000; // 10 seconds
- /** @type {Map<?number, Map<number, CrossFrameAPIPort>>} */
+ /** @type {Map<number, Map<number, CrossFrameAPIPort>>} */
this._commPorts = new Map();
/** @type {import('core').MessageHandlerMap} */
this._messageHandlers = new Map();
@@ -339,7 +339,12 @@ export class CrossFrameAPI {
* @returns {Promise<TReturn>}
*/
async invokeTab(targetTabId, targetFrameId, action, params) {
- if (typeof targetTabId !== 'number') { targetTabId = this._tabId; }
+ if (typeof targetTabId !== 'number') {
+ targetTabId = this._tabId;
+ if (typeof targetTabId !== 'number') {
+ throw new Error('Unknown target tab id for invocation');
+ }
+ }
const commPort = await this._getOrCreateCommPort(targetTabId, targetFrameId);
return await commPort.invoke(action, params, this._ackTimeout, this._responseTimeout);
}
@@ -405,7 +410,7 @@ export class CrossFrameAPI {
}
/**
- * @param {?number} otherTabId
+ * @param {number} otherTabId
* @param {number} otherFrameId
* @returns {Promise<CrossFrameAPIPort>}
*/
@@ -420,7 +425,7 @@ export class CrossFrameAPI {
return await this._createCommPort(otherTabId, otherFrameId);
}
/**
- * @param {?number} otherTabId
+ * @param {number} otherTabId
* @param {number} otherFrameId
* @returns {Promise<CrossFrameAPIPort>}
*/
@@ -438,7 +443,7 @@ export class CrossFrameAPI {
}
/**
- * @param {?number} otherTabId
+ * @param {number} otherTabId
* @param {number} otherFrameId
* @param {chrome.runtime.Port} port
* @returns {CrossFrameAPIPort}
diff --git a/ext/js/comm/frame-ancestry-handler.js b/ext/js/comm/frame-ancestry-handler.js
index 49c96c22..687ec368 100644
--- a/ext/js/comm/frame-ancestry-handler.js
+++ b/ext/js/comm/frame-ancestry-handler.js
@@ -122,7 +122,7 @@ export class FrameAncestryHandler {
const responseMessageId = `${this._responseMessageIdBase}${uniqueId}`;
/** @type {number[]} */
const results = [];
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
let timer = null;
const cleanup = () => {
diff --git a/ext/js/comm/frame-client.js b/ext/js/comm/frame-client.js
index 1519cf7f..8aa8c6d6 100644
--- a/ext/js/comm/frame-client.js
+++ b/ext/js/comm/frame-client.js
@@ -83,7 +83,7 @@ export class FrameClient {
_connectInternal(frame, targetOrigin, hostFrameId, setupFrame, timeout) {
return new Promise((resolve, reject) => {
const tokenMap = new Map();
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
let timer = null;
const deferPromiseDetails = /** @type {import('core').DeferredPromiseDetails<void>} */ (deferPromise());
const frameLoadedPromise = deferPromiseDetails.promise;
diff --git a/ext/js/comm/mecab.js b/ext/js/comm/mecab.js
index 072b42f3..0a87463b 100644
--- a/ext/js/comm/mecab.js
+++ b/ext/js/comm/mecab.js
@@ -31,7 +31,7 @@ export class Mecab {
this._port = null;
/** @type {number} */
this._sequence = 0;
- /** @type {Map<number, {resolve: (value: unknown) => void, reject: (reason?: unknown) => void, timer: number}>} */
+ /** @type {Map<number, {resolve: (value: unknown) => void, reject: (reason?: unknown) => void, timer: import('core').Timeout}>} */
this._invocations = new Map();
/** @type {EventListenerCollection} */
this._eventListeners = new EventListenerCollection();
diff --git a/ext/js/core.js b/ext/js/core.js
index cdac2020..a53d5572 100644
--- a/ext/js/core.js
+++ b/ext/js/core.js
@@ -307,7 +307,7 @@ export function promiseAnimationFrame(timeout) {
return;
}
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
let timer = null;
/** @type {?number} */
let frameRequest = null;
diff --git a/ext/js/display/display-audio.js b/ext/js/display/display-audio.js
index 3fbfc3c8..3576decb 100644
--- a/ext/js/display/display-audio.js
+++ b/ext/js/display/display-audio.js
@@ -36,7 +36,7 @@ export class DisplayAudio {
this._playbackVolume = 1.0;
/** @type {boolean} */
this._autoPlay = false;
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
this._autoPlayAudioTimer = null;
/** @type {number} */
this._autoPlayAudioDelay = 400;
diff --git a/ext/js/display/display-notification.js b/ext/js/display/display-notification.js
index b3f20700..d1cfa537 100644
--- a/ext/js/display/display-notification.js
+++ b/ext/js/display/display-notification.js
@@ -34,7 +34,7 @@ export class DisplayNotification {
this._closeButton = /** @type {HTMLElement} */ (node.querySelector('.footer-notification-close-button'));
/** @type {EventListenerCollection} */
this._eventListeners = new EventListenerCollection();
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
this._closeTimer = null;
}
diff --git a/ext/js/display/display.js b/ext/js/display/display.js
index f14291d1..6e1450c3 100644
--- a/ext/js/display/display.js
+++ b/ext/js/display/display.js
@@ -117,7 +117,7 @@ export class Display extends EventDispatcher {
this._queryOffset = 0;
/** @type {HTMLElement} */
this._progressIndicator = /** @type {HTMLElement} */ (document.querySelector('#progress-indicator'));
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
this._progressIndicatorTimer = null;
/** @type {DynamicProperty<boolean>} */
this._progressIndicatorVisible = new DynamicProperty(false);
diff --git a/ext/js/display/element-overflow-controller.js b/ext/js/display/element-overflow-controller.js
index 1d2c808f..35277fa5 100644
--- a/ext/js/display/element-overflow-controller.js
+++ b/ext/js/display/element-overflow-controller.js
@@ -22,7 +22,7 @@ export class ElementOverflowController {
constructor() {
/** @type {Element[]} */
this._elements = [];
- /** @type {?number} */
+ /** @type {?(number|import('core').Timeout)} */
this._checkTimer = null;
/** @type {EventListenerCollection} */
this._eventListeners = new EventListenerCollection();
@@ -154,7 +154,7 @@ export class ElementOverflowController {
/**
* @param {() => void} callback
* @param {number} timeout
- * @returns {number}
+ * @returns {number|import('core').Timeout}
*/
_requestIdleCallback(callback, timeout) {
if (typeof requestIdleCallback === 'function') {
@@ -165,11 +165,11 @@ export class ElementOverflowController {
}
/**
- * @param {number} handle
+ * @param {number|import('core').Timeout} handle
*/
_cancelIdleCallback(handle) {
if (typeof cancelIdleCallback === 'function') {
- cancelIdleCallback(handle);
+ cancelIdleCallback(/** @type {number} */ (handle));
} else {
clearTimeout(handle);
}
diff --git a/ext/js/display/option-toggle-hotkey-handler.js b/ext/js/display/option-toggle-hotkey-handler.js
index 531e208d..edd7de5b 100644
--- a/ext/js/display/option-toggle-hotkey-handler.js
+++ b/ext/js/display/option-toggle-hotkey-handler.js
@@ -29,7 +29,7 @@ export class OptionToggleHotkeyHandler {
this._display = display;
/** @type {?import('./display-notification.js').DisplayNotification} */
this._notification = null;
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
this._notificationHideTimer = null;
/** @type {number} */
this._notificationHideTimeout = 5000;
diff --git a/ext/js/display/search-display-controller.js b/ext/js/display/search-display-controller.js
index b93757c2..98a4666b 100644
--- a/ext/js/display/search-display-controller.js
+++ b/ext/js/display/search-display-controller.js
@@ -63,7 +63,7 @@ export class SearchDisplayController {
this._wanakanaBound = false;
/** @type {boolean} */
this._introVisible = true;
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
this._introAnimationTimer = null;
/** @type {boolean} */
this._clipboardMonitorEnabled = false;
diff --git a/ext/js/dom/document-util.js b/ext/js/dom/document-util.js
index cf58d39f..549a8195 100644
--- a/ext/js/dom/document-util.js
+++ b/ext/js/dom/document-util.js
@@ -360,7 +360,7 @@ export class DocumentUtil {
/**
* Adds a fullscreen change event listener. This function handles all of the browser-specific variants.
* @param {EventListener} onFullscreenChanged The event callback.
- * @param {?EventListenerCollection} eventListenerCollection An optional `EventListenerCollection` to add the registration to.
+ * @param {?import('../core.js').EventListenerCollection} eventListenerCollection An optional `EventListenerCollection` to add the registration to.
*/
static addFullscreenChangeEventListener(onFullscreenChanged, eventListenerCollection=null) {
const target = document;
diff --git a/ext/js/dom/panel-element.js b/ext/js/dom/panel-element.js
index 314eb2fd..748c3a36 100644
--- a/ext/js/dom/panel-element.js
+++ b/ext/js/dom/panel-element.js
@@ -37,7 +37,7 @@ export class PanelElement extends EventDispatcher {
this._mutationObserver = null;
/** @type {boolean} */
this._visible = false;
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
this._closeTimer = null;
}
diff --git a/ext/js/language/text-scanner.js b/ext/js/language/text-scanner.js
index f6bcde8d..d1b033e6 100644
--- a/ext/js/language/text-scanner.js
+++ b/ext/js/language/text-scanner.js
@@ -120,7 +120,7 @@ export class TextScanner extends EventDispatcher {
/** @type {boolean} */
this._preventNextClickScan = false;
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
this._preventNextClickScanTimer = null;
/** @type {number} */
this._preventNextClickScanTimerDuration = 50;
@@ -145,7 +145,7 @@ export class TextScanner extends EventDispatcher {
/** @type {boolean} */
this._canClearSelection = true;
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
this._textSelectionTimer = null;
/** @type {boolean} */
this._yomitanIsChangingTextSelectionNow = false;
@@ -995,7 +995,7 @@ export class TextScanner extends EventDispatcher {
async _scanTimerWait() {
const delay = this._delay;
const promise = /** @type {Promise<boolean>} */ (new Promise((resolve) => {
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
let timeout = setTimeout(() => {
timeout = null;
resolve(true);
diff --git a/ext/js/media/audio-downloader.js b/ext/js/media/audio-downloader.js
index 0847d479..e041cc67 100644
--- a/ext/js/media/audio-downloader.js
+++ b/ext/js/media/audio-downloader.js
@@ -316,7 +316,7 @@ export class AudioDownloader {
let signal;
/** @type {?import('request-builder.js').ProgressCallback} */
let onProgress = null;
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
let idleTimer = null;
if (typeof idleTimeout === 'number') {
const abortController = new AbortController();
diff --git a/ext/js/pages/settings/popup-preview-frame.js b/ext/js/pages/settings/popup-preview-frame.js
index bb00829f..dab21f4d 100644
--- a/ext/js/pages/settings/popup-preview-frame.js
+++ b/ext/js/pages/settings/popup-preview-frame.js
@@ -43,7 +43,7 @@ export class PopupPreviewFrame {
this._apiOptionsGetOld = null;
/** @type {boolean} */
this._popupShown = false;
- /** @type {?number} */
+ /** @type {?import('core').Timeout} */
this._themeChangeTimeout = null;
/** @type {?import('text-source').TextSource} */
this._textSource = null;
diff --git a/test/jsconfig.json b/test/jsconfig.json
index 261ec345..934aab81 100644
--- a/test/jsconfig.json
+++ b/test/jsconfig.json
@@ -31,7 +31,7 @@
"../ext/**/*.js",
"../types/ext/**/*.ts",
"../types/dev/**/*.ts",
- "../types/other/web-set-timeout.d.ts"
+ "../types/other/globals.d.ts"
],
"exclude": [
"../node_modules",
diff --git a/types/ext/core.d.ts b/types/ext/core.d.ts
index ce3a09f0..b83e6a74 100644
--- a/types/ext/core.d.ts
+++ b/types/ext/core.d.ts
@@ -100,3 +100,5 @@ export type MessageHandlerDetails = {
export type MessageHandlerMap = Map<string, MessageHandlerDetails>;
export type MessageHandlerArray = [key: string, handlerDetails: MessageHandlerDetails][];
+
+export type Timeout = number | NodeJS.Timeout;
diff --git a/types/ext/cross-frame-api.d.ts b/types/ext/cross-frame-api.d.ts
index 5cedbec9..88ce59a7 100644
--- a/types/ext/cross-frame-api.d.ts
+++ b/types/ext/cross-frame-api.d.ts
@@ -50,5 +50,5 @@ export type Invocation = {
responseTimeout: number;
action: string;
ack: boolean;
- timer: number | null;
+ timer: Core.Timeout | null;
};
diff --git a/types/ext/offscreen.d.ts b/types/ext/offscreen.d.ts
index 7dd64d1e..ddf7eadc 100644
--- a/types/ext/offscreen.d.ts
+++ b/types/ext/offscreen.d.ts
@@ -112,4 +112,4 @@ export type MessageHandler<
details: MessageDetailsMap[TMessage],
) => (TIsAsync extends true ? Promise<MessageReturn<TMessage>> : MessageReturn<TMessage>);
-export type MessageHandlerMap = Map<MessageType, Core.MessageHandlerDetails>;
+export type MessageHandlerMap<T = MessageType> = Map<T, Core.MessageHandlerDetails>;
diff --git a/types/other/web-set-timeout.d.ts b/types/other/globals.d.ts
index 98e40dab..330f16c2 100644
--- a/types/other/web-set-timeout.d.ts
+++ b/types/other/globals.d.ts
@@ -15,10 +15,8 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-declare module 'web-set-timeout' {
- global {
- // These types are used to ensure that setTimeout returns a number
- function setTimeout<TArgs extends unknown[]>(callback: (...args: TArgs) => void, ms?: number, ...args: TArgs): number;
- function setTimeout(callback: (args: void) => void, ms?: number): number;
- }
+declare global {
+ function clearTimeout(timeoutId: NodeJS.Timeout | string | number | undefined): void;
}
+
+export {};