From 6dd6af05e1ed3e0da4091af073c38e1d8ec0268d Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Sun, 24 May 2020 14:01:21 -0400 Subject: [PATCH] Update background global object usage (#556) * Omit global window object for scripts used on the background page * Validate document exists before using * Remove dom.js from background.html --- ext/bg/background.html | 1 - ext/bg/js/anki-note-builder.js | 2 +- ext/bg/js/backend.js | 22 +++++++++++----------- ext/bg/js/background-main.js | 7 +++++-- ext/bg/js/database.js | 2 +- ext/mixed/js/core.js | 20 +++++++++++--------- 6 files changed, 29 insertions(+), 25 deletions(-) diff --git a/ext/bg/background.html b/ext/bg/background.html index ca35a3c6..53e8b140 100644 --- a/ext/bg/background.html +++ b/ext/bg/background.html @@ -20,7 +20,6 @@ - diff --git a/ext/bg/js/anki-note-builder.js b/ext/bg/js/anki-note-builder.js index 76199db7..31e67394 100644 --- a/ext/bg/js/anki-note-builder.js +++ b/ext/bg/js/anki-note-builder.js @@ -155,7 +155,7 @@ class AnkiNoteBuilder { } static arrayBufferToBase64(arrayBuffer) { - return window.btoa(String.fromCharCode(...new Uint8Array(arrayBuffer))); + return btoa(String.fromCharCode(...new Uint8Array(arrayBuffer))); } static stringReplaceAsync(str, regex, replacer) { diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index 90895737..80b00d5f 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -65,12 +65,14 @@ class Backend { renderTemplate: this._renderTemplate.bind(this) }); - this.optionsContext = { - depth: 0, - url: window.location.href - }; + const url = (typeof window === 'object' && window !== null ? window.location.href : ''); + this.optionsContext = {depth: 0, url}; - this.clipboardPasteTarget = document.querySelector('#clipboard-paste-target'); + this.clipboardPasteTarget = ( + typeof document === 'object' && document !== null ? + document.querySelector('#clipboard-paste-target') : + null + ); this.popupWindow = null; @@ -704,6 +706,9 @@ class Backend { return await navigator.clipboard.readText(); } else { const clipboardPasteTarget = this.clipboardPasteTarget; + if (clipboardPasteTarget === null) { + throw new Error('Reading the clipboard is not supported in this context'); + } clipboardPasteTarget.value = ''; clipboardPasteTarget.focus(); document.execCommand('paste'); @@ -1005,13 +1010,8 @@ class Backend { } async _onCommandToggle() { - const optionsContext = { - depth: 0, - url: window.location.href - }; const source = 'popup'; - - const options = this.getOptions(optionsContext); + const options = this.getOptions(this.optionsContext); options.general.enable = !options.general.enable; await this._onApiOptionsSave({source}); } diff --git a/ext/bg/js/background-main.js b/ext/bg/js/background-main.js index 24117f4e..345b4a77 100644 --- a/ext/bg/js/background-main.js +++ b/ext/bg/js/background-main.js @@ -20,6 +20,9 @@ */ (async () => { - window.yomichanBackend = new Backend(); - await window.yomichanBackend.prepare(); + const backend = new Backend(); + if (typeof window === 'object' && window !== null) { + window.yomichanBackend = backend; + } + await backend.prepare(); })(); diff --git a/ext/bg/js/database.js b/ext/bg/js/database.js index 930cd0d0..65e267ab 100644 --- a/ext/bg/js/database.js +++ b/ext/bg/js/database.js @@ -596,7 +596,7 @@ class Database { static _open(name, version, onUpgradeNeeded) { return new Promise((resolve, reject) => { - const request = window.indexedDB.open(name, version * 10); + const request = indexedDB.open(name, version * 10); request.onupgradeneeded = (event) => { try { diff --git a/ext/mixed/js/core.js b/ext/mixed/js/core.js index 257c7edf..bf877e72 100644 --- a/ext/mixed/js/core.js +++ b/ext/mixed/js/core.js @@ -177,7 +177,7 @@ function promiseTimeout(delay, resolveValue) { const complete = (callback, value) => { if (callback === null) { return; } if (timer !== null) { - window.clearTimeout(timer); + clearTimeout(timer); timer = null; } promiseResolve = null; @@ -192,7 +192,7 @@ function promiseTimeout(delay, resolveValue) { promiseResolve = resolve2; promiseReject = reject2; }); - timer = window.setTimeout(() => { + timer = setTimeout(() => { timer = null; resolve(resolveValue); }, delay); @@ -331,7 +331,7 @@ const yomichan = (() => { generateId(length) { const array = new Uint8Array(length); - window.crypto.getRandomValues(array); + crypto.getRandomValues(array); let id = ''; for (const value of array) { id += value.toString(16).padStart(2, '0'); @@ -364,7 +364,7 @@ const yomichan = (() => { const runtimeMessageCallback = ({action, params}, sender, sendResponse) => { let timeoutId = null; if (timeout !== null) { - timeoutId = window.setTimeout(() => { + timeoutId = setTimeout(() => { timeoutId = null; eventHandler.removeListener(runtimeMessageCallback); reject(new Error(`Listener timed out in ${timeout} ms`)); @@ -373,7 +373,7 @@ const yomichan = (() => { const cleanupResolve = (value) => { if (timeoutId !== null) { - window.clearTimeout(timeoutId); + clearTimeout(timeoutId); timeoutId = null; } eventHandler.removeListener(runtimeMessageCallback); @@ -453,10 +453,12 @@ const yomichan = (() => { // Private + _getUrl() { + return (typeof window === 'object' && window !== null ? window.location.href : ''); + } + _getLogContext() { - return { - url: window.location.href - }; + return {url: this._getUrl()}; } _onMessage({action, params}, sender, callback) { @@ -469,7 +471,7 @@ const yomichan = (() => { } _onMessageGetUrl() { - return {url: window.location.href}; + return {url: this._getUrl()}; } _onMessageOptionsUpdated({source}) {