import * as os from 'os';
import * as path from 'path';
import { EventEmitter } from 'events';
-import { ipcMain } from 'electron';
+import { ipcMain, session } from 'electron';
import { wrt } from '../browser/wrt';
interface AddonModule {
- activate: () => void;
- deactivate: () => void;
+ activate?: () => void;
+ deactivate?: () => void;
+ id?: string;
}
interface AddonInfo {
name: string;
- version: string;
+ isChromeExtension: boolean;
path: string;
pkgid: string;
activate: boolean;
constructor() {
ipcMain.on(InternalEvent.installed, (sender, name) => {
console.log('Addon event : INSTALLED ' + name);
- this.build();
+ this.loadJsonDB();
return this.activateByName(name);
});
ipcMain.on(InternalEvent.uninstalled, (sender, name, pkgid) => {
console.log('Addon event : UNINSTALLED ' + name);
this.deactivateByName(name);
- /* FIXME: will uncheck after chromium-efl released */
- if (wrt.getPlatformType() !== "product_tv")
- wrt.reqUninstallPkg(pkgid);
+ wrt.requestUninstallAddon(pkgid);
return true;
});
ipcMain.on(InternalEvent.activate, (sender, name) => {
});
}
- private loadJsonDB(dbPath?: string): void {
- if (!dbPath)
- dbPath = path.join(ADN_PATH, ADDONS_DB_FILE);
+ private loadJsonDB(): void {
+ const dbPath = path.join(ADN_PATH, ADDONS_DB_FILE);
let list;
try {
list = JSON.parse(fs.readFileSync(dbPath, 'utf-8'));
this.addonList = list;
}
- build(): boolean {
- this.loadJsonDB();
- for (let addon of this.addonList) {
- if (addon.activate == false)
- continue;
- console.log('addon ' + addon.name + '(' + addon.path + ') registered');
- }
+ initialize(): boolean {
+ wrt.on('addon-installed', (event: any, pathList: string[]) => {
+ for (let path of pathList) {
+ console.log('addon-installed at ' + path);
+ this.checkAddon(path);
+ }
+ this.updateDB();
+ });
+
+ wrt.on('addon-uninstalled', (event: any, id: string) => {
+ console.log('addon-unistalled named ' + id);
+ });
+
+ wrt.requestAddonList();
return this.isAddonAvailable();
}
- private getModule(addon: AddonInfo): AddonModule | undefined {
+ private activate(addon: AddonInfo) {
+ console.log('activate: ' + addon.path + ' name:' + addon.name);
+ if (!addon.activate)
+ return;
if (addon.module)
- return addon.module;
+ return;
+
try {
- const addonModule = require(addon.path);
- let addonInstance = new addonModule(this.eventManager.createBinder(addon));
- addon.module = addonInstance;
+ if (addon.isChromeExtension) {
+ session.defaultSession.loadExtension(addon.path).then((extension: Electron.Extension) => {
+ if (addon.module)
+ addon.module.id = extension.id;
+ else {
+ console.log('addon was deactivated')
+ session.defaultSession.removeExtension(extension.id);
+ }
+ });
+ addon.module = {};
+ } else {
+ const addonModule = require(addon.path);
+ let addonInstance = new addonModule(this.eventManager.createBinder(addon));
+ addon.module = addonInstance;
+ if (addonInstance.activate)
+ addonInstance.activate();
+ else
+ console.log('addon.activate not defined!');
+ }
} catch (e) {
console.error('error on creating addon instance : ' + e);
}
- return addon.module;
- }
-
- private activate(addon: AddonInfo) {
- console.log('activate: ' + addon.path + ' name:' + addon.name);
- if (!addon.activate)
- return;
- let addonInstance = this.getModule(addon);
- if (addonInstance && addonInstance.activate)
- addonInstance.activate();
- else
- console.log('addon.activate not defined!');
}
private deactivate(addon: AddonInfo) {
console.log('deactivate: ' + addon.path + ' name:' + addon.name);
- let addonInstance = this.getModule(addon);
- if (addonInstance && addonInstance.deactivate)
- addonInstance.deactivate();
- else
- console.log('addon.deactivate not defined!');
+ let addonInstance = addon.module;
+ if (!addonInstance) {
+ console.log('addon is not loaded');
+ return;
+ }
+
+ if (addon.isChromeExtension) {
+ if (addonInstance.id)
+ session.defaultSession.removeExtension(addonInstance.id);
+ } else {
+ if (addonInstance.deactivate)
+ addonInstance.deactivate();
+ else
+ console.log('addon.deactivate not defined!');
+ }
+ addon.module = undefined;
}
private getAddonInfo(name: string): AddonInfo | undefined {
this.eventManager.emit(eventName, ...args);
}
- checkAddon(appPath: string) {
+ private checkAddon(appPath: string) {
let manifest;
try {
let manifestPath = path.join(appPath, MANIFEST_FILE);
}
}
+ const isChromeExtension = ('manifest_version' in manifest);
this.addonList.push({
name: manifest.name,
- version: manifest.version,
- path: path.join(appPath, manifest.main),
+ isChromeExtension,
+ path: isChromeExtension ? appPath : path.join(appPath, manifest.main),
pkgid: arr[index],
activate: true
});
}
- updateDB() {
+ private updateDB() {
let dbPath = path.join(ADN_PATH, ADDONS_DB_FILE);
let currentAddonList;
try {
class Runtime {
webApplication?: WebApplication = undefined;
- isLaunched = false;
constructor() {
app.on('before-quit', (event: any) => {
app.on('browser-window-created', () => {
console.log('browser-window-created');
- if (!this.isLaunched) {
- addonManager.activateAll();
- this.isLaunched = true;
- }
});
app.on('window-all-closed', () => {
app.on('web-contents-created', (event: any, webContents: any) => {
console.log('web-contents-created');
webContents.on('before-input-event', (event: any, input: any) => {
- if (this.isLaunched && this.webApplication)
- this.handleKeyEvents(input.key);
+ this.handleKeyEvents(input.key);
});
});
app.once('ready', (event: any) => {
console.log('ready');
- let addonAvailable = addonManager.build();
+ let addonAvailable = addonManager.initialize();
console.log("addonBuild : " + addonAvailable);
if (addonAvailable) {
const XWalkExtension = require('../common/wrt_xwalk_extension');
console.log('ambient-changed , ambient_mode:' + ambient_mode);
this.webApplication?.ambientChanged(ambient_mode);
});
-
- wrt.on('addon-installed', (event: any, path: string) => {
- console.log('addon-installed at ' + path);
- addonManager.checkAddon(path);
- });
-
- wrt.on('addon-uninstalled', (event: any, id: string) => {
- console.log('addon-unistalled named ' + id);
- });
-
- wrt.on('wgt-checking-done', (event: any) => {
- console.log('wgt-checking-done');
- addonManager.updateDB();
- });
-
- /* FIXME: will uncheck after chromium-efl released */
- if (wrt.getPlatformType() !== "product_tv")
- wrt.getInstalledPkg();
}
private handleAppControlForElectronApp(appControl: any) {
private createWebApplicationAndLoadUrl(appControl: any) {
console.log('Creating WebApplication');
+ addonManager.activateAll();
let launchMode = appControl.getData('http://samsung.com/appcontrol/data/launch_mode');
let options: RuntimeOption = {
isAddonAvailable: addonManager.isAddonAvailable(),