Fix addon api and support chrome extension addon app 74/253274/2
authorSangYong Park <sy302.park@samsung.com>
Mon, 8 Feb 2021 05:51:30 +0000 (14:51 +0900)
committerSangYong Park <sy302.park@samsung.com>
Tue, 9 Feb 2021 01:48:22 +0000 (10:48 +0900)
Related:
https://review.tizen.org/gerrit/#/c/platform/framework/web/chromium-efl/+/253273/

Change-Id: Icc2c0533199bb075d1ecf64bc7d22ed39be4513b
Signed-off-by: SangYong Park <sy302.park@samsung.com>
wrt_app/src/addon_manager.ts
wrt_app/src/runtime.ts

index 4d25a33..aeb6943 100644 (file)
@@ -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 {
index a729356..925a2e5 100644 (file)
@@ -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(),