From: SangYong Park Date: Wed, 8 Jan 2020 01:21:54 +0000 (+0900) Subject: Support m76 migration X-Git-Tag: submit/tizen_5.5/20200204.072340~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=914215082980ba95959e8f54d5a32582039cb696;p=platform%2Fframework%2Fweb%2Fwrtjs.git Support m76 migration add process.wrtBinding() for using process.binding() and process._linkedBinding(). (electron's binding api is changed to process._linkedBinding() from process.binding()) and, change class name of TizenExtension to XWalkExtension. Change-Id: I059fa50051b206bcf5b478442ccf6658ea71ce60 Signed-off-by: SangYong Park --- diff --git a/wrt_app/browser/init.js b/wrt_app/browser/init.js index 663464cb..9fccd6f8 100755 --- a/wrt_app/browser/init.js +++ b/wrt_app/browser/init.js @@ -14,5 +14,6 @@ * limitations under the License. */ -const wrt = require('./wrt'); +require('../common/init') +const wrt = require('./wrt') require(wrt.getElectronPath() + '/browser/init') diff --git a/wrt_app/browser/wrt.js b/wrt_app/browser/wrt.js index a49ef33f..288cb5b9 100755 --- a/wrt_app/browser/wrt.js +++ b/wrt_app/browser/wrt.js @@ -14,7 +14,7 @@ * limitations under the License. */ require('../common/exception_handling'); -const {wrt} = process.binding('wrt'); +const {wrt} = process.wrtBinding('wrt'); const {EventEmitter} = require('events'); const util = require('util'); diff --git a/wrt_app/browser/wrt_web_contents.js b/wrt_app/browser/wrt_web_contents.js index 994cca24..5c2535a7 100644 --- a/wrt_app/browser/wrt_web_contents.js +++ b/wrt_app/browser/wrt_web_contents.js @@ -14,9 +14,9 @@ * limitations under the License. */ -const binding = process.binding('wrt_web_contents') +const binding = process.wrtBinding('wrt_web_contents') const { WRTWebContents } = binding -const { WebContents: AtomWebContents } = process.atomBinding('web_contents') +const { WebContents: AtomWebContents } = process.wrtBinding('atom_browser_web_contents') const parent = AtomWebContents.prototype AtomWebContents.prototype = WRTWebContents.prototype diff --git a/wrt_app/browser/wrt_window.js b/wrt_app/browser/wrt_window.js index 6917b699..004f26d2 100644 --- a/wrt_app/browser/wrt_window.js +++ b/wrt_app/browser/wrt_window.js @@ -14,7 +14,7 @@ * limitations under the License. */ -const { WRTWindow } = process.binding('wrt_window') +const { WRTWindow } = process.wrtBinding('wrt_window') const { BrowserWindow } = require('electron') const WRTWebContents = require('../browser/wrt_web_contents'); diff --git a/wrt_app/common/extensions.json b/wrt_app/common/extensions.json new file mode 100644 index 00000000..ba82e286 --- /dev/null +++ b/wrt_app/common/extensions.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/common/init.js b/wrt_app/common/init.js new file mode 100644 index 00000000..b407422a --- /dev/null +++ b/wrt_app/common/init.js @@ -0,0 +1,11 @@ +process.wrtBinding = (name) => { + try { + return process._linkedBinding(name) + } catch (error) { + if (/No such module/.test(error.message)) { + return process.binding(name) + } else { + throw error + } + } +} diff --git a/wrt_app/common/wrt_xwalk_extension.js b/wrt_app/common/wrt_xwalk_extension.js new file mode 100644 index 00000000..86a6575a --- /dev/null +++ b/wrt_app/common/wrt_xwalk_extension.js @@ -0,0 +1,217 @@ +/* + * 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. + */ + +require('./exception_handling'); + +var api_ = {}; +var extensions_ = {}; + +class XWalkExtension { + constructor() { + let plugins = require('./extensions.json'); + + const binding = process.wrtBinding('wrt_xwalk_extension') + var extensions = binding.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("Load extension : " + 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]); + } + } + } + + /** + * 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(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(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(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(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(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]; + } + } +} + +module.exports = XWalkExtension; diff --git a/wrt_app/renderer/init.js b/wrt_app/renderer/init.js index f0265e33..e207bcd3 100755 --- a/wrt_app/renderer/init.js +++ b/wrt_app/renderer/init.js @@ -14,6 +14,7 @@ * limitations under the License. */ +require('../common/init') require('../common/exception_handling'); require('../common/config-search-paths'); const wrtRenderer = require('./wrt_renderer'); diff --git a/wrt_app/renderer/wrt_renderer.js b/wrt_app/renderer/wrt_renderer.js index d642327c..c1b183a0 100644 --- a/wrt_app/renderer/wrt_renderer.js +++ b/wrt_app/renderer/wrt_renderer.js @@ -1,3 +1,3 @@ -const {wrtRenderer} = process.binding('wrt_renderer'); +const {wrtRenderer} = process.wrtBinding('wrt_renderer'); module.exports = wrtRenderer diff --git a/wrt_app/service/main.js b/wrt_app/service/main.js index ed10e5d9..4e2a042d 100755 --- a/wrt_app/service/main.js +++ b/wrt_app/service/main.js @@ -19,17 +19,17 @@ const wrt = require('../browser/wrt'); const vm = require('vm'); const AccessControlManager = require('./access_control_manager'); -const TizenExtension = require('./tizen_extension'); +const XWalkExtension = require('../common/wrt_xwalk_extension'); var sandbox = []; var sandbox_count = 0; wrt.on('start-service', (event, app_id, permissions) => { console.log('start service app : ' + app_id + ', permissions : ' + permissions); - new TizenExtension(); + new XWalkExtension(); if (sandbox[app_id] === undefined) { if (sandbox_count === 0) { - new TizenExtension(); + new XWalkExtension(); } sandbox_count++; const Module = require('module'); diff --git a/wrt_app/service/plugins.json b/wrt_app/service/plugins.json deleted file mode 100644 index ba82e286..00000000 --- a/wrt_app/service/plugins.json +++ /dev/null @@ -1,52 +0,0 @@ -[ - { - "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 deleted file mode 100644 index 3c88d5a1..00000000 --- a/wrt_app/service/tizen_extension.js +++ /dev/null @@ -1,218 +0,0 @@ -/* - * 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. - */ - -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'}; - -class TizenExtension { - constructor() { - 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]); - } - } - } - - /** - * 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(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(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(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(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(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]; - } - } -} -module.exports = TizenExtension; diff --git a/wrt_app/service/wrt_service_extension.js b/wrt_app/service/wrt_service_extension.js deleted file mode 100644 index 8207706b..00000000 --- a/wrt_app/service/wrt_service_extension.js +++ /dev/null @@ -1,4 +0,0 @@ -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 3fa6ac9c..bd641fc8 100755 --- a/wrt_app/src/runtime.js +++ b/wrt_app/src/runtime.js @@ -21,9 +21,9 @@ 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'); +const XWalkExtension = require('../common/wrt_xwalk_extension'); class Runtime { constructor(options) { @@ -215,7 +215,7 @@ class Runtime { if (type === 'startService') { if (_this.sandbox[app_id] === undefined) { if (_this.sandbox_count === 0) { - new TizenExtension(); + new XWalkExtension(); } _this.sandbox_count++; const fs = require('fs');