diff options
Diffstat (limited to 'dev')
-rw-r--r-- | dev/database-vm.js | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/dev/database-vm.js b/dev/database-vm.js new file mode 100644 index 00000000..bffa798b --- /dev/null +++ b/dev/database-vm.js @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2020 Yomichan Authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +const fs = require('fs'); +const url = require('url'); +const path = require('path'); +const {JSZip} = require('./util'); +const {VM} = require('./vm'); +require('fake-indexeddb/auto'); + +const chrome = { + runtime: { + getURL: (path2) => { + return url.pathToFileURL(path.join(__dirname, '..', 'ext', path2.replace(/^\//, ''))).href; + } + } +}; + +class Image { + constructor() { + this._src = ''; + this._loadCallbacks = []; + } + + get src() { + return this._src; + } + + set src(value) { + this._src = value; + this._delayTriggerLoad(); + } + + get naturalWidth() { + return 100; + } + + get naturalHeight() { + return 100; + } + + addEventListener(eventName, callback) { + if (eventName === 'load') { + this._loadCallbacks.push(callback); + } + } + + removeEventListener(eventName, callback) { + if (eventName === 'load') { + const index = this._loadCallbacks.indexOf(callback); + if (index >= 0) { + this._loadCallbacks.splice(index, 1); + } + } + } + + async _delayTriggerLoad() { + await Promise.resolve(); + for (const callback of this._loadCallbacks) { + callback(); + } + } +} + +async function fetch(url2) { + const filePath = url.fileURLToPath(url2); + await Promise.resolve(); + const content = fs.readFileSync(filePath, {encoding: null}); + return { + ok: true, + status: 200, + statusText: 'OK', + text: async () => Promise.resolve(content.toString('utf8')), + json: async () => Promise.resolve(JSON.parse(content.toString('utf8'))) + }; +} + +class DatabaseVM extends VM { + constructor() { + super({ + chrome, + Image, + fetch, + indexedDB: global.indexedDB, + IDBKeyRange: global.IDBKeyRange, + JSZip + }); + this.context.window = this.context; + this.indexedDB = global.indexedDB; + } +} + +module.exports = { + DatabaseVM +}; |