From 00c5ae79833a641ccc5f7d31b6eea3e91db4cb71 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Sat, 31 Jul 2021 12:30:31 -0400 Subject: DictionaryImporterMediaLoader (#1860) * Rename param for consistency * Move media loading functionality into DictionaryImporterMediaLoader * Create test class for media loading * Remove unnecessary Blob/Image/URL functionality --- ext/js/language/dictionary-importer.js | 41 +++++----------------------------- 1 file changed, 5 insertions(+), 36 deletions(-) (limited to 'ext/js/language/dictionary-importer.js') diff --git a/ext/js/language/dictionary-importer.js b/ext/js/language/dictionary-importer.js index 27b3c44e..b931c929 100644 --- a/ext/js/language/dictionary-importer.js +++ b/ext/js/language/dictionary-importer.js @@ -22,11 +22,12 @@ */ class DictionaryImporter { - constructor() { + constructor(mediaLoader) { + this._mediaLoader = mediaLoader; this._schemas = new Map(); } - async importDictionary(dictionaryDatabase, archiveSource, details, onProgress) { + async importDictionary(dictionaryDatabase, archiveContent, details, onProgress) { if (!dictionaryDatabase) { throw new Error('Invalid database'); } @@ -37,7 +38,7 @@ class DictionaryImporter { const hasOnProgress = (typeof onProgress === 'function'); // Read archive - const archive = await JSZip.loadAsync(archiveSource); + const archive = await JSZip.loadAsync(archiveContent); // Read and validate index const indexFileName = 'index.json'; @@ -469,7 +470,7 @@ class DictionaryImporter { let width; let height; try { - ({width, height} = await this._getImageResolution(mediaType, content)); + ({width, height} = await this._mediaLoader.getImageResolution(mediaType, content)); } catch (e) { throw createError('Could not load image'); } @@ -502,36 +503,4 @@ class DictionaryImporter { } return await response.json(); } - - /** - * Attempts to load an image using a base64 encoded content and a media type - * and returns its resolution. - * @param mediaType The media type for the image content. - * @param content The binary content for the image, encoded in base64. - * @returns A Promise which resolves with {width, height} on success, - * otherwise an error is thrown. - */ - _getImageResolution(mediaType, content) { - return new Promise((resolve, reject) => { - const image = new Image(); - const eventListeners = new EventListenerCollection(); - const cleanup = () => { - image.removeAttribute('src'); - URL.revokeObjectURL(url); - eventListeners.removeAllEventListeners(); - }; - eventListeners.addEventListener(image, 'load', () => { - const {naturalWidth: width, naturalHeight: height} = image; - cleanup(); - resolve({width, height}); - }, false); - eventListeners.addEventListener(image, 'error', () => { - cleanup(); - reject(new Error('Image failed to load')); - }, false); - const blob = MediaUtil.createBlobFromBase64Content(content, mediaType); - const url = URL.createObjectURL(blob); - image.src = url; - }); - } } -- cgit v1.2.3