const { app, session } = require('electron'); const _ = require('lodash'); const fs = require('fs'); const path = require('path'); const Log = require('ee-core/log'); /** * 扩展插件 (electron自身对该功能并不完全支持,官方也不建议使用) * @class */ class ChromeExtensionAddon { constructor() { } /** * 创建 */ async create () { Log.info('[addon:chromeExtension] load'); const extensionIds = this.getAllIds(); for (let i = 0; i < extensionIds.length; i++) { await this.load(extensionIds[i]); } } /** * 获取扩展id列表(crx解压后的目录名,即是该扩展的id) */ getAllIds () { const extendsionDir = this.getDirectory(); const ids = this.getDirs(extendsionDir); return ids; } /** * 扩展所在目录 */ getDirectory () { let extensionDirPath = ''; let variablePath = 'build'; // 打包前路径 if (app.isPackaged) { variablePath = '..'; // 打包后路径 } extensionDirPath = path.join(app.getAppPath(), variablePath, "extraResources", "chromeExtension"); return extensionDirPath; } /** * 加载扩展 */ async load (extensionId = '') { if (_.isEmpty(extensionId)) { return false } try { const extensionPath = path.join(this.getDirectory(), extensionId); Log.info('[addon:chromeExtension] extensionPath:', extensionPath); await session.defaultSession.loadExtension(extensionPath, { allowFileAccess: true }); } catch (e) { Log.info('[addon:chromeExtension] load extension error extensionId:%s, errorInfo:%s', extensionId, e.toString()); return false } return true } /** * 获取目录下所有文件夹 */ getDirs(dir) { if (!dir) { return []; } const components = []; const files = fs.readdirSync(dir); files.forEach(function(item, index) { const stat = fs.lstatSync(dir + '/' + item); if (stat.isDirectory() === true) { components.push(item); } }); return components; }; } ChromeExtensionAddon.toString = () => '[class ChromeExtensionAddon]'; module.exports = ChromeExtensionAddon;