From: Jakub Skowron Date: Thu, 6 Apr 2017 08:14:56 +0000 (+0200) Subject: [Utils] Allow global JSON object redefinition X-Git-Tag: submit/tizen/20170412.115828~3^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0b56645df42627768df90c7723a27acbdd30d799;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [Utils] Allow global JSON object redefinition Allow application programmer to redefine global JSON object. In our code use xwalk.JSON instead Change-Id: I62d57130584aea42a176633aa758b1f675d65b00 Signed-off-by: Jakub Skowron --- diff --git a/src/convergence/convergence_api.js b/src/convergence/convergence_api.js index 6b025068..120f4abb 100644 --- a/src/convergence/convergence_api.js +++ b/src/convergence/convergence_api.js @@ -15,6 +15,7 @@ */ +var JSON_ = xwalk.JSON; var validator_ = xwalk.utils.validator; var types_ = validator_.Types; var utils_ = xwalk.utils; @@ -711,7 +712,7 @@ native_.addListener('APP_COMMUNICATION_SERVICE_LISTENER', function(result) { for(var i = 0; i < result.payload.length; i++) { if (result.payload[i].key === 'client_list') { - var value = JSON.parse(result.payload[i].value); + var value = JSON_.parse(result.payload[i].value); var client = new ClientInfo(value); clients_array.push(client); } diff --git a/src/datacontrol/datacontrol_api.js b/src/datacontrol/datacontrol_api.js index 108f57cc..cb7158e8 100755 --- a/src/datacontrol/datacontrol_api.js +++ b/src/datacontrol/datacontrol_api.js @@ -16,15 +16,15 @@ tizen.debug = extension; +var JSON_ = xwalk.JSON; var validator_ = xwalk.utils.validator; var types_ = validator_.Types; - var callbackId = 0; var callbacks = {}; extension.setMessageListener(function(json) { - var result = JSON.parse(json); + var result = JSON_.parse(json); var callback = callbacks[result['callbackId']]; setTimeout(function() { callback(result); @@ -38,9 +38,9 @@ function nextCallbackId() { function callNative(cmd, args) { var json = {'cmd': cmd, 'args': args}; - var argjson = JSON.stringify(json); + var argjson = JSON_.stringify(json); var resultString = extension.internal.sendSyncMessage(argjson); - var result = JSON.parse(resultString); + var result = JSON_.parse(resultString); if (typeof result !== 'object') { throw new WebAPIException(WebAPIException.UNKNOWN_ERR); diff --git a/src/download/download_api.js b/src/download/download_api.js index b47ddd07..8e5d9c18 100755 --- a/src/download/download_api.js +++ b/src/download/download_api.js @@ -14,6 +14,7 @@ * limitations under the License. */ +var JSON_ = xwalk.JSON; var privUtils_ = xwalk.utils; var validator_ = xwalk.utils.validator; var types_ = validator_.Types; @@ -27,7 +28,7 @@ var requests = {}; extension.setMessageListener(function(json) { - var result = JSON.parse(json); + var result = JSON_.parse(json); var callback = callbacks[result.callbackId]; //privUtils_.log("PostMessage received: " + result.status); @@ -70,9 +71,9 @@ function nextCallbackId() { function callNative(cmd, args) { var json = {'cmd': cmd, 'args': args}; - var argjson = JSON.stringify(json); + var argjson = JSON_.stringify(json); var resultString = extension.internal.sendSyncMessage(argjson); - var result = JSON.parse(resultString); + var result = JSON_.parse(resultString); if (typeof result !== 'object') { throw new WebAPIException(WebAPIException.UNKNOWN_ERR); diff --git a/src/feedback/feedback_api.js b/src/feedback/feedback_api.js index 6a7f6930..43ffb990 100755 --- a/src/feedback/feedback_api.js +++ b/src/feedback/feedback_api.js @@ -14,6 +14,7 @@ * limitations under the License. */ +var JSON_ = xwalk.JSON; var validator_ = xwalk.utils.validator; var types_ = validator_.Types; var type_ = xwalk.utils.type; @@ -36,9 +37,9 @@ var ExceptionMap = { function callNative(cmd, args) { var json = {'cmd': cmd, 'args': args}; - var argjson = JSON.stringify(json); + var argjson = JSON_.stringify(json); var resultString = extension.internal.sendSyncMessage(argjson); - var result = JSON.parse(resultString); + var result = JSON_.parse(resultString); if (typeof result !== 'object') { throw new WebAPIException(WebAPIException.UNKNOWN_ERR); diff --git a/src/messageport/messageport_api.js b/src/messageport/messageport_api.js index cada46b7..ab612f13 100755 --- a/src/messageport/messageport_api.js +++ b/src/messageport/messageport_api.js @@ -14,6 +14,7 @@ * limitations under the License. */ +var JSON_ = xwalk.JSON; var validator_ = xwalk.utils.validator; var types_ = validator_.Types; var type_ = xwalk.utils.type; @@ -25,7 +26,7 @@ var callbacks = {}; var ports = []; extension.setMessageListener(function(json) { - var msg = JSON.parse(json); + var msg = JSON_.parse(json); var listeners = callbacks[msg['local_port_id']]; var rmp; @@ -65,9 +66,9 @@ var ExceptionMap = { function callNative(cmd, args) { var json = {'cmd': cmd, 'args': args}; - var argjson = JSON.stringify(json); + var argjson = JSON_.stringify(json); var resultString = extension.internal.sendSyncMessage(argjson); - var result = JSON.parse(resultString); + var result = JSON_.parse(resultString); if (typeof result !== 'object') { throw new WebAPIException(WebAPIException.UNKNOWN_ERR); diff --git a/src/package/package_api.js b/src/package/package_api.js index 87c45d1e..fcc9fc47 100644 --- a/src/package/package_api.js +++ b/src/package/package_api.js @@ -14,6 +14,7 @@ * limitations under the License. */ +var JSON_ = xwalk.JSON; var validator_ = xwalk.utils.validator; var types_ = validator_.Types; @@ -30,7 +31,7 @@ function invokeListener(result) { } extension.setMessageListener(function(json) { - var result = JSON.parse(json); + var result = JSON_.parse(json); if (result.hasOwnProperty('listener')) { setTimeout(function() { @@ -50,9 +51,9 @@ function nextCallbackId() { function callNative(cmd, args) { var json = {'cmd': cmd, 'args': args}; - var argjson = JSON.stringify(json); + var argjson = JSON_.stringify(json); var resultString = extension.internal.sendSyncMessage(argjson); - var result = JSON.parse(resultString); + var result = JSON_.parse(resultString); if (typeof result !== 'object') { throw new WebAPIException(WebAPIException.UNKNOWN_ERR); diff --git a/src/power/power_api.js b/src/power/power_api.js index 5be10265..f7a711de 100755 --- a/src/power/power_api.js +++ b/src/power/power_api.js @@ -14,6 +14,7 @@ * limitations under the License. */ +var JSON_ = xwalk.JSON; var validator_ = xwalk.utils.validator; var types_ = validator_.Types; var native_ = new xwalk.utils.NativeManager(extension); @@ -44,9 +45,9 @@ var screenStateChangeListener = new ListenerManager(native_, "SCREEN_STATE_LISTE function callNative(cmd, args) { var json = {'cmd':cmd, 'args':args}; - var argjson = JSON.stringify(json); + var argjson = JSON_.stringify(json); var resultString = extension.internal.sendSyncMessage(argjson); - var result = JSON.parse(resultString); + var result = JSON_.parse(resultString); if (typeof result !== 'object') { throw new WebAPIException(WebAPIException.UNKNOWN_ERR); diff --git a/src/tizen/tizen_api.js b/src/tizen/tizen_api.js index f5f8085e..eaa502b3 100644 --- a/src/tizen/tizen_api.js +++ b/src/tizen/tizen_api.js @@ -10,14 +10,6 @@ // WebAPIException and WebAPIError definition moved to src/utils/utils_api.js // for compliance reasons. You can find more info there. -var _global = {}; -if (typeof window != 'undefined') { - _global = window; -} -else if (typeof global != 'undefiend') { - _global = global; -} - /** * Filter match flags. @@ -481,7 +473,3 @@ exports.SimpleCoordinates = function(lat, lng) { }); }; exports.SimpleCoordinates.prototype.constructor = exports.SimpleCoordinates; - -// Protect JSON.stringify from being overriden by application -Object.defineProperty( _global, 'JSON', {value:JSON, writable:false, configurable:false} ); -Object.defineProperty( JSON, 'stringify', {value:JSON.stringify, writable:false, configurable:false} ); diff --git a/src/utils/utils_api.js b/src/utils/utils_api.js index 85fdc33c..ca617251 100644 --- a/src/utils/utils_api.js +++ b/src/utils/utils_api.js @@ -3,6 +3,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +//Object xwalk.JSON - guaranteed to not being modified by the application programmer +var JSON_ = {stringify: JSON.stringify, parse: JSON.parse}; +Object.freeze(JSON_) +exports.JSON = JSON_; + var _enableJsLogs = false; var _global = {}; @@ -1015,7 +1020,7 @@ var NativeManager = function(extension) { }); extension_.setMessageListener(function(json) { - var msg = JSON.parse(json); + var msg = JSON_.parse(json); var id; if (msg.hasOwnProperty(this.CALLBACK_ID_KEY)) { @@ -1079,7 +1084,7 @@ NativeManager.prototype.call = function(cmd, args, callback) { }; NativeManager.prototype.callSync = function(cmd, args) { - var request = JSON.stringify({ + var request = JSON_.stringify({ cmd: cmd, args: args || {} }); @@ -1089,7 +1094,7 @@ NativeManager.prototype.callSync = function(cmd, args) { /* C++ extension didn't set sync response using Instance::SendSyncReply */ throw new WebAPIException(WebAPIException.ABORT_ERR, "Internal error"); } - return JSON.parse(response); + return JSON_.parse(response); }; NativeManager.prototype.sendRuntimeMessage = function(msg, body) { @@ -1343,13 +1348,13 @@ var NativeBridge = (function (extension, debug) { var Bridge = function () {}; Bridge.prototype = { sync: function (data) { - var json = JSON.stringify({ + var json = JSON_.stringify({ cmd: data.cmd, args: data }); if (debug) console.log('bridge.sync, json: ' + json); var result = extension.internal.sendSyncMessage(json); - var obj = JSON.parse(result); + var obj = JSON_.parse(result); if (obj.error) throw new WebAPIException(obj.code, obj.name, obj.message); return obj.result; @@ -1357,7 +1362,7 @@ var NativeBridge = (function (extension, debug) { async: function (data) { var l = new Listener(); data.cid = Listeners.getInstance().add(l); - var json = JSON.stringify({ + var json = JSON_.stringify({ cmd: data.cmd, args: data }); @@ -1395,7 +1400,7 @@ var NativeBridge = (function (extension, debug) { */ if (debug) console.log('bridge.setMessageListener, json: ' + json); - var data = JSON.parse(json); + var data = JSON_.parse(json); if (data.cid && data.action) { setTimeout(function() { Listeners.getInstance().resolve(data.cid, data.action, data.args, data.keep);