--- /dev/null
+'use strict';
+
+const moduleList = require('./module-list');
+
+const memoizedGetter = (getter) => {
+ let memoizedValue = null;
+
+ return () => {
+ if (memoizedValue === null) {
+ memoizedValue = getter();
+ }
+ return memoizedValue;
+ }
+}
+
+for (const module of moduleList) {
+ Object.defineProperty(exports, module.name, {
+ get: memoizedGetter(() => require(`./modules/${module.file}.js`))
+ });
+}
--- /dev/null
+'use strict'
+
+// Browser side add-on modules, please sort alphabetically
+module.exports = [
+ { name: 'messaging', file: 'messaging' },
+ { name: 'options', file: 'options' },
+ { name: 'window', file: 'window' }
+]
--- /dev/null
+'use strict';
+
+const { ipcMain } = require('electron');
+
+module.exports = {
+ on: function (channel, listener) {
+ ipcMain.on(channel, listener);
+ }
+};
\ No newline at end of file
--- /dev/null
+'use strict';
+
+const fs = require('fs');
+const path = require('path');
+
+const REPO_PATH = path.join(require('os').homedir(), 'data/electron/runtime_addon/');
+const DB_FILE = '_db.json';
+
+module.exports = {
+ get: function (addon_name, key) {
+ const DB_PATH = REPO_PATH + addon_name + DB_FILE;
+ try {
+ const fileContents = fs.readFileSync(DB_PATH);
+ const jsonObject = JSON.parse(fileContents);
+ console.log(`read value: ${JSON.stringify(jsonObject)}`);
+ return jsonObject[key];
+ } catch (err) {
+ console.log(`An error has occurred: ${err}`);
+ }
+ },
+
+ set: function (addon_name, key, value) {
+ const DB_PATH = REPO_PATH + addon_name + DB_FILE;
+ try {
+ const fileContents = fs.readFileSync(DB_PATH);
+ let jsonObject = JSON.parse(fileContents);
+ console.log(`current value: ${JSON.stringify(jsonObject)}`);
+ jsonObject[key] = value;
+ console.log(`new value: ${JSON.stringify(jsonObject)}`);
+ const jsonString = JSON.stringify(jsonObject);
+ fs.writeFileSync(DB_PATH, jsonString);
+ } catch (err) {
+ console.log(`An error has occurred: ${err}`);
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+'use strict';
+
+const { dialog, TopLevelWindow } = require('electron');
+
+module.exports = {
+ loadURL: function (winId, url) {
+ let window = TopLevelWindow.fromId(winId);
+ window.loadURL(url);
+ },
+
+ showMessageBox: function (winId, options) {
+ let window = TopLevelWindow.fromId(winId);
+ dialog.showMessageBox(window, options, null);
+ },
+
+ show: function (winId) {
+ let window = TopLevelWindow.fromId(winId);
+ window.show();
+ }
+}
\ No newline at end of file
--- /dev/null
+'use strict';
+
+const moduleList = require('./module-list');
+
+const memoizedGetter = (getter) => {
+ let memoizedValue = null;
+
+ return () => {
+ if (memoizedValue === null) {
+ memoizedValue = getter();
+ }
+ return memoizedValue;
+ }
+}
+
+for (const module of moduleList) {
+ Object.defineProperty(exports, module.name, {
+ get: memoizedGetter(() => require(`./modules/${module.file}.js`))
+ });
+}
--- /dev/null
+'use strict';
+
+const ADDONS_PATH = require('path').join(__dirname, 'addonapi.js');
+const Module = require('module');
+const originalResolveFilename = Module._resolveFilename;
+Module._resolveFilename = function (request, parent, isMain) {
+ if (request === 'addonapi') {
+ return ADDONS_PATH;
+ } else {
+ return originalResolveFilename(request, parent, isMain);
+ }
+}
\ No newline at end of file
--- /dev/null
+'use strict';
+
+// Renderer side add-on modules, please sort alphabetically
+module.exports = [
+ { name: 'messaging', file: 'messaging' }
+];
--- /dev/null
+'use strict';
+
+const { ipcRenderer } = require('electron');
+
+module.exports = {
+ on: function (channel, listener) {
+ ipcRenderer.on(channel, listener);
+ },
+
+ send: function (...args) {
+ ipcRenderer.send(args);
+ }
+}
\ No newline at end of file
path.join(require('os').homedir(), 'data/electron/runtime_addon');
const MANIFEST_FILE = 'manifest.json';
const ADDONS_DB_FILE = 'addons_db.json';
+const ADDONS_PATH = path.join(__dirname, '..', 'addon', 'browser', 'addonapi.js');
// A set of predefined events for addons
let EventList = [
this.addons_list_ = null;
this.addons_ = null;
this.evt_emitter_ = null;
+ this.registerAPIModule();
+ }
+
+ registerAPIModule() {
+ const Module = require('module');
+ const originalResolveFilename = Module._resolveFilename;
+ Module._resolveFilename = function (request, parent, isMain) {
+ if (request === 'addonapi') {
+ return ADDONS_PATH;
+ } else {
+ return originalResolveFilename(request, parent, isMain);
+ }
+ }
}
loadJsonDB(db_path) {
const wrt = require('../browser/wrt');
const WRTWebContents = require('../browser/wrt_web_contents');
const WRTWindow = require('../browser/wrt_window');
+const PRELOAD_PATH = require('path').join(__dirname, '..', 'addon', 'renderer', 'apreload.js');
class WebApplication {
constructor(options) {
show: false,
webPreferences: {
nodeIntegration: options.isAddonAvailable,
- nodeIntegrationInWorker: false
+ nodeIntegrationInWorker: false,
+ preload: (options.isAddonAvailable) ? PRELOAD_PATH : undefined
},
webContents: WRTWebContents.create(),
'web-preferences': {