From 9e03b436cbdd0e2d6c9f416138647120aa8fea1a Mon Sep 17 00:00:00 2001 From: "surya.kumar7" Date: Thu, 25 Jul 2019 18:04:20 +0530 Subject: [PATCH 01/16] [Addon] Expose a module 'addonapi' for addons usage Add-ons can call require on 'addonapi' to receive an object from both browser & renderer & receives addon utility functions Change-Id: I55baec1e57f37d7efec39cef8fbacf2aab1b32b8 Signed-off-by: surya.kumar7 --- wrt_app/addon/browser/addonapi.js | 20 ++++++++++++++++ wrt_app/addon/browser/module-list.js | 8 +++++++ wrt_app/addon/browser/modules/messaging.js | 9 ++++++++ wrt_app/addon/browser/modules/options.js | 36 +++++++++++++++++++++++++++++ wrt_app/addon/browser/modules/window.js | 20 ++++++++++++++++ wrt_app/addon/renderer/addonapi.js | 20 ++++++++++++++++ wrt_app/addon/renderer/apreload.js | 12 ++++++++++ wrt_app/addon/renderer/module-list.js | 6 +++++ wrt_app/addon/renderer/modules/messaging.js | 13 +++++++++++ wrt_app/src/addon_manager.js | 14 +++++++++++ wrt_app/src/web_application.js | 4 +++- 11 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 wrt_app/addon/browser/addonapi.js create mode 100644 wrt_app/addon/browser/module-list.js create mode 100644 wrt_app/addon/browser/modules/messaging.js create mode 100644 wrt_app/addon/browser/modules/options.js create mode 100644 wrt_app/addon/browser/modules/window.js create mode 100644 wrt_app/addon/renderer/addonapi.js create mode 100644 wrt_app/addon/renderer/apreload.js create mode 100644 wrt_app/addon/renderer/module-list.js create mode 100644 wrt_app/addon/renderer/modules/messaging.js diff --git a/wrt_app/addon/browser/addonapi.js b/wrt_app/addon/browser/addonapi.js new file mode 100644 index 0000000..4a90338 --- /dev/null +++ b/wrt_app/addon/browser/addonapi.js @@ -0,0 +1,20 @@ +'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`)) + }); +} diff --git a/wrt_app/addon/browser/module-list.js b/wrt_app/addon/browser/module-list.js new file mode 100644 index 0000000..b213e0a --- /dev/null +++ b/wrt_app/addon/browser/module-list.js @@ -0,0 +1,8 @@ +'use strict' + +// Browser side add-on modules, please sort alphabetically +module.exports = [ + { name: 'messaging', file: 'messaging' }, + { name: 'options', file: 'options' }, + { name: 'window', file: 'window' } +] diff --git a/wrt_app/addon/browser/modules/messaging.js b/wrt_app/addon/browser/modules/messaging.js new file mode 100644 index 0000000..26511c7 --- /dev/null +++ b/wrt_app/addon/browser/modules/messaging.js @@ -0,0 +1,9 @@ +'use strict'; + +const { ipcMain } = require('electron'); + +module.exports = { + on: function (channel, listener) { + ipcMain.on(channel, listener); + } +}; \ No newline at end of file diff --git a/wrt_app/addon/browser/modules/options.js b/wrt_app/addon/browser/modules/options.js new file mode 100644 index 0000000..75e0d51 --- /dev/null +++ b/wrt_app/addon/browser/modules/options.js @@ -0,0 +1,36 @@ +'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 diff --git a/wrt_app/addon/browser/modules/window.js b/wrt_app/addon/browser/modules/window.js new file mode 100644 index 0000000..c7a92f2 --- /dev/null +++ b/wrt_app/addon/browser/modules/window.js @@ -0,0 +1,20 @@ +'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 diff --git a/wrt_app/addon/renderer/addonapi.js b/wrt_app/addon/renderer/addonapi.js new file mode 100644 index 0000000..4a90338 --- /dev/null +++ b/wrt_app/addon/renderer/addonapi.js @@ -0,0 +1,20 @@ +'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`)) + }); +} diff --git a/wrt_app/addon/renderer/apreload.js b/wrt_app/addon/renderer/apreload.js new file mode 100644 index 0000000..ebb0d73 --- /dev/null +++ b/wrt_app/addon/renderer/apreload.js @@ -0,0 +1,12 @@ +'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 diff --git a/wrt_app/addon/renderer/module-list.js b/wrt_app/addon/renderer/module-list.js new file mode 100644 index 0000000..c65f538 --- /dev/null +++ b/wrt_app/addon/renderer/module-list.js @@ -0,0 +1,6 @@ +'use strict'; + +// Renderer side add-on modules, please sort alphabetically +module.exports = [ + { name: 'messaging', file: 'messaging' } +]; diff --git a/wrt_app/addon/renderer/modules/messaging.js b/wrt_app/addon/renderer/modules/messaging.js new file mode 100644 index 0000000..40fe684 --- /dev/null +++ b/wrt_app/addon/renderer/modules/messaging.js @@ -0,0 +1,13 @@ +'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 diff --git a/wrt_app/src/addon_manager.js b/wrt_app/src/addon_manager.js index 7bfb7f1..aedebf4 100644 --- a/wrt_app/src/addon_manager.js +++ b/wrt_app/src/addon_manager.js @@ -22,6 +22,7 @@ const ADN_PATH = 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 = [ @@ -45,6 +46,19 @@ class AddonManager { 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) { diff --git a/wrt_app/src/web_application.js b/wrt_app/src/web_application.js index 085239e..8f6ae69 100755 --- a/wrt_app/src/web_application.js +++ b/wrt_app/src/web_application.js @@ -21,6 +21,7 @@ const WAS_EVENT = require('./was_event'); 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) { @@ -199,7 +200,8 @@ class WebApplication { show: false, webPreferences: { nodeIntegration: options.isAddonAvailable, - nodeIntegrationInWorker: false + nodeIntegrationInWorker: false, + preload: (options.isAddonAvailable) ? PRELOAD_PATH : undefined }, webContents: WRTWebContents.create(), 'web-preferences': { -- 2.7.4 From 8c456e02fddddc81793af0031683487ac20dcefc Mon Sep 17 00:00:00 2001 From: "surya.kumar7" Date: Thu, 17 Oct 2019 22:18:44 +0530 Subject: [PATCH 02/16] fixup! Fix application launch issue. WebApplication's suspended state was wrongly initialized to true, causing the delay(of 'ready-to-show' event) timer to not be fired Scenario can be tested by connecting to a slow WiFi & loading a website Change-Id: I81529a1d70c46ad219adaffb2ac28ac7c959a76c Signed-off-by: surya.kumar7 --- wrt_app/src/web_application.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrt_app/src/web_application.js b/wrt_app/src/web_application.js index 4087680..ea70509 100755 --- a/wrt_app/src/web_application.js +++ b/wrt_app/src/web_application.js @@ -50,7 +50,7 @@ class WebApplication { } this.accessiblePath = wrt.getAccessiblePath(); this.isAlwaysReload = wrt.isAlwaysReload(); - this.suspended = true; + this.suspended = false; this.loadFinished = false; this.runningStatus = 'none'; this.isTVProfile = (wrt.getPlatformType() === "product_tv"); -- 2.7.4 From 7bf7960c955db5d6243d097ffa60656ef19f1979 Mon Sep 17 00:00:00 2001 From: DongHyun Song Date: Fri, 18 Oct 2019 15:24:58 +0900 Subject: [PATCH 03/16] Skip exit of bg runnable app even if multitasking is not supported Fix background support app's termination issue when multitasking is false. Even though multitasking is false, the app is background runnable app, it must run as working in BG. From XWALK, WebApplication::Suspend() has a logic that it check first background_support_enabled() value. If it is false, check if its multitasking option. Change-Id: I1c93f8a78961e52ecf7bff731021612ee9954974 Signed-off-by: DongHyun Song --- wrt_app/src/web_application.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/wrt_app/src/web_application.js b/wrt_app/src/web_application.js index 4087680..b6aaf91 100755 --- a/wrt_app/src/web_application.js +++ b/wrt_app/src/web_application.js @@ -298,14 +298,16 @@ class WebApplication { wrt.flushCookie(); this.windowList.forEach((window) => window.webContents.session.flushStorageData()); } - if (!this.multitaskingSupport) { - // FIXME : terminate app after visibilitychange event handling - setTimeout(() => { - console.log('multitasking is not supported; quitting app') - app.quit(); - }, 1000); - } else if (!this.backgroundRunnable()) { - this.windowList.forEach((window) => window.setEnabled(false)); + if (!this.backgroundRunnable()) { + if (!this.multitaskingSupport) { + // FIXME : terminate app after visibilitychange event handling + setTimeout(() => { + console.log('multitasking is not supported; quitting app') + app.quit(); + }, 1000); + } else { + this.windowList.forEach((window) => window.setEnabled(false)); + } } this.windowList[this.windowList.length - 1].hide(); } -- 2.7.4 From e2ffe802b48f3465572d60ba3b6337409d758ea8 Mon Sep 17 00:00:00 2001 From: DongHyun Song Date: Fri, 18 Oct 2019 16:30:53 +0900 Subject: [PATCH 04/16] [VD][Workaround] Show popup when need default client cert This is for detecting apps, which need TV default client cert. TV default client certification will be expired soon, but we cannot know which apps use this default client cert. So that checking these apps by SQA verification, adds popup window. This patch will be reverted after QA verification Change-Id: I8bafbbb2150234a43745d1f95a640726ee44eb26 Signed-off-by: DongHyun Song --- wrt_app/src/web_application.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/wrt_app/src/web_application.js b/wrt_app/src/web_application.js index d06e0d7..02db6ed 100755 --- a/wrt_app/src/web_application.js +++ b/wrt_app/src/web_application.js @@ -126,6 +126,22 @@ class WebApplication { self.pendingCallbacks.set(id, callback); wrt.handleAuthRequest(id, webContents); }); + if (this.isTVProfile) { + // TODO. This logic in only for QA verification + // Current TV default client cert will be expired. + // So that detecting apps which use TV client certificate, + // adds popup alarms for QA + app.on('select-client-certificate', function(event, webContents, host, list, callback) { + console.log('select-client-certificate'); + event.preventDefault(); + if (list.length > 0 && list[0].subjectName == 'Samsung TV,BDP certificate') { + setTimeout(() => { + wrt.showDialog(webContents, 'Samsung TV,BDP certificate'); + }, 7000); + } + callback(list[0]); + }); + } if (this.accessiblePath) { console.log('accessiblePath : ' + this.accessiblePath); protocol.interceptFileProtocol('file', (request, callback) => { -- 2.7.4 From 7439dc6ec84a4206b490cec367ee949da467fc7d Mon Sep 17 00:00:00 2001 From: "surya.kumar7" Date: Fri, 18 Oct 2019 17:27:21 +0530 Subject: [PATCH 05/16] [Addon] Refactor event emitter object handling & operations through it 1. While sending event emitter object to add-ons, visibility is limited to only two of its functions - on & off 2. Invalid events are discarded even before it's passed to EventEmitter object 3. Removed an excess dependancy between Runtime & WebApplication while handling event emitter object 4. Removed a bit unused code Change-Id: Ide4b8772eb6881384fd4b2bbd32562826ca4ea85 Signed-off-by: surya.kumar7 --- wrt_app/src/addon_manager.js | 50 +++++++++++++++--------------------------- wrt_app/src/runtime.js | 10 ++++----- wrt_app/src/web_application.js | 32 +++++++++++++-------------- 3 files changed, 39 insertions(+), 53 deletions(-) diff --git a/wrt_app/src/addon_manager.js b/wrt_app/src/addon_manager.js index aedebf4..31c537a 100644 --- a/wrt_app/src/addon_manager.js +++ b/wrt_app/src/addon_manager.js @@ -25,7 +25,7 @@ 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 = [ +const EventList = [ 'newListener', // A listener is added via on() or addListener() 'removeListener', // A listener is removed via off() or removeListener() 'lcPrelaunch', // An app is at just before launching @@ -43,10 +43,10 @@ const {EventEmitter} = require('events'); class AddonManager { constructor() { + this.registerAPIModule(); this.addons_list_ = null; this.addons_ = null; this.evt_emitter_ = null; - this.registerAPIModule(); } registerAPIModule() { @@ -129,7 +129,7 @@ class AddonManager { console.log('activate: ' + addon_path + ' name:' + name); try { let Addon = require(addon_path); - addon = new Addon(this.evt_emitter_); + addon = new Addon(this.wrappedEventEmitter); } catch (e) { console.error('activate - error on require() : ' + e); return; @@ -157,7 +157,7 @@ class AddonManager { console.log('deactivate: path:' + addon_path); try { let Addon = require(addon_path); - addon = new Addon(this.evt_emitter_); + addon = new Addon(this.wrappedEventEmitter); } catch (e) { console.error('deactivate - error on require() : ' + e); } @@ -177,7 +177,6 @@ class AddonManager { for (var name in this.addons_) { this.activate(app, name); } - this.removeInvalidListener(); } deactivateAll(app) { @@ -196,12 +195,21 @@ class AddonManager { initEventListener() { this.evt_emitter_ = new EventEmitter(); - this.evt_emitter_.on('newListener', function(event, listener) { - if (EventList.indexOf(event) != -1) - console.log('Valid Event:' + event); - else { - console.log('Invalid Event:' + event); + this.wrappedEventEmitter = { + on: (eventName, listener) => { + if (EventList.indexOf(eventName) !== -1) + this.evt_emitter_.on(eventName, listener); + else console.log('Invalid Event: ' + eventName); + }, + off: (eventName, listener) => { + if (EventList.indexOf(eventName) !== -1) + this.evt_emitter_.off(eventName, listener); + else console.log('Invalid Event: ' + eventName); } + } + + this.evt_emitter_.on('newListener', function(event, listener) { + console.log('A listener for ' + event + ' has been added'); }); this.evt_emitter_.on('removeListener', function(event, listener) { @@ -209,28 +217,6 @@ class AddonManager { }); } - removeInvalidListener() { - let activeEvents = this.evt_emitter_.eventNames(); - for (var i in activeEvents) { - let item = activeEvents[i]; - if (EventList.indexOf(item) == -1) { - console.log('Found invalid event(' + item + ')'); - if (this.evt_emitter_) - this.evt_emitter_.removeAllListeners(item); - else - console.log('event listener is NOT valid'); - } - } - activeEvents = this.evt_emitter_.eventNames(); - console.log('Remained active events : ' + activeEvents); - } - existEventListeners(event) { - let activeEvents = this.evt_emitter_.eventNames(); - if (activeEvents.indexOf(event) == -1) - return false; - else return true; - } - static getManifestFile() { return MANIFEST_FILE; } diff --git a/wrt_app/src/runtime.js b/wrt_app/src/runtime.js index 6130fcd..736e68e 100755 --- a/wrt_app/src/runtime.js +++ b/wrt_app/src/runtime.js @@ -39,7 +39,7 @@ class Runtime { app.on('before-quit', function(event) { console.log('before-quit'); if (!wrt.isElectronApp()) { - _this.webApplication.quit(_this.addonManager.evt_emitter_); + _this.webApplication.quit(); _this.webApplication.finalize(); _this.webApplication = null; } @@ -127,7 +127,7 @@ class Runtime { src = "about:blank"; } _this.webApplication.mainWindow.loadURL(src); - _this.webApplication.prelaunch(_this.addonManager.evt_emitter_, src); + _this.webApplication.prelaunch(src); } else { console.log('Handling app-control event'); if (_this.webApplication.preloadStatus == 'readyToShow') { @@ -169,12 +169,12 @@ class Runtime { wrt.on('suspend', function() { console.log('suspend'); if (_this.webApplication) - _this.webApplication.suspend(_this.addonManager.evt_emitter_); + _this.webApplication.suspend(); }); wrt.on('resume', function() { console.log('resume'); if (_this.webApplication) - _this.webApplication.resume(_this.addonManager.evt_emitter_); + _this.webApplication.resume(); }); wrt.on('low-memory', function() { console.log('low-memory'); @@ -313,7 +313,7 @@ class Runtime { } if (valid) { - _this.webApplication.keyEvent(_this.addonManager.evt_emitter_, key); + _this.webApplication.keyEvent(key); } } } diff --git a/wrt_app/src/web_application.js b/wrt_app/src/web_application.js index d06e0d7..e6e75b5 100755 --- a/wrt_app/src/web_application.js +++ b/wrt_app/src/web_application.js @@ -287,11 +287,11 @@ class WebApplication { "profile log from the initial loading." wrt.showDialog(this.mainWindow.webContents, message); } - suspend(evtEmitter) { + suspend() { console.log('WebApplication : suspend'); - if (evtEmitter) { + if (this.addonEmitter) { console.log('WebApplication : suspend - Found event emitter'); - evtEmitter.emit('lcSuspend', this.mainWindow.id); + this.addonEmitter.emit('lcSuspend', this.mainWindow.id); } else { console.log('WebApplication : suspend - Invalid event emitter'); } @@ -313,14 +313,14 @@ class WebApplication { } this.windowList[this.windowList.length - 1].hide(); } - resume(evtEmitter) { + resume() { console.log('WebApplication : resume'); this.suspended = false; - if (evtEmitter) { + if (this.addonEmitter) { console.log('WebApplication : resume - Found event emitter'); - evtEmitter.emit('lcResume', this.mainWindow.id); + this.addonEmitter.emit('lcResume', this.mainWindow.id); } else { console.log('WebApplication : resume - Invalid event emitter'); } @@ -347,11 +347,11 @@ class WebApplication { window.removeAllListeners(); }); } - quit(evtEmitter) { + quit() { console.log('WebApplication : quit'); - if (evtEmitter) { + if (this.addonEmitter) { console.log('WebApplication : quit - Found event emitter'); - evtEmitter.emit('lcQuit', this.mainWindow.id); + this.addonEmitter.emit('lcQuit', this.mainWindow.id); } else { console.log('WebApplication : quit - Invalid event emitter'); } @@ -389,9 +389,9 @@ class WebApplication { window.destroy(); }); } - keyEvent(evtEmitter, key) { + keyEvent(key) { console.log('WebApplication : keyEvent'); - if (!evtEmitter) { + if (!this.addonEmitter) { console.log('Invalid event emitter for key hook'); return; } @@ -399,22 +399,22 @@ class WebApplication { switch(key) { case "ArrowUp": case "Up": - evtEmitter.emit('hwUpkey', this.mainWindow.id); + this.addonEmitter.emit('hwUpkey', this.mainWindow.id); break; case "ArrowDown": case "Down": - evtEmitter.emit('hwDownkey', this.mainWindow.id); + this.addonEmitter.emit('hwDownkey', this.mainWindow.id); break; default: console.log('No handler for ' + key); break; } } - prelaunch(evtEmitter, origURL) { + prelaunch(origURL) { console.log('WebApplication : prelaunch'); - if (evtEmitter) { + if (this.addonEmitter) { console.log('WebApplication : prelaunch - Found event emitter'); - evtEmitter.emit('lcPrelaunch', this.mainWindow.id, origURL); + this.addonEmitter.emit('lcPrelaunch', this.mainWindow.id, origURL); } else { console.log('WebApplication : prelaunch - Invalid event emitter'); } -- 2.7.4 From eca8e674ee9f53f64f905df1a751430e01b8c0cc Mon Sep 17 00:00:00 2001 From: YONGMAN SON Date: Fri, 25 Oct 2019 11:24:26 +0900 Subject: [PATCH 06/16] [WRTJS][vd][bugfix] change url compare code. kona : DF191021-00235 If the page url doesn't change, don't need to reload. But it's being reloaded by a bug. src = http://d2ehepluhe2jv7.cloudfront.net _this.webApplication.mainWindow.getURL() = http://d2ehepluhe2jv7.cloudfront.net/#/ (Compare the loaded url with the url to be loaded. Some special characters make the url different.) Change-Id: I18947c0d7641d395ae5797c3c85890424871e1e8 Signed-off-by: YONGMAN SON --- wrt_app/src/runtime.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) mode change 100755 => 100644 wrt_app/src/runtime.js diff --git a/wrt_app/src/runtime.js b/wrt_app/src/runtime.js old mode 100755 new mode 100644 index 6130fcd..19d245b --- a/wrt_app/src/runtime.js +++ b/wrt_app/src/runtime.js @@ -34,6 +34,7 @@ class Runtime { this.sandbox = []; this.webContents = null; this.addonPkgs = []; + this.isTVProfile = (wrt.getPlatformType() === 'product_tv'); var _this = this; app.on('before-quit', function(event) { @@ -148,8 +149,21 @@ class Runtime { let reload = loadInfo.getReload() || _this.webApplication.isAlwaysReload; if (!reload) { - if (src != _this.webApplication.mainWindow.getURL()) - reload = true; + if (_this.isTVProfile) { + console.log(`src = ${src}, app-control uri = ${_this.webApplication.mainWindow.getURL()}`); + const url = require('url'); + let appcontrolUrl = url.parse(src); + let originUrl = url.parse(_this.webApplication.mainWindow.getURL()); + if (appcontrolUrl.protocol !== originUrl.protocol || + appcontrolUrl.host !== originUrl.host || + appcontrolUrl.pathname !== originUrl.pathname) { + reload = true; + } + } else { + if (src != _this.webApplication.mainWindow.getURL()) { + reload = true; + } + } } // handle http://tizen.org/appcontrol/operation/main operation specially. // only menu-screen app can send launch request with main operation. -- 2.7.4 From a49cd36c5c2de7cb4fba20c360652667702c15a5 Mon Sep 17 00:00:00 2001 From: "surya.kumar7" Date: Tue, 5 Nov 2019 14:59:28 +0530 Subject: [PATCH 07/16] Remove add-on events to prevent add-ons from monitoring other listeners A couple allowed add-on events can be used to eavesdrop on other add-ons or examine other listeners' code. Removed them to avoid any exploits. Change-Id: I9791d82516f2f263bf2e4f5ef7c793eadda85b35 Signed-off-by: surya.kumar7 --- wrt_app/src/addon_manager.js | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/wrt_app/src/addon_manager.js b/wrt_app/src/addon_manager.js index 31c537a..a156fa7 100644 --- a/wrt_app/src/addon_manager.js +++ b/wrt_app/src/addon_manager.js @@ -26,8 +26,6 @@ const ADDONS_PATH = path.join(__dirname, '..', 'addon', 'browser', 'addonapi.js' // A set of predefined events for addons const EventList = [ - 'newListener', // A listener is added via on() or addListener() - 'removeListener', // A listener is removed via off() or removeListener() 'lcPrelaunch', // An app is at just before launching 'lcResume', // An app is resumed 'lcSuspend', // An app is suspended @@ -197,24 +195,18 @@ class AddonManager { this.evt_emitter_ = new EventEmitter(); this.wrappedEventEmitter = { on: (eventName, listener) => { - if (EventList.indexOf(eventName) !== -1) + if (EventList.indexOf(eventName) !== -1) { + console.log(`A new listener for ${eventName} is added`); this.evt_emitter_.on(eventName, listener); - else console.log('Invalid Event: ' + eventName); + } else console.log(`Invalid Event: ${eventName}`); }, off: (eventName, listener) => { - if (EventList.indexOf(eventName) !== -1) + if (EventList.indexOf(eventName) !== -1) { + console.log(`A listener for ${eventName} is removed`); this.evt_emitter_.off(eventName, listener); - else console.log('Invalid Event: ' + eventName); + } else console.log(`Invalid Event: ${eventName}`); } } - - this.evt_emitter_.on('newListener', function(event, listener) { - console.log('A listener for ' + event + ' has been added'); - }); - - this.evt_emitter_.on('removeListener', function(event, listener) { - console.log('A listener for ' + event + ' has been removed'); - }); } static getManifestFile() { -- 2.7.4 From ffea36eda39711f07b7e87e67bd7b875f6906945 Mon Sep 17 00:00:00 2001 From: YONGMAN SON Date: Mon, 11 Nov 2019 16:28:50 +0900 Subject: [PATCH 08/16] [Migration][WRTJS][vd][bugfix] change url compare code. url : https://review.tizen.org/gerrit/#/c/platform/framework/web/wrtjs/+/216442/ If the page url doesn't change, don't need to reload. But it's being reloaded by a bug. src = http://d2ehepluhe2jv7.cloudfront.net _this.webApplication.mainWindow.getURL() = http://d2ehepluhe2jv7.cloudfront.net/#/ (Compare the loaded url with the url to be loaded. Some special characters make the url different.) Change-Id: I985f7511da5ee861a3edfc321d4ed18aa67dcaad Signed-off-by: YONGMAN SON --- wrt_app/src/runtime.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) mode change 100755 => 100644 wrt_app/src/runtime.js diff --git a/wrt_app/src/runtime.js b/wrt_app/src/runtime.js old mode 100755 new mode 100644 index 6130fcd..19d245b --- a/wrt_app/src/runtime.js +++ b/wrt_app/src/runtime.js @@ -34,6 +34,7 @@ class Runtime { this.sandbox = []; this.webContents = null; this.addonPkgs = []; + this.isTVProfile = (wrt.getPlatformType() === 'product_tv'); var _this = this; app.on('before-quit', function(event) { @@ -148,8 +149,21 @@ class Runtime { let reload = loadInfo.getReload() || _this.webApplication.isAlwaysReload; if (!reload) { - if (src != _this.webApplication.mainWindow.getURL()) - reload = true; + if (_this.isTVProfile) { + console.log(`src = ${src}, app-control uri = ${_this.webApplication.mainWindow.getURL()}`); + const url = require('url'); + let appcontrolUrl = url.parse(src); + let originUrl = url.parse(_this.webApplication.mainWindow.getURL()); + if (appcontrolUrl.protocol !== originUrl.protocol || + appcontrolUrl.host !== originUrl.host || + appcontrolUrl.pathname !== originUrl.pathname) { + reload = true; + } + } else { + if (src != _this.webApplication.mainWindow.getURL()) { + reload = true; + } + } } // handle http://tizen.org/appcontrol/operation/main operation specially. // only menu-screen app can send launch request with main operation. -- 2.7.4 From 2215ad553b94d10a176ea9a613f06d81b896640f Mon Sep 17 00:00:00 2001 From: "k2.nagaraju" Date: Thu, 12 Sep 2019 21:24:55 +0900 Subject: [PATCH 09/16] [Service][UI] Support Web device api Extensions Added support for web device api extensions. Change-Id: I0b79ef9ef5ed8eef8a51052a8f921890970dfcc0 Signed-off-by: k2.nagaraju Signed-off-by: Youngsoo Choi --- wrt_app/service/plugins.json | 52 ++++++++ wrt_app/service/tizen_extension.js | 220 +++++++++++++++++++++++++++++++ wrt_app/service/wrt_service_extension.js | 4 + wrt_app/src/runtime.js | 2 + 4 files changed, 278 insertions(+) create mode 100644 wrt_app/service/plugins.json create mode 100644 wrt_app/service/tizen_extension.js create mode 100644 wrt_app/service/wrt_service_extension.js diff --git a/wrt_app/service/plugins.json b/wrt_app/service/plugins.json new file mode 100644 index 0000000..ba82e28 --- /dev/null +++ b/wrt_app/service/plugins.json @@ -0,0 +1,52 @@ +[ + { + "name":"tizen.filesystem", + "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_filesystem.so", + "entry_points": [] + }, + { + "name":"tizen.messageport", + "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_messageport.so", + "entry_points": [] + }, + { + "name":"tizen", + "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen.so", + "entry_points": [] + }, + { + "name":"tizen.datacontrol", + "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_datacontrol.so", + "entry_points": [] + }, + { + "name":"tizen.application", + "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_application.so", + "entry_points": ["tizen.ApplicationControl","tizen.ApplicationControlData"] + }, + { + "name":"tizen.time", + "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_time.so", + "entry_points": ["tizen.TZDate","tizen.TimeDuration"] + }, + { + "name":"xwalk", + "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_utils.so", + "entry_points": [] + }, + { + "name":"tizen.systeminfo", + "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_systeminfo.so", + "entry_points": [] + }, + { + "name":"tizen.package", + "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_package.so", + "entry_points": [] + }, + { + "name":"tizen.alarm", + "lib":"/usr/lib/tizen-extensions-crosswalk/libtizen_alarm.so", + "entry_points": ["tizen.AlarmRelative","tizen.AlarmAbsolute"] + } +] diff --git a/wrt_app/service/tizen_extension.js b/wrt_app/service/tizen_extension.js new file mode 100644 index 0000000..6e80497 --- /dev/null +++ b/wrt_app/service/tizen_extension.js @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +(function() { +const extension = require('./wrt_service_extension'); +const wrt = require('../browser/wrt'); +var window = global; +var api_ = {}; +var extensions_ = {}; +var runtime_variables_ = {'runtime_name': 'wrt-service'}; + +var ExtensionLoader = function() { + let plugins = require('./plugins.json'); + extension.initialize(runtime_variables_); + + var extensions = extension.getExtensions(); + for (var i = 0; i < extensions.length; i++) { + extensions[i].loaded = false; + for (var idx in plugins) { + if (extensions[i].name === plugins[idx].name) { + console.log("ExtensionLoader name " + extensions[i].name); + extensions_[extensions[i].name] = extensions[i]; + } + } + } + for (var name in extensions_) { + if (!extensions_[name].use_trampoline) { + this.load(extensions_[name]); + } + } + for (var name in extensions_) { + if (extensions_[name].use_trampoline) { + this.installTrampoline(extensions_[name]); + } + } +}; + +ExtensionLoader.prototype = { + /** + * Creates namespace for 'name' in given object. + * Eg. this.createNamespace(GLOBAL, 'tizen.contact') will create: + * GLOBAL.tizen.contact = {} + * + * @param {Object} object + * @param {String} name + */ + createNamespace: function(object, name) { + var obj = object; + var arr = name.split('.'); + for (var i = 0; i < arr.length; i++) { + obj[arr[i]] = obj[arr[i]] || {}; + obj = obj[arr[i]]; + } + }, + exposeApi: function (ext) { + var i, entry_points, entry_point, tmp, parent_name, base_name; + + // additional entry points are installed in GLOBAL context by eval() + // so we need to move it to protected api_ object first + entry_points = [...new Set(ext.entry_points)]; + for (i = 0; i < entry_points.length; i++) { + entry_point = entry_points[i]; + tmp = entry_point.split('.'); + parent_name = tmp[0]; + base_name = tmp[tmp.length - 1]; + + api_[parent_name][base_name] = GLOBAL[parent_name][base_name]; + delete GLOBAL[parent_name][base_name]; + } + + entry_points.push(ext.name); + + for (i = 0; i < entry_points.length; i++) { + entry_point = entry_points[i]; + tmp = entry_point.split('.'); + parent_name = tmp[0]; + base_name = tmp[tmp.length - 1]; + + Object.defineProperty(GLOBAL[parent_name], base_name, { + get: function (parent_name, base_name) { + return function () { + return api_[parent_name][base_name]; + } + }(parent_name, base_name), + configurable: false, + enumerable: true + }); + } + }, + + /** + * @param {Object} ext + */ + load: function(ext) { + if (ext.loaded) { + return; + } + ext.loadInstance(); + + ext.loaded = true; + + this.createNamespace(api_, ext.name); + this.createNamespace(GLOBAL, ext.name); + + var api = (ext.use_trampoline) ? api_ : GLOBAL; + + var jscode = + '(function(extension) {' + + ' extension.internal = {};' + + ' extension.internal.sendSyncMessage = extension.sendSyncMessage;' + + ' delete extension.sendSyncMessage;' + + ' var exports = {}; ' + + ' (function() {\'use strict\'; ' + ext.jsapi + '})();' + + ' api.' + ext.name + ' = exports; ' + + '});'; + + try { + var func = eval(jscode); + func({ + postMessage: function(msg) { + return ext.postMessage(msg); + }, + sendSyncMessage: function(msg) { + return ext.sendSyncMessage(msg); + }, + setMessageListener: function(fn) { + return ext.setMessageListener(fn); + }, + sendRuntimeMessage: function(type, data) { + return runtimeMessageHandler(type, data); + }, + sendRuntimeSyncMessage: function(type, data) { + return runtimeMessageHandler(type, data); + }, + sendRuntimeAsyncMessage: function(type, data, callback) { + return runtimeMessageHandler(type, data, callback); + }, + postData: function(msg, chunk) { + return ext.postData(msg, chunk); + }, + sendSyncData: function(msg, chunk) { + return ext.sendSyncData(msg, chunk); + }, + setDataListener: function(fn) { + return ext.setDataListener(fn); + }, + receiveChunkData: function(id, type) { + return ext.receiveChunkData(id, type); + } + }); + + if (ext.use_trampoline) { + this.exposeApi(ext); + } + } catch (err) { + console.log('Error loading extension "' + ext.name + '": ' + err.message); + } + }, + + /** + * This is used to defer extension loading to it's first usage. + * Eg. First access to tizen.contact will load extension's 'jsapi' through eval(). + * + * @param {Object} ext + */ + installTrampoline: function(ext) { + var entry_points = [...new Set(ext.entry_points)]; + entry_points.push(ext.name); + for (var i = 0; i < entry_points.length; i++) { + var tmp = entry_points[i].split('.'); + var parent_name = tmp[0]; + var base_name = tmp[tmp.length - 1]; + + this.createNamespace(GLOBAL, entry_points[i]); + + Object.defineProperty(GLOBAL[parent_name], base_name, { + get: function (parent_name, base_name) { + return function() { + try { + this.deleteTrampoline(ext); + this.load(ext); + return api_[parent_name][base_name]; + } catch (e) { + console.log(e.stack); + } + }.bind(this); + }.call(this, parent_name, base_name), + enumerable: true + }); + } + }, + + deleteTrampoline: function(ext) { + var entry_points = [...new Set(ext.entry_points)]; + entry_points.push(ext.name); + + for (var i = 0; i < entry_points.length; i++) { + var tmp = entry_points[i].split('.'); + var parent_name = tmp[0]; + var base_name = tmp[tmp.length - 1]; + delete GLOBAL[parent_name][base_name]; + } + } +}; + +new ExtensionLoader(); +})(); diff --git a/wrt_app/service/wrt_service_extension.js b/wrt_app/service/wrt_service_extension.js new file mode 100644 index 0000000..8207706 --- /dev/null +++ b/wrt_app/service/wrt_service_extension.js @@ -0,0 +1,4 @@ +require('../common/exception_handling'); +const wrt_service_extension = process.binding('wrt_service_extension') + +module.exports = wrt_service_extension; diff --git a/wrt_app/src/runtime.js b/wrt_app/src/runtime.js index 19d245b..ca6ebfd 100644 --- a/wrt_app/src/runtime.js +++ b/wrt_app/src/runtime.js @@ -21,6 +21,7 @@ const AddonManager = require('./addon_manager'); const {app, ipcMain} = require('electron'); const IPC_MESSAGE = require('./ipc_message'); const TimerManager = require('../service/timer_manager'); +const TizenExtension = require('../service/tizen_extension'); const WAS_EVENT = require('./was_event'); const WebApplication = require('./web_application'); @@ -207,6 +208,7 @@ class Runtime { console: console, module: new Module, require: require, + tizen: tizen, }; for(let key in global) { _this.sandbox[app_id][key] = global[key]; -- 2.7.4 From 9854cde0cefb948f901f933eea15a3d76f4a460d Mon Sep 17 00:00:00 2001 From: Youngsoo Choi Date: Fri, 8 Nov 2019 11:19:02 +0900 Subject: [PATCH 10/16] [Service][UI] Expose primitives and standard objects The primitives and standard objects are exposed to fix following undefined and type-mismatched errors: > Cannot set property 'setDate' of undefined > Cannot convert 11,21,31,71,81,91 to Uint8Array The list refers to following site: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects Change-Id: Ia4a222b0cf0c5ede3fc67ec7bf77ed435249abd0 Signed-off-by: Youngsoo Choi --- wrt_app/src/runtime.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/wrt_app/src/runtime.js b/wrt_app/src/runtime.js index 4ab808c..7cf447b 100644 --- a/wrt_app/src/runtime.js +++ b/wrt_app/src/runtime.js @@ -216,6 +216,19 @@ class Runtime { for(let key in timer_api) { _this.sandbox[app_id][key] = timer_api[key]; } + let standard_object_list = [ Error, EvalError, RangeError, ReferenceError, + SyntaxError, TypeError, URIError, Number, BigInt, Math, Date, + String, RegExp, Array, Int8Array, Uint8Array, Uint8ClampedArray, + Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, + Float64Array, BigInt64Array, BigUint64Array, Map, Set, WeakMap, + WeakSet, ArrayBuffer, DataView, JSON, Promise, Reflect, Proxy, + Intl, Intl.Collator, Intl.DateTimeFormat, Intl.NumberFormat, Intl.PluralRules, + WebAssembly, WebAssembly.Module, WebAssembly.Instance, WebAssembly.Memory, + WebAssembly.Table, WebAssembly.CompileError, WebAssembly.LinkError, + WebAssembly.RuntimeError, Boolean, Function, Object, Symbol ]; + for (let idx in standard_object_list) { + _this.sandbox[app_id][standard_object_list[idx].name] = standard_object_list[idx]; + } let options = {}; let code = fs.readFileSync(params[1]); vm.runInNewContext(code, _this.sandbox[app_id], options); -- 2.7.4 From 79bf5d968f1bfc7de05086cd78280759cb1e2265 Mon Sep 17 00:00:00 2001 From: Aron kim Date: Thu, 29 Aug 2019 01:33:36 -0700 Subject: [PATCH 11/16] Revert "Set default background color for product wearable." Change the default background color black to white again. This reverts commit 457b861449738f2e5406c75e94909e4e3aeb6184. Change-Id: Id8b899b24f6daccd442df43d0fd97ad5cf543835 Signed-off-by: Aron kim --- wrt_app/src/web_application.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wrt_app/src/web_application.js b/wrt_app/src/web_application.js index 4a2d804..289f238 100755 --- a/wrt_app/src/web_application.js +++ b/wrt_app/src/web_application.js @@ -55,8 +55,7 @@ class WebApplication { this.loadFinished = false; this.runningStatus = 'none'; this.isTVProfile = (wrt.getPlatformType() === "product_tv"); - this.defaultBackgroundColor = (this.isTVProfile - || (wrt.getPlatformType() === "product_wearable") ? '#000' : '#FFF'); + this.defaultBackgroundColor = (this.isTVProfile ? '#000' : '#FFF'); this.defaultTransparent = (this.isTVProfile ? true : false); this.addonEmitter = null; -- 2.7.4 From 39a11707a6f4b73cc1c90b64eed10861f18f8401 Mon Sep 17 00:00:00 2001 From: Aron kim Date: Thu, 29 Aug 2019 01:33:36 -0700 Subject: [PATCH 12/16] Revert "Set default background color for product wearable." Change the default background color black to white again. This reverts commit 457b861449738f2e5406c75e94909e4e3aeb6184. Change-Id: I4a879271d6f24bd0ef86d0fd23bdeebe3a2da513 Signed-off-by: Aron kim --- wrt_app/src/web_application.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wrt_app/src/web_application.js b/wrt_app/src/web_application.js index 4a2d804..289f238 100755 --- a/wrt_app/src/web_application.js +++ b/wrt_app/src/web_application.js @@ -55,8 +55,7 @@ class WebApplication { this.loadFinished = false; this.runningStatus = 'none'; this.isTVProfile = (wrt.getPlatformType() === "product_tv"); - this.defaultBackgroundColor = (this.isTVProfile - || (wrt.getPlatformType() === "product_wearable") ? '#000' : '#FFF'); + this.defaultBackgroundColor = (this.isTVProfile ? '#000' : '#FFF'); this.defaultTransparent = (this.isTVProfile ? true : false); this.addonEmitter = null; -- 2.7.4 From 42571e6378614f6046e63094af61886177e56802 Mon Sep 17 00:00:00 2001 From: "surya.kumar7" Date: Tue, 5 Nov 2019 18:23:04 +0530 Subject: [PATCH 13/16] [Addon] Handle exceptions and errors thrown from add-ons code 1. Node's event emitter doesn't execute listener code in a safe environment which means if an add-on code encounters an unhandled exception, all the other add-ons which registered later than this, will be deprived of execution 2. A mapping relationship between an event we emit & a dedicated add-on callback function is established 3. Limit a listener to be added as callback only once Change-Id: I42c989cbe5bac753e875aa74e42afc5c5e35bd90 Signed-off-by: surya.kumar7 --- wrt_app/src/addon_manager.js | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/wrt_app/src/addon_manager.js b/wrt_app/src/addon_manager.js index a156fa7..caef34a 100644 --- a/wrt_app/src/addon_manager.js +++ b/wrt_app/src/addon_manager.js @@ -45,6 +45,7 @@ class AddonManager { this.addons_list_ = null; this.addons_ = null; this.evt_emitter_ = null; + this.addons_listeners = {}; } registerAPIModule() { @@ -192,19 +193,34 @@ class AddonManager { } initEventListener() { + const getSafeFunction = function(fn) { + return function() { + try { + fn.apply(this, arguments); + } catch (err) { + console.log(`Exception from add-on: ${err.name} - ${err.message}`); + } + } + } this.evt_emitter_ = new EventEmitter(); this.wrappedEventEmitter = { on: (eventName, listener) => { - if (EventList.indexOf(eventName) !== -1) { + if (EventList.indexOf(eventName) === -1) { + console.log(`Invalid Event: ${eventName}`); + } else if (!this.addons_listeners[listener]) { console.log(`A new listener for ${eventName} is added`); - this.evt_emitter_.on(eventName, listener); - } else console.log(`Invalid Event: ${eventName}`); + this.addons_listeners[listener] = getSafeFunction(listener); + this.evt_emitter_.on(eventName, this.addons_listeners[listener]); + } else console.log('Listener is already registered'); }, off: (eventName, listener) => { - if (EventList.indexOf(eventName) !== -1) { + if (EventList.indexOf(eventName) === -1) { + console.log(`Invalid Event: ${eventName}`); + } else if (this.addons_listeners[listener]) { console.log(`A listener for ${eventName} is removed`); - this.evt_emitter_.off(eventName, listener); - } else console.log(`Invalid Event: ${eventName}`); + this.evt_emitter_.off(eventName, this.addons_listeners[listener]); + delete this.addons_listeners[listener]; + } else console.log('Listener is not registered'); } } } -- 2.7.4 From 32b753ce3020bef7685146524152c30f4d72b357 Mon Sep 17 00:00:00 2001 From: geuneonpark Date: Tue, 12 Nov 2019 15:28:54 +0900 Subject: [PATCH 14/16] [WRTjs] Showing detailed error cause in certificate error popup When a certificate problem occurs in a WebApp, the popup shows a detailed error cause. This patch is requested by Security team and related to: https://review.tizen.org/gerrit/217498/ Change-Id: I18565d3a85771f43d79d6526bcef1a39ea472a47 Signed-off-by: geuneonpark --- wrt_app/src/web_application.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrt_app/src/web_application.js b/wrt_app/src/web_application.js index 02db6ed..5feb064 100755 --- a/wrt_app/src/web_application.js +++ b/wrt_app/src/web_application.js @@ -112,7 +112,7 @@ class WebApplication { const id = ++self.pendingID; console.log(`Raising a certificate error response with id: ${id}`); self.pendingCallbacks.set(id, callback); - wrt.handleCertificateError(id, webContents, certificate.data, url); + wrt.handleCertificateError(id, webContents, certificate.data, url, error); } else { console.log('Certificate could not be opened'); callback(false); -- 2.7.4 From 64a62eb26a4a0f0d2ce149bd8fdf74f0bf5600ad Mon Sep 17 00:00:00 2001 From: "surya.kumar7" Date: Thu, 14 Nov 2019 15:45:42 +0530 Subject: [PATCH 15/16] [Add-on] Improve the approach to obtain db name for 'options' module 1. Options API shouldn't depend on the 'name' parameter to identify the DB file to use. Instead track in the call stack to identify the package ID of the add-on app using it 2. Cleaned up the add-on modules loading implementation Change-Id: I4008a7ac81e6711efdeb9c1ff2a3c988ffa40d19 Signed-off-by: surya.kumar7 --- wrt_app/addon/browser/addonapi.js | 16 ++---- wrt_app/addon/browser/module-list.js | 1 - wrt_app/addon/browser/modules/options.js | 36 -------------- wrt_app/addon/common/addonapi.js | 24 +++++++++ wrt_app/addon/common/module-list.js | 6 +++ wrt_app/addon/common/modules/options.js | 58 ++++++++++++++++++++++ wrt_app/addon/common/utils.js | 20 ++++++++ wrt_app/addon/renderer/addonapi.js | 16 ++---- .../apreload.js => common/config-search-paths.js} | 4 +- wrt_app/renderer/init.js | 1 + wrt_app/src/addon_manager.js | 14 ------ wrt_app/src/main.js | 1 + wrt_app/src/web_application.js | 4 +- 13 files changed, 122 insertions(+), 79 deletions(-) delete mode 100644 wrt_app/addon/browser/modules/options.js create mode 100644 wrt_app/addon/common/addonapi.js create mode 100644 wrt_app/addon/common/module-list.js create mode 100644 wrt_app/addon/common/modules/options.js create mode 100644 wrt_app/addon/common/utils.js rename wrt_app/{addon/renderer/apreload.js => common/config-search-paths.js} (72%) diff --git a/wrt_app/addon/browser/addonapi.js b/wrt_app/addon/browser/addonapi.js index 4a90338..ea6340b 100644 --- a/wrt_app/addon/browser/addonapi.js +++ b/wrt_app/addon/browser/addonapi.js @@ -1,20 +1,12 @@ 'use strict'; -const moduleList = require('./module-list'); - -const memoizedGetter = (getter) => { - let memoizedValue = null; +const common = require('../common/addonapi'); +common.defineProperties(exports); - return () => { - if (memoizedValue === null) { - memoizedValue = getter(); - } - return memoizedValue; - } -} +const moduleList = require('./module-list'); for (const module of moduleList) { Object.defineProperty(exports, module.name, { - get: memoizedGetter(() => require(`./modules/${module.file}.js`)) + get: common.memoizedGetter(() => require(`./modules/${module.file}`)) }); } diff --git a/wrt_app/addon/browser/module-list.js b/wrt_app/addon/browser/module-list.js index b213e0a..63cf2c8 100644 --- a/wrt_app/addon/browser/module-list.js +++ b/wrt_app/addon/browser/module-list.js @@ -3,6 +3,5 @@ // Browser side add-on modules, please sort alphabetically module.exports = [ { name: 'messaging', file: 'messaging' }, - { name: 'options', file: 'options' }, { name: 'window', file: 'window' } ] diff --git a/wrt_app/addon/browser/modules/options.js b/wrt_app/addon/browser/modules/options.js deleted file mode 100644 index 75e0d51..0000000 --- a/wrt_app/addon/browser/modules/options.js +++ /dev/null @@ -1,36 +0,0 @@ -'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 diff --git a/wrt_app/addon/common/addonapi.js b/wrt_app/addon/common/addonapi.js new file mode 100644 index 0000000..96a7c8c --- /dev/null +++ b/wrt_app/addon/common/addonapi.js @@ -0,0 +1,24 @@ +'use strict'; + +const moduleList = require('./module-list'); + +exports.memoizedGetter = (getter) => { + let memoizedValue = null; + + return () => { + if (memoizedValue === null) { + memoizedValue = getter(); + } + return memoizedValue; + } +} + +exports.defineProperties = function (targetExports) { + const descriptors = {}; + for (const module of moduleList) { + descriptors[module.name] = { + get: exports.memoizedGetter(() => require(`./modules/${module.file}`)) + } + } + return Object.defineProperties(targetExports, descriptors); +} diff --git a/wrt_app/addon/common/module-list.js b/wrt_app/addon/common/module-list.js new file mode 100644 index 0000000..fc16071 --- /dev/null +++ b/wrt_app/addon/common/module-list.js @@ -0,0 +1,6 @@ +'use strict'; + +// Common add-on modules, please sort alphabetically +module.exports = [ + { name: 'options', file: 'options' } +]; diff --git a/wrt_app/addon/common/modules/options.js b/wrt_app/addon/common/modules/options.js new file mode 100644 index 0000000..b4366ac --- /dev/null +++ b/wrt_app/addon/common/modules/options.js @@ -0,0 +1,58 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const utils = require('../utils'); + +const REPO_PATH = path.join(require('os').homedir(), 'data/electron/runtime_addon/'); +const DB_FILE = '_db.json'; + +module.exports = { + get: function (key) { + const addon_name = utils.getPackageID(); + if (!addon_name) { + console.error(`Package ID not found`); + return undefined; + } + const DB_PATH = REPO_PATH + addon_name + DB_FILE; + console.log(`DB_PATH: ${DB_PATH}`); + 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}`); + return undefined; + } + }, + + set: function (key, value) { + const addon_name = utils.getPackageID(); + if (!addon_name) { + console.error(`Package ID not found`); + return false; + } + const DB_PATH = REPO_PATH + addon_name + DB_FILE; + console.log(`DB_PATH: ${DB_PATH}`); + try { + let jsonObject; + try { + const fileContents = fs.readFileSync(DB_PATH); + jsonObject = JSON.parse(fileContents); + console.log(`Current value: ${JSON.stringify(jsonObject)}`); + } catch { + console.log(`Add-on DB file doesn't exist`); + jsonObject = {}; + } + jsonObject[key] = value; + console.log(`New value: ${JSON.stringify(jsonObject)}`); + const jsonString = JSON.stringify(jsonObject); + fs.writeFileSync(DB_PATH, jsonString); + return true; + } catch (err) { + console.log(`An error has occurred: ${err}`); + return false; + } + } +} \ No newline at end of file diff --git a/wrt_app/addon/common/utils.js b/wrt_app/addon/common/utils.js new file mode 100644 index 0000000..76048d0 --- /dev/null +++ b/wrt_app/addon/common/utils.js @@ -0,0 +1,20 @@ +const keyTerm = 'globalapps'; +const delimiter = '/'; + +function extractID(line) { + let keyTermAt = line.search(keyTerm); + let delimiterAt = line.indexOf(delimiter, keyTermAt); + return line.substr(delimiterAt + 1, 10); +} + +module.exports = { + getPackageID() { + let stack = new Error().stack; + stack = stack.split('\n'); + for (let i = 0; i < stack.length; ++i) { + if (stack[i].indexOf(keyTerm) !== -1) + return extractID(stack[i]); + } + return ''; + } +} \ No newline at end of file diff --git a/wrt_app/addon/renderer/addonapi.js b/wrt_app/addon/renderer/addonapi.js index 4a90338..ea6340b 100644 --- a/wrt_app/addon/renderer/addonapi.js +++ b/wrt_app/addon/renderer/addonapi.js @@ -1,20 +1,12 @@ 'use strict'; -const moduleList = require('./module-list'); - -const memoizedGetter = (getter) => { - let memoizedValue = null; +const common = require('../common/addonapi'); +common.defineProperties(exports); - return () => { - if (memoizedValue === null) { - memoizedValue = getter(); - } - return memoizedValue; - } -} +const moduleList = require('./module-list'); for (const module of moduleList) { Object.defineProperty(exports, module.name, { - get: memoizedGetter(() => require(`./modules/${module.file}.js`)) + get: common.memoizedGetter(() => require(`./modules/${module.file}`)) }); } diff --git a/wrt_app/addon/renderer/apreload.js b/wrt_app/common/config-search-paths.js similarity index 72% rename from wrt_app/addon/renderer/apreload.js rename to wrt_app/common/config-search-paths.js index ebb0d73..f059b43 100644 --- a/wrt_app/addon/renderer/apreload.js +++ b/wrt_app/common/config-search-paths.js @@ -1,8 +1,10 @@ 'use strict'; -const ADDONS_PATH = require('path').join(__dirname, 'addonapi.js'); +const path = require('path'); const Module = require('module'); const originalResolveFilename = Module._resolveFilename; +const ADDONS_PATH = path.join(__dirname, '..', 'addon', process.type, 'addonapi.js'); + Module._resolveFilename = function (request, parent, isMain) { if (request === 'addonapi') { return ADDONS_PATH; diff --git a/wrt_app/renderer/init.js b/wrt_app/renderer/init.js index 57f2e92..f0265e3 100755 --- a/wrt_app/renderer/init.js +++ b/wrt_app/renderer/init.js @@ -15,5 +15,6 @@ */ require('../common/exception_handling'); +require('../common/config-search-paths'); const wrtRenderer = require('./wrt_renderer'); require(wrtRenderer.getElectronPath() + '/renderer/init') diff --git a/wrt_app/src/addon_manager.js b/wrt_app/src/addon_manager.js index a156fa7..6449606 100644 --- a/wrt_app/src/addon_manager.js +++ b/wrt_app/src/addon_manager.js @@ -22,7 +22,6 @@ const ADN_PATH = 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 const EventList = [ @@ -41,24 +40,11 @@ const {EventEmitter} = require('events'); class AddonManager { constructor() { - this.registerAPIModule(); this.addons_list_ = null; this.addons_ = null; this.evt_emitter_ = null; } - 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) { if (!db_path) { db_path = path.join(ADN_PATH, ADDONS_DB_FILE); diff --git a/wrt_app/src/main.js b/wrt_app/src/main.js index ae0de87..e334120 100755 --- a/wrt_app/src/main.js +++ b/wrt_app/src/main.js @@ -17,6 +17,7 @@ 'use strict'; require('../common/exception_handling'); +require('../common/config-search-paths'); new (require('./runtime'))({ devMode: false, diff --git a/wrt_app/src/web_application.js b/wrt_app/src/web_application.js index 289f238..1a1b186 100755 --- a/wrt_app/src/web_application.js +++ b/wrt_app/src/web_application.js @@ -21,7 +21,6 @@ const WAS_EVENT = require('./was_event'); 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) { @@ -215,8 +214,7 @@ class WebApplication { show: false, webPreferences: { nodeIntegration: options.isAddonAvailable, - nodeIntegrationInWorker: false, - preload: (options.isAddonAvailable) ? PRELOAD_PATH : undefined + nodeIntegrationInWorker: false }, webContents: WRTWebContents.create(), 'web-preferences': { -- 2.7.4 From eecec35ac56312dfed4078b98d58ee59a304c2d6 Mon Sep 17 00:00:00 2001 From: Youngsoo Choi Date: Mon, 18 Nov 2019 20:59:09 -0800 Subject: [PATCH 16/16] [Public] Make not to modify gbs.conf when tizen version is upgraded Whenever the latest tizen version is released, gbs.conf has been modified to add new repositories. It was painful routine. With this changes, the gbs.conf doesn't need to be modified anymore and all we have to do is just setting |DEFAULT_TIZEN_VERSION| to proper version in common.sh like below. > export DEFAULT_TIZEN_VERSION=5.5 Change-Id: I7c288d221d2d7eb3eba5cf4eb7894c24f6ffea6e Signed-off-by: Youngsoo Choi --- .gitignore | 1 + tizen/build/common.sh | 43 ++++----- tizen/build/gbs.conf | 237 ------------------------------------------------ tizen/build/gbs.conf.in | 160 ++++++++++++++++++++++++++++++++ 4 files changed, 180 insertions(+), 261 deletions(-) create mode 100644 .gitignore delete mode 100755 tizen/build/gbs.conf create mode 100755 tizen/build/gbs.conf.in diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5188e93 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/tizen/build/gbs.conf diff --git a/tizen/build/common.sh b/tizen/build/common.sh index 48f06e2..dd94659 100644 --- a/tizen/build/common.sh +++ b/tizen/build/common.sh @@ -6,7 +6,7 @@ export CHROME_SRC="${TOPDIR}" # Please set DEFAULT_TIZEN_VERSION to empty value for the latest tizen version # or set DEFAULT_TIZEN_VERSION to current tizen version for the others. -export DEFAULT_TIZEN_VERSION=latest +export DEFAULT_TIZEN_VERSION=5.5 if [ "$(echo "$@" | grep -e "--tizen")" != "" ]; then tizen_version=$(echo $@ | sed -e 's#.*--tizen_\([0-9.]*\).*#\1#') @@ -17,6 +17,14 @@ if [ "$(echo "$@" | grep -e "--tizen")" != "" ]; then fi fi +# Generate gbs.conf +export REPO_VERSION= +if [ "$(echo $DEFAULT_TIZEN_VERSION)" != "latest" ]; then + REPO_VERSION=$DEFAULT_TIZEN_VERSION- +fi +sed -e "s/@TIZEN_VERSION@/$REPO_VERSION/g" \ + tizen/build/gbs.conf.in > tizen/build/gbs.conf + function setupAndExecuteTargetBuild() { local platform="$1" shift @@ -36,19 +44,10 @@ function setupAndExecuteTargetBuild() { count=$(( $count + 1 )) case "$1" in --standard*) - if [ "$DEFAULT_TIZEN_VERSION" == "latest" ]; then - echo $1 - PROFILE=tz_$(echo $1 | sed 's/--//g') - else - PROFILE=tz_${DEFAULT_TIZEN_VERSION}_$(echo $1 | sed 's/--//g') - fi + PROFILE=tz_$(echo $1 | sed 's/--//g') ;; --emulator*) - if [ "$DEFAULT_TIZEN_VERSION" == "latest" ]; then - PROFILE=tz_$(echo $1 | sed 's/--//g') - else - PROFILE=tz_${DEFAULT_TIZEN_VERSION}_$(echo $1 | sed 's/--//g') - fi + PROFILE=tz_$(echo $1 | sed 's/--//g') ;; --tizen*) ;; @@ -61,12 +60,16 @@ function setupAndExecuteTargetBuild() { if [ "$PROFILE" == "" ]; then if [[ $platform == "tv" ]]; then - if [ "$DEFAULT_TIZEN_VERSION" == "latest" ]; then + if [ "$DEFAULT_TIZEN_VERSION" == "5.5" ]; then # FIXME: The latest version of platform hasn't been released yet. PROFILE=tztv_5.5_arm-musem fi + elif [[ $platform == "da" ]]; then + if [ "$DEFAULT_TIZEN_VERSION" == "5.5" ]; then + PROFILE=tzda_5.5_arm-kantm + fi elif [[ $platform == "wearable" ]]; then - if [ "$DEFAULT_TIZEN_VERSION" == "latest" ]; then + if [ "$DEFAULT_TIZEN_VERSION" == "5.5" ]; then PROFILE=tzwr_5.5_armv7l_spin fi else @@ -82,17 +85,9 @@ function setupAndExecuteTargetBuild() { echo "Set the profile : $PROFILE" if [ "$ARCHITECTURE" == "" ]; then - if [[ $platform == "mobile" ]]; then - ARCHITECTURE=armv7l - elif [[ $platform == "tv" ]]; then - ARCHITECTURE=armv7l - elif [[ $platform == "wearable" ]]; then - ARCHITECTURE=armv7l - else - echo "Cannot set default ARCHITECTURE for platform=${platform}" - exit 1 - fi + ARCHITECTURE=armv7l fi + echo "Set the architecture : $ARCHITECTURE" local BRANCH=$(echo $(basename $(git symbolic-ref HEAD))) diff --git a/tizen/build/gbs.conf b/tizen/build/gbs.conf deleted file mode 100755 index f2bbd0c..0000000 --- a/tizen/build/gbs.conf +++ /dev/null @@ -1,237 +0,0 @@ -############################################### -# -# Tizen v5.5 public unified -# -[obs.tizen] -url = https://api.tizen.org - -[repo.tz_standard] -url = http://download.tizen.org/snapshots/tizen/unified/latest/repos/standard/packages/ - -[repo.tz_standard] -url = http://download.tizen.org/snapshots/tizen/unified/latest/repos/standard/packages/ - -[repo.tz_standard_mirror] -url = http://10.113.136.32/download/public_mirror/tizen/unified/latest/repos/standard/packages/ -user = blinkbot -passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== - -[repo.tz_emulator] -url = http://download.tizen.org/snapshots/tizen/unified/latest/repos/emulator/packages/ - -[repo.tz_emulator_mirror] -url = http://10.113.136.32/download/public_mirror/tizen/unified/latest/repos/emulator/packages/ -user = blinkbot -passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== - -[repo.public_base_standard] -url = http://download.tizen.org/snapshots/tizen/base/latest/repos/standard/packages/ - -[repo.public_base_standard] -url = http://download.tizen.org/snapshots/tizen/base/latest/repos/standard/packages/ - -[repo.public_base_standard_mirror] -url = http://10.113.136.32/download/public_mirror/tizen/base/latest/repos/standard/packages/ -user = blinkbot -passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== - -############################################### -# -# Tizen v5.5 public standard -# -[profile.tz_standard] -obs = obs.tizen -repos = repo.public_base_standard, repo.tz_standard -buildroot = ~/GBS-ROOT-STANDARD - -############################################### -# -# Tizen v5.0 public unified -# -[obs.tizen] -url = https://api.tizen.org - -[repo.tz_5.0_standard] -url = http://download.tizen.org/snapshots/tizen/5.0-unified/latest/repos/standard/packages/ - -[repo.tz_5.0_standard_mirror] -url = http://10.113.136.32/download/public_mirror/tizen/5.0-unified/latest/repos/standard/packages/ -user = blinkbot -passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== - -[repo.tz_5.0_emulator] -url = http://download.tizen.org/snapshots/tizen/5.0-unified/latest/repos/emulator/packages/ - -[repo.tz_5.0_emulator_mirror] -url = http://10.113.136.32/download/public_mirror/tizen/5.0-unified/latest/repos/emulator/packages/ -user = blinkbot -passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== - -[repo.public_5.0_base_standard] -url = http://download.tizen.org/snapshots/tizen/5.0-base/latest/repos/standard/packages/ - -[repo.public_5.0_base_standard_mirror] -url = http://10.113.136.32/download/public_mirror/tizen/5.0-base/latest/repos/standard/packages/ -user = blinkbot -passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== - -############################################### -# -# Tizen v5.5 spin Wearable -# -[obs.spin_5.5] -url = http://10.113.136.201 - -[repo.wearable_product_5.5_armv7l] -url = http://165.213.149.200/download/snapshots/tizen/tizen-wearable-R800/latest/repos/standard/packages/ -user = blinkbot -passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== - -[repo.wearable_product_5.5_base] -url = http://165.213.149.200/download/snapshots/tizen/base-wearable/latest/repos/standard/packages/ -user = blinkbot -passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== - -############################################### -# -# Tizen v5.5 spin Wearable (armv7l) -# -[profile.tzwr_5.5_armv7l_spin] -obs = obs.spin -repos = repo.wearable_product_5.5_base, repo.wearable_product_5.5_armv7l -buildroot = ~/GBS-ROOT-5.0-WEARABLE-PRODUCT-ARMV7L - -############################################### -# -# Tizen v5.0 spin -# -[obs.spin] -url = http://10.113.136.204:81 - -[repo.tz_standard_armv7hl] -url = http://10.113.136.32/download/newlive/devel:/Toolchains:/Unified:/ref:/hardfp/standard -user = blinkbot -passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== - -[repo.spin_5.0_base_armv7hl] -url = http://10.113.136.32/download/newlive/devel:/Toolchains:/Base:/ref:/hardfp/standard -user = blinkbot -passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== - -############################################### -# -# Tizen v5.0 spin (armv7hl) -# -[profile.tz_5.0_standard_armv7hl] -obs = obs.spin -repos = repo.spin_5.0_base_armv7hl, repo.tz_standard_armv7hl -buildroot = ~/GBS-ROOT-5.0-STANDARD-ARMV7HL - -############################################### -# -# Tizen v5.0 public standard -# -[profile.tz_5.0_standard] -obs = obs.tizen -repos = repo.public_5.0_base_standard, repo.tz_5.0_standard -buildroot = ~/GBS-ROOT-5.0-STANDARD - -############################################### -# -# Tizen v5.0 public standard, Mirroring Server for HQ developers -# -[profile.tz_5.0_standard_mirror] -obs = obs.tizen -repos = repo.public_5.0_base_standard_mirror, repo.tz_5.0_standard_mirror -buildroot = ~/GBS-ROOT-5.0-STANDARD - -############################################### -# -# Tizen v5.0 public emulator -# -[profile.tz_5.0_emulator] -obs = obs.tizen -repos = repo.public_5.0_base_standard, repo.tz_5.0emulator -buildroot = ~/GBS-ROOT-5.0-EMULATOR - -############################################### -# -# Tizen v5.0 public emulator, Mirroring Server for HQ developers -# -[profile.tz_5.0_emulator_mirror] -obs = obs.tizen -repos = repo.public_5.0_base_standard, repo.tz_emulator_mirror -buildroot = ~/GBS-ROOT-5.0-EMULATOR - -############################################### -# -# Tizen product tv -# -[obs.tizen_product_tv] -url = https://168.219.243.64/api -user = obs_iewer -passwdx = obs_iewer_64 - -############################################# -# -# Tizen v5.5 for product tv (MuseM armv7l) -# -[profile.tztv_5.5_arm-musem] -obs = obs.tizen_product_tv -repos = repo.tv_product_5.5_base, repo.tv_product_5.5_musem -buildroot = ~/GBS-ROOT-5.5-TV-PRODUCT-MUSEM - -[repo.tv_product_5.5_base] -url = http://10.113.136.32/download_trbs/snapshots/tizen/5.5-vd-base/latest/repos/standard/packages/ -user = blinkbot -passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== - -[repo.tv_product_5.5_musem] -url = http://10.113.136.26/snapshots/VD/Tizen-5.5/MAIN2019-MuseM/latest/repos/MuseM/packages/ -user = blinkbot -passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== - -############################################# -# -# Tizen v5.0 for product tv (MuseM armv7l) -# -[profile.tztv_5.0_arm-musem] -obs = obs.tizen_product_tv -repos = repo.tv_product_5.0_musem, repo.tv_product_5.0_base -buildroot = ~/GBS-ROOT-5.0-TV-PRODUCT-MUSEM - -[repo.tv_product_5.0_base] -url = http://168.219.244.109/base/tizen-5.0-base-main2019/standard/latest/ - -[repo.tv_product_5.0_musem] -url = http://168.219.244.109/products/tv/archive/2019/MAIN2019/MuseM/latest/ - -############################################# -# -# Tizen v5.0 for product tv (KantM2 armv7l) -# -[profile.tztv_5.0_arm-kantm2] -obs = obs.tizen_product_tv -repos = repo.tv_product_5.0_kantm2, repo.tv_product_5.0_base -buildroot = ~/GBS-ROOT-5.0-TV-PRODUCT-KANTM2 - -[repo.tv_product_5.0_base] -url = http://168.219.244.109/base/tizen-5.0-base-main2019/standard/latest/ - -[repo.tv_product_5.0_kantm2] -url = http://168.219.244.109/products/tv/archive/2019/MAIN2019/KantM2_ATSC/latest/ - -############################################# -# -# Tizen v5.0 for product tv (KantM armv7l) -# -[profile.tztv_5.0_arm-kantm] -obs = obs.tizen_product_tv -repos = repo.tv_product_5.0_kantm, repo.tv_product_5.0_base -buildroot = ~/GBS-ROOT-5.0-TV-PRODUCT-KANTM - -[repo.tv_product_5.0_base] -url = http://168.219.244.109/base/tizen-5.0-base-main2019/standard/latest - -[repo.tv_product_5.0_kantm] -url = http://168.219.244.109/hijacks/PRECEDENCE/PRE_5.0MIGRATION-KantM/latest/ diff --git a/tizen/build/gbs.conf.in b/tizen/build/gbs.conf.in new file mode 100755 index 0000000..7a5254e --- /dev/null +++ b/tizen/build/gbs.conf.in @@ -0,0 +1,160 @@ +############################################### +# +# The Tizen public unified +# +[obs.tizen] +url = https://api.tizen.org + +[repo.tz_standard] +url = http://download.tizen.org/snapshots/tizen/@TIZEN_VERSION@unified/latest/repos/standard/packages/ + +[repo.tz_emulator] +url = http://download.tizen.org/snapshots/tizen/@TIZEN_VERSION@unified/latest/repos/emulator/packages/ + +[repo.public_base_standard] +url = http://download.tizen.org/snapshots/tizen/@TIZEN_VERSION@base/latest/repos/standard/packages/ + +############################################### +# +# The Tizen public unified (mirror) +# +[repo.tz_standard_mirror] +url = http://165.213.149.200/download/public_mirror/tizen/unified/latest/repos/standard/packages/ +user = blinkbot +passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== + +[repo.tz_emulator_mirror] +url = http://165.213.149.200/download/public_mirror/tizen/unified/latest/repos/emulator/packages/ +user = blinkbot +passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== + +[repo.public_base_standard_mirror] +url = http://165.213.149.200/download/public_mirror/tizen/base/latest/repos/standard/packages/ +user = blinkbot +passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== + +############################################### +# +# Tizen v5.5 spin Wearable +# +[obs.spin_5.5] +url = http://10.113.136.201 + +[repo.wearable_product_5.5] +url = http://165.213.149.200/download/snapshots/tizen/tizen-wearable-R800/latest/repos/standard/packages/ + +[repo.wearable_product_5.5_base] +url = http://165.213.149.200/download/snapshots/tizen/base-wearable/latest/repos/standard/packages/ + +############################################### +# +# The Tizen public standard +# +[profile.tz_standard] +obs = obs.tizen +repos = repo.public_base_standard, repo.tz_standard +buildroot = ~/GBS-ROOT-M69-TZ_STANDARD + +############################################### +# +# The Tizen public emulator +# +[profile.tz_emulator] +obs = obs.tizen +repos = repo.public_base_standard, repo.tz_emulator +buildroot = ~/GBS-ROOT-M69-TZ_EMULATOR + +############################################### +# +# The Tizen public standard, Mirroring Server for HQ developers +# +[profile.tz_standard_mirror] +obs = obs.tizen +repos = repo.public_base_standard_mirror, repo.tz_standard_mirror +buildroot = ~/GBS-ROOT-M69-TZ_STANDARD-TIZEN_LATEST-RELEASE + +############################################### +# +# The Tizen public emulator, Mirroring Server for HQ developers +# +[profile.tz_emulator_mirror] +obs = obs.tizen +repos = repo.public_base_standard, repo.tz_emulator_mirror +buildroot = ~/GBS-ROOT-M69-TZ_EMULATOR-TIZEN_LATEST-RELEASE + +############################################### +# +# Tizen v5.5 spin Wearable (armv7l) +# +[profile.tzwr_5.5_spin] +obs = obs.spin +repos = repo.wearable_product_5.5_base, repo.wearable_product_5.5 +buildroot = ~/GBS-ROOT-M69-TZWR_5.5_SPIN-TIZEN_LATEST-RELEASE +user = blinkbot +passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== + +############################################### +# +# Tizen v5.5 product DA +# +#DA Family Hub 5.0 kantm +[repo.da_product_5.5_fhub_kantm] +url = http://10.113.136.26/snapshots/DA/Tizen-5.5/Tizen-5.5-DA-FHUB5/latest/repos/KANTM/packages/ + +#Tizen 5.5 Base +[repo.da_product_5.5_base] +url = http://download.tizen.org/snapshots/tizen/base/latest/repos/standard/packages/ + +############################################### +# +# Tizen v5.5 product DA (armv7l) +# +[profile.tzda_5.5_arm-kantm] +repos = repo.da_product_5.5_base, repo.da_product_5.5_fhub_kantm +buildroot = ~/GBS-ROOT-M63-TZDA_ARM-KANTM-TIZEN_LATEST-RELEASE +user = blinkbot +passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== + +############################################### +# +# Tizen product tv +# +[obs.tizen_product_tv] +url = https://168.219.243.64/api + +############################################### +# +# Tizen v5.5 for product tv (MuseM armv7l) +# +[profile.tztv_5.5_arm-musem] +obs = obs.tizen_product_tv +repos = repo.tv_product_5.5_base, repo.tv_product_5.5_musem +buildroot = ~/GBS-ROOT-5.5-TV-PRODUCT-MUSEM + +[repo.tv_product_5.5_base] +url = http://10.113.136.32/download_trbs/snapshots/tizen/5.5-vd-base/latest/repos/standard/packages/ +user = blinkbot +passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== + +[repo.tv_product_5.5_musem] +url = http://10.113.136.26/snapshots/VD/Tizen-5.5/MAIN2019-MuseM/latest/repos/MuseM/packages/ +user = blinkbot +passwdx = QlpoOTFBWSZTWd0JOhUAAACBAABgIAAhAIIjF3JFOFCQ3Qk6FQ== + +############################################### +# +# Tizen v5.5 for product tv (Emulator) +# +[obs.tizentv] +url = https://168.219.243.64/api + +[profile.tztv_5.5_emulator] +obs = obs.tizentv +repos = repo.product_2018_Emulator, repo.base_2018 +buildroot = ~/GBS-ROOT-5.5-TV-PRODUCT-EMULATOR + +[repo.base_2018] +url=http://168.219.245.245/base/tizen-5.5-base-main/emulator32/latest/repos/base/ia32/packages/ + +[repo.product_2018_Emulator] +url=http://168.219.245.245/products/tv/archive/2020/ONEMAIN/emulator32/latest/repos/product/ia32/packages/ -- 2.7.4