summaryrefslogtreecommitdiff
path: root/rockworkd/libpebble/jskit/jskitsetup.js
diff options
context:
space:
mode:
Diffstat (limited to 'rockworkd/libpebble/jskit/jskitsetup.js')
-rw-r--r--rockworkd/libpebble/jskit/jskitsetup.js196
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);
+ }
+})();