From: SangYong Park Date: Mon, 8 Feb 2021 05:51:30 +0000 (+0900) Subject: Fix addon api and support chrome extension addon app X-Git-Tag: accepted/tizen/unified/20210304.131212~1^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c5579c01ee9b8cd8ea20aba220dbf5f7c8c73fd5;p=platform%2Fframework%2Fweb%2Fwrtjs.git Fix addon api and support chrome extension addon app Related: https://review.tizen.org/gerrit/#/c/platform/framework/web/chromium-efl/+/253273/ Change-Id: Icc2c0533199bb075d1ecf64bc7d22ed39be4513b Signed-off-by: SangYong Park --- diff --git a/wrt_app/src/addon_manager.ts b/wrt_app/src/addon_manager.ts index 4d25a33..aeb6943 100644 --- a/wrt_app/src/addon_manager.ts +++ b/wrt_app/src/addon_manager.ts @@ -20,17 +20,18 @@ import * as fs from 'fs'; 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; @@ -126,15 +127,13 @@ class AddonManager { 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) => { @@ -147,9 +146,8 @@ class AddonManager { }); } - 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')); @@ -160,47 +158,73 @@ class AddonManager { 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 { @@ -249,7 +273,7 @@ class AddonManager { this.eventManager.emit(eventName, ...args); } - checkAddon(appPath: string) { + private checkAddon(appPath: string) { let manifest; try { let manifestPath = path.join(appPath, MANIFEST_FILE); @@ -268,16 +292,17 @@ class AddonManager { } } + 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 { diff --git a/wrt_app/src/runtime.ts b/wrt_app/src/runtime.ts index a729356..925a2e5 100644 --- a/wrt_app/src/runtime.ts +++ b/wrt_app/src/runtime.ts @@ -23,7 +23,6 @@ import { WebApplication } from './web_application'; class Runtime { webApplication?: WebApplication = undefined; - isLaunched = false; constructor() { app.on('before-quit', (event: any) => { @@ -46,10 +45,6 @@ class Runtime { app.on('browser-window-created', () => { console.log('browser-window-created'); - if (!this.isLaunched) { - addonManager.activateAll(); - this.isLaunched = true; - } }); app.on('window-all-closed', () => { @@ -60,14 +55,13 @@ class Runtime { 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'); @@ -127,24 +121,6 @@ class Runtime { 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) { @@ -165,6 +141,7 @@ class Runtime { 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(),