// 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_;
+//We're in a function set up by XWALK which 'use strict' mode,
+//so we use below function to get out of the strict mode to get global 'this'
+var _global = (new Function('return this'))();
+
+var shallow_copy_own_elements = function(orig) {
+ var copy = {};
+ //copy only own properties
+ var names = Object.getOwnPropertyNames(orig);
+ for( var i in names ) {
+ var key = names[i]
+ copy[key] = orig[key];
+ }
+ return copy;
+};
-var _enableJsLogs = false;
+//xwalk.JSON: guaranteed to not being modified by the application programmer
+exports.JSON = shallow_copy_own_elements(JSON);
+Object.freeze(exports.JSON);
-var _global = {};
-if (typeof window != 'undefined') {
- _global = window;
-}
-else if (typeof global != 'undefiend') {
- _global = global;
-}
+var _enableJsLogs = false;
/**
* @deprecated Used only by validateArguments()
});
}
+var origString = String;
+var StringPrototypeCopy = shallow_copy_own_elements(String.prototype);
+Object.freeze(StringPrototypeCopy);
+
+var StringCopy = function(str) {
+ return Object.setPrototypeOf( new origString(str), StringPrototypeCopy );
+};
+StringCopy.fromCharCode = String.fromCharCode;
+StringCopy.fromCodePoint = String.fromCodePoint;
+StringCopy.raw = String.raw;
+Object.freeze(StringCopy);
+
+//xwalk.utils.StringCopy: returns a sanitized version of String - user cannot modify its prototype
+Utils.prototype.StringCopy = StringCopy;
+
Utils.prototype.error = console.error.bind(console);
Utils.prototype.warn = console.warn.bind(console);
Utils.prototype.log = _enableJsLogs ? console.log.bind(console) : function(){};
};
Type.prototype.isA = function(obj, type) {
- var clas = Object.prototype.toString.call(obj).slice(8, -1);
- return (obj !== undefined) && (obj !== null) && (clas === type);
+ return obj !== undefined && obj !== null &&
+ obj.constructor !== null && obj.constructor !== undefined &&
+ obj.constructor.name === type;
};
Type.prototype.isEmptyObject = function(obj) {
};
function _toString(val) {
- return String(val);
+ return StringCopy(val).toString();
}
Converter.prototype.toString = function(val, nullable) {
});
extension_.setMessageListener(function(json) {
- var msg = JSON_.parse(json);
+ var msg = exports.JSON.parse(json);
var id;
if (msg.hasOwnProperty(this.CALLBACK_ID_KEY)) {
};
NativeManager.prototype.callSync = function(cmd, args) {
- var request = JSON_.stringify({
+ var request = exports.JSON.stringify({
cmd: cmd,
args: args || {}
});
/* C++ extension didn't set sync response using Instance::SendSyncReply */
throw new WebAPIException(WebAPIException.ABORT_ERR, "Internal error");
}
- return JSON_.parse(response);
+ return exports.JSON.parse(response);
};
NativeManager.prototype.sendRuntimeMessage = function(msg, body) {
var Bridge = function () {};
Bridge.prototype = {
sync: function (data) {
- var json = JSON_.stringify({
+ var json = exports.JSON.stringify({
cmd: data.cmd,
args: data
});
if (debug) xwalk.utilss.log('bridge.sync, json: ' + json);
var result = extension.internal.sendSyncMessage(json);
- var obj = JSON_.parse(result);
+ var obj = exports.JSON.parse(result);
if (obj.error)
throw new WebAPIException(obj.code, obj.name, obj.message);
return obj.result;
async: function (data) {
var l = new Listener();
data.cid = Listeners.getInstance().add(l);
- var json = JSON_.stringify({
+ var json = exports.JSON.stringify({
cmd: data.cmd,
args: data
});
*/
if (debug) xwalk.utils.log('bridge.setMessageListener, json: ' + json);
- var data = JSON_.parse(json);
+ var data = exports.JSON.parse(json);
if (data.cid && data.action) {
setTimeout(function() {
Listeners.getInstance().resolve(data.cid, data.action, data.args, data.keep);