diff options
Diffstat (limited to 'rockworkd/libpebble/jskit/jskitsetup.js')
| -rw-r--r-- | rockworkd/libpebble/jskit/jskitsetup.js | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/rockworkd/libpebble/jskit/jskitsetup.js b/rockworkd/libpebble/jskit/jskitsetup.js new file mode 100644 index 0000000..340c4f1 --- /dev/null +++ b/rockworkd/libpebble/jskit/jskitsetup.js @@ -0,0 +1,196 @@ +//Borrowed from https://github.com/pebble/pypkjs/blob/master/pypkjs/javascript/runtime.py#L17 +_jskit.make_proxies = function(proxy, origin, names) { + names.forEach(function(name) { + proxy[name] = eval("(function " + name + "() { return origin[name].apply(origin, arguments); })"); + }); + + return proxy; +} + +_jskit.make_properties = function(proxy, origin, names) { + names.forEach(function(name) { + Object.defineProperty(proxy, name, { + configurable: false, + enumerable: true, + get: function() { + return origin[name]; + }, + set: function(value) { + origin[name] = value; + } + }); + }); + + return proxy; +} + +Pebble = new (function() { + _jskit.make_proxies(this, _jskit.pebble, + ['sendAppMessage', 'showSimpleNotificationOnPebble', 'getAccountToken', 'getWatchToken', + 'addEventListener', 'removeEventListener', 'openURL', 'getTimelineToken', 'timelineSubscribe', + 'timelineUnsubscribe', 'timelineSubscriptions', 'getActiveWatchInfo'] + ); +})(); + +performance = new (function() { + _jskit.make_proxies(this, _jskit.performance, ['now']); +})(); + +function XMLHttpRequest() { + var xhr = _jskit.pebble.createXMLHttpRequest(); + _jskit.make_proxies(this, xhr, + ['open', 'setRequestHeader', 'overrideMimeType', 'send', 'getResponseHeader', + 'getAllResponseHeaders', 'abort', 'addEventListener', 'removeEventListener']); + _jskit.make_properties(this, xhr, + ['readyState', 'response', 'responseText', 'responseType', 'status', + 'statusText', 'timeout', 'onreadystatechange', 'ontimeout', 'onload', + 'onloadstart', 'onloadend', 'onprogress', 'onerror', 'onabort']); + + this.UNSENT = 0; + this.OPENED = 1; + this.HEADERS_RECEIVED = 2; + this.LOADING = 3; + this.DONE = 4; +} + +function setInterval(func, time) { + return _jskit.timer.setInterval(func, time); +} + +function clearInterval(id) { + _jskit.timer.clearInterval(id); +} + +function setTimeout(func, time) { + return _jskit.timer.setTimeout(func, time); +} + +function clearTimeout(id) { + _jskit.timer.clearTimeout(id); +} + +navigator.geolocation = new (function() { + _jskit.make_proxies(this, _jskit.geolocation, + ['getCurrentPosition', 'watchPosition', 'clearWatch'] + ); +})(); + +console = new (function() { + _jskit.make_proxies(this, _jskit.console, + ['log', 'warn', 'error', 'info'] + ); +})(); + +/*localStorage = new (function() { + _jskit.make_proxies(this, _jskit.localstorage, + ['clear', 'getItem', 'setItem', 'removeItem', 'key'] + ); + + _jskit.make_properties(this, _jskit.localstorage, + ['length'] + ); +})();*/ + +//It appears that Proxy is not available since Qt is using Javascript v5 +/*(function() { + var proxy = _jskit.make_proxies({}, _jskit.localstorage, ['set', 'has', 'deleteProperty', 'keys', 'enumerate']); + var methods = _jskit.make_proxies({}, _jskit.localstorage, ['clear', 'getItem', 'setItem', 'removeItem', 'key']); + proxy.get = function get(p, name) { return methods[name] || _jskit.localstorage.get(p, name); } + this.localStorage = Proxy.create(proxy); +})();*/ + +//inspired by https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage +Object.defineProperty(window, "localStorage", new (function () { + var storage = {}; + Object.defineProperty(storage, "getItem", { + value: function (key) { + var value = null; + if (key !== undefined && key !== null && storage[key] !== undefined) { + value = storage[key]; + } + + return value; + }, + writable: false, + configurable: false, + enumerable: false + }); + + Object.defineProperty(storage, "key", { + value: function (index) { + return Object.keys(storage)[index]; + }, + writable: false, + configurable: false, + enumerable: false + }); + + Object.defineProperty(storage, "setItem", { + value: function (key, value) { + if (key !== undefined && key !== null) { + _jskit.localstorage.setItem(key, value); + storage[key] = (value && value.toString) ? value.toString() : value; + return true; + } + else { + return false; + } + }, + writable: false, + configurable: false, + enumerable: false + }); + + Object.defineProperty(storage, "length", { + get: function () { + return Object.keys(storage).length; + }, + configurable: false, + enumerable: false + }); + + Object.defineProperty(storage, "removeItem", { + value: function (key) { + if (key && storage[key]) { + _jskit.localstorage.removeItem(key); + delete storage[key]; + + return true; + } + else { + return false; + } + }, + writable: false, + configurable: false, + enumerable: false + }); + + Object.defineProperty(storage, "clear", { + value: function (key) { + for (var key in storage) { + storage.removeItem(key); + } + + return true; + }, + writable: false, + configurable: false, + enumerable: false + }); + + this.get = function () { + return storage; + }; + + this.configurable = false; + this.enumerable = true; +})()); + +(function() { + var keys = _jskit.localstorage.keys(); + for (var index in keys) { + var value = _jskit.localstorage.getItem(keys[index]); + localStorage.setItem(keys[index], value); + } +})(); |
