From 40910c3b34e96ad8f9ddbba587c0aa00c9ca9a39 Mon Sep 17 00:00:00 2001 From: Matias Pando Date: Mon, 1 Dec 2014 11:19:18 -0300 Subject: [PATCH] Solving chrome app problems --- browser-extensions/chrome/manifest.json | 3 +- init.js | 11 +- initial.js | 4 +- js/app.js | 23 ++++- js/controllers/head.js | 18 ++-- js/controllers/settings.js | 12 +++ js/controllers/unsupported.js | 9 ++ js/plugins/LocalStorage.js | 129 +++++++++++++++++++----- js/routes.js | 13 +++ js/services/notifications.js | 26 ++++- js/util/log.js | 3 +- 11 files changed, 205 insertions(+), 46 deletions(-) diff --git a/browser-extensions/chrome/manifest.json b/browser-extensions/chrome/manifest.json index 55b3ea479..e9f0361c2 100644 --- a/browser-extensions/chrome/manifest.json +++ b/browser-extensions/chrome/manifest.json @@ -4,7 +4,8 @@ "description": "A multisignature bitcoin wallet", "version": "APP_VERSION", "permissions": [ - "storage", "notifications" + "storage", + "notifications" ], "app": { "background": { diff --git a/init.js b/init.js index c4cb7298a..5376f93de 100644 --- a/init.js +++ b/init.js @@ -1,7 +1,12 @@ -var ld = (document.all); +var isChromeApp = window.chrome && chrome.runtime && chrome.runtime.id; +var ld; +if (!isChromeApp) { + ld = (document.all); +} + var ns4 = document.layers; -var ns6 = document.getElementById && !document.all; -var ie4 = document.all; +var ns6 = !isChromeApp && document.getElementById && !document.all; +var ie4 = !isChromeApp && document.all; if (ns4) { ld = document.loading; } else if (ns6) { diff --git a/initial.js b/initial.js index 5af877804..728ed4f7f 100644 --- a/initial.js +++ b/initial.js @@ -1,8 +1,8 @@ chrome.app.runtime.onLaunched.addListener(function() { chrome.app.window.create('index.html', { 'bounds': { - 'width': 1280, - 'height': 800 + 'width': 1024, + 'height': 768 } }); }); diff --git a/js/app.js b/js/app.js index 4ff3e5ba9..c2d32926f 100644 --- a/js/app.js +++ b/js/app.js @@ -3,7 +3,23 @@ var copay = require('copay'); var _ = require('lodash'); var config = defaultConfig; -var localConfig = JSON.parse(localStorage.getItem('config')); + +var localStorage; +if (window.chrome && chrome.runtime && chrome.runtime.id) { + console.log('Is a chrome app!'); + localStorage = chrome.storage.local; + console.log('localStorage', localStorage); +} else { + console.log('Is web!'); + localStorage = window.localStorage; +} + +var localConfig; +if (localStorage) { + localConfig = JSON.parse(localStorage.getItem('config')); +} + + var defaults = JSON.parse(JSON.stringify(defaultConfig)); if (localConfig) { @@ -47,9 +63,10 @@ copayApp.config(function($sceDelegateProvider) { }); angular.module('ui.gravatar').config([ - 'gravatarServiceProvider', function(gravatarServiceProvider) { + 'gravatarServiceProvider', + function(gravatarServiceProvider) { gravatarServiceProvider.defaults = { - size : 35 + size: 35 }; // Use https endpoint gravatarServiceProvider.secure = true; diff --git a/js/controllers/head.js b/js/controllers/head.js index 58ff90dbc..047b4caca 100644 --- a/js/controllers/head.js +++ b/js/controllers/head.js @@ -4,6 +4,8 @@ angular.module('copayApp.controllers').controller('HeadController', function($sc $scope.username = $rootScope.iden.getName(); $scope.hoverMenu = false; + console.log('$scope.username', $scope.username); + $scope.hoverIn = function() { this.hoverMenu = true; }; @@ -30,14 +32,16 @@ angular.module('copayApp.controllers').controller('HeadController', function($sc } }; - // Ensures a graceful disconnect - window.onbeforeunload = function() { - $scope.signout(); - }; - $scope.$on('$destroy', function() { - window.onbeforeunload = undefined; - }); + //mpando restore after solve some chrome app error + // Ensures a graceful disconnect + // window.onbeforeunload = function() { + // $scope.signout(); + // }; + + // $scope.$on('$destroy', function() { + // window.onbeforeunload = undefined; + // }); $scope.init = function() { if (!$rootScope.wallet) return; diff --git a/js/controllers/settings.js b/js/controllers/settings.js index 012605b0a..894b40702 100644 --- a/js/controllers/settings.js +++ b/js/controllers/settings.js @@ -7,6 +7,18 @@ angular.module('copayApp.controllers').controller('SettingsController', function $scope.insightTestnet = config.network.testnet.url; $scope.defaultLogLevel = config.logLevel || 'log'; + + var localStorage; + + var isChromeApp = window.chrome && chrome.runtime && chrome.runtime.id; + if (isChromeApp) { + console.log('Is a chrome app!'); + localStorage = chrome.storage.local; + } else { + console.log('Is web!'); + localStorage = window.localStorage; + } + var logLevels = copay.logger.getLevels(); $scope.availableLogLevels = []; diff --git a/js/controllers/unsupported.js b/js/controllers/unsupported.js index 2617a81df..714b01c19 100644 --- a/js/controllers/unsupported.js +++ b/js/controllers/unsupported.js @@ -2,6 +2,15 @@ angular.module('copayApp.controllers').controller('UnsupportedController', function($scope, $location) { + + var localStorage; + if (window.chrome && chrome.runtime && chrome.runtime.id) { + console.log('Is a chrome app!'); + localStorage = chrome.storage.local; + } else { + console.log('Is web!'); + localStorage = window.localStorage; + } if (localStorage && localStorage.length > 0) { $location.path('/'); } diff --git a/js/plugins/LocalStorage.js b/js/plugins/LocalStorage.js index 8e4ee75e3..b0d852892 100644 --- a/js/plugins/LocalStorage.js +++ b/js/plugins/LocalStorage.js @@ -1,58 +1,133 @@ 'use strict'; var _ = require('lodash'); var preconditions = require('preconditions').singleton(); +var isChromeApp = window.chrome && chrome.runtime && chrome.runtime.id; -function LocalStorage(opts) { + +function LocalStorage() { this.type = 'DB'; - opts = opts || {}; - - this.ls = opts.ls - || ( (typeof localStorage !== 'undefined') ? localStorage : null ); + if (isChromeApp) { + localStorage = chrome.storage.local; + window.localStorage = chrome.storage.local; + } - preconditions.checkState(this.ls, + preconditions.checkState(typeof localStorage !== 'undefined', 'localstorage not available, cannot run plugin'); }; -LocalStorage.prototype.init = function() { -}; +LocalStorage.prototype.init = function() {}; LocalStorage.prototype.setCredentials = function(email, password, opts) { - // NOP + this.email = email; + this.password = password; }; -LocalStorage.prototype.getItem = function(k,cb) { - preconditions.checkArgument(_.isFunction(cb)); - return cb(null, this.ls.getItem(k)); +LocalStorage.prototype.getItem = function(k, cb) { + if (isChromeApp) { + chrome.storage.local.get(k, + function(data) { + //TODO check for errors + return cb(null, data[k]); + }); + } else { + return cb(null, localStorage.getItem(k)); + } }; /** * Same as setItem, but fails if an item already exists */ LocalStorage.prototype.createItem = function(name, value, callback) { - preconditions.checkArgument(_.isFunction(callback)); - if (this.ls.getItem(name)) { - return callback('EEXISTS'); + var self = this; + console.log('createItem '); + self.getItem(name, + function(err, data) { + console.log('error ', err); + console.log('data ', data); + if (data) { + return callback('EEXISTS'); + } else { + console.log('calling setitem '); + return self.setItem(name, value, callback); + } + }); +}; + +LocalStorage.prototype.setItem = function(k, v, cb) { + if (isChromeApp) { + console.log('.............key', k); + console.log('.............value', v); + + var obj = {}; + obj[k] = v; + + chrome.storage.local.set(obj, cb); + } else { + localStorage.setItem(k, v); + return cb(); } - return this.setItem(name, value, callback); + }; -LocalStorage.prototype.setItem = function(k,v,cb) { - preconditions.checkArgument(_.isFunction(cb)); - this.ls.setItem(k,v); +LocalStorage.prototype.removeItem = function(k, cb) { + if (isChromeApp) { + chrome.storage.remove(k, cb); + } else { + localStorage.removeItem(k); + return cb(); + } + +}; + +LocalStorage.prototype.clear = function(cb) { + if (isChromeApp) { + chrome.storage.clear(); + } else { + localStorage.clear(); + } return cb(); }; -LocalStorage.prototype.removeItem = function(k,cb) { - preconditions.checkArgument(_.isFunction(cb)); - this.ls.removeItem(k); - return cb(); +LocalStorage.prototype.allKeys = function(cb) { + + if (isChromeApp) { + chrome.storage.local.get(null, function(items) { + return cb(null, _.keys(items)); + }); + } else { + var ret = []; + var l = localStorage.length; + + for (var i = 0; i < l; i++) + ret.push(localStorage.key(i)); + + return cb(null, ret); + } }; -LocalStorage.prototype.clear = function(cb) { - preconditions.checkArgument(_.isFunction(cb)); - this.ls.clear(); - return cb(); +LocalStorage.prototype.getFirst = function(prefix, opts, cb) { + opts = opts || {}; + var that = this; + + this.allKeys(function(err, allKeys) { + var keys = _.filter(allKeys, function(k) { + if ((k === prefix) || k.indexOf(prefix) === 0) return true; + }); + + if (keys.length === 0) + return cb(new Error('not found')); + + if (opts.onlyKey) + return cb(null, null, keys[0]); + + that.getItem(keys[0], function(err, data) { + if (err) { + return cb(err); + } + return cb(null, data, keys[0]); + }); + }); }; module.exports = LocalStorage; diff --git a/js/routes.js b/js/routes.js index 12d8b93f2..8f5bf78ba 100644 --- a/js/routes.js +++ b/js/routes.js @@ -118,6 +118,19 @@ angular uriHandler.register(); } $rootScope.$on('$routeChangeStart', function(event, next, current) { + + var localStorage; + if (window.chrome && chrome.runtime && chrome.runtime.id) { + console.log('Is a chrome app!'); + localStorage = chrome.storage.local; + + console.log('chrome.storage', chrome.storage); + console.log('localStorage', localStorage); + } else { + console.log('Is web!'); + localStorage = window.localStorage; + } + if (!localStorage || localStorage.length < 1) { $location.path('unsupported'); } else { diff --git a/js/services/notifications.js b/js/services/notifications.js index 3f5b324ea..cfb665938 100644 --- a/js/services/notifications.js +++ b/js/services/notifications.js @@ -4,9 +4,31 @@ angular.module('copayApp.services'). factory('notification', ['$timeout', function($timeout) { - var notifications = JSON.parse(localStorage.getItem('notifications')) || [], - queue = []; + var localStorage; + if (window.chrome && chrome.runtime && chrome.runtime.id) { + console.log('Is a chrome app!'); + localStorage = chrome.storage.local; + } else { + console.log('Is web!'); + localStorage = window.localStorage; + } + var notifications = []; + + if (window.chrome && chrome.runtime && chrome.runtime.id) { + localStorage.get('notifications', function(data) { + console.log('data', data); + if (data) { + notifications = JSON.parse(data); + } + }); + + } else { + notifications = JSON.parse(localStorage.getItem('notifications')) || []; + } + + + var queue = []; var settings = { info: { duration: 6000, diff --git a/js/util/log.js b/js/util/log.js index 220fc2a02..e5a71daa7 100644 --- a/js/util/log.js +++ b/js/util/log.js @@ -5,7 +5,7 @@ var ls; try { var LS = require('../js/plugins/LocalStorage'); ls = new LS(); -} catch(e) {}; +} catch (e) {}; /** * @desc @@ -126,6 +126,7 @@ var error = new Error(); var logLevel = config.logLevel || 'info'; + if (ls && ls.getItem) { ls.getItem("config", function(err, value) { if (err) return;