diff --git a/background.html b/background.html index 04f7604c..f1bea8a2 100644 --- a/background.html +++ b/background.html @@ -230,6 +230,7 @@ + diff --git a/js/axolotl_store.js b/js/axolotl_store.js index 04678081..7f23f3dd 100644 --- a/js/axolotl_store.js +++ b/js/axolotl_store.js @@ -83,42 +83,6 @@ var IdentityKey = Model.extend({ storeName: 'identityKeys' }); var Group = Model.extend({ storeName: 'groups' }); var Item = Model.extend({ storeName: 'items' }); - var ItemCollection = Backbone.Collection.extend({ - model: Item, - storeName: 'items', - database: Whisper.Database, - }); - - var items = new ItemCollection(); - window.textsecure = window.textsecure || {}; - window.textsecure.storage = window.textsecure.storage || {}; - window.textsecure.storage.impl = { - /***************************** - *** Base Storage Routines *** - *****************************/ - put: function(key, value) { - if (value === undefined) - throw new Error("Tried to store undefined"); - var item = items.add({id: key, value: value}); - item.save(); - }, - - get: function(key, defaultValue) { - var item = items.get("" + key); - if (!item) - return defaultValue; - return item.get('value'); - }, - - remove: function(key) { - var item = items.get("" + key); - if (item) { - items.remove(item); - item.destroy(); - } - } - }; - items.fetch(); function AxolotlStore() {} diff --git a/js/background.js b/js/background.js index 984a86c6..87237186 100644 --- a/js/background.js +++ b/js/background.js @@ -16,119 +16,121 @@ ;(function() { 'use strict'; - var messageReceiver; + storage.onready(function() { + var messageReceiver; - if (!localStorage.getItem('first_install_ran')) { - localStorage.setItem('first_install_ran', 1); - extension.navigator.tabs.create("options.html"); - } - - if (textsecure.registration.isDone()) { - init(); - } - extension.on('registration_done', init); - - window.getSocketStatus = function() { - if (messageReceiver) { - return messageReceiver.getStatus(); - } else { - return -1; + if (!storage.get('first_install_ran')) { + storage.put('first_install_ran', 1); + extension.navigator.tabs.create("options.html"); } - }; - function init() { - if (!textsecure.registration.isDone()) { return; } + if (textsecure.registration.isDone()) { + init(); + } + extension.on('registration_done', init); - // initialize the socket and start listening for messages - messageReceiver = new textsecure.MessageReceiver(window); - window.addEventListener('signal', function(ev) { - var proto = ev.proto; - if (proto.type === textsecure.protobuf.IncomingPushMessageSignal.Type.RECEIPT) { - onDeliveryReceipt(proto); + window.getSocketStatus = function() { + if (messageReceiver) { + return messageReceiver.getStatus(); } else { - onMessageReceived(proto); + return -1; } - }); - messageReceiver.connect(); - } + }; - function onMessageReceived(pushMessage) { - var now = new Date().getTime(); - var timestamp = pushMessage.timestamp.toNumber(); + function init() { + if (!textsecure.registration.isDone()) { return; } - var conversation = getConversation({ - id : pushMessage.source, - type : 'private' - }); + // initialize the socket and start listening for messages + messageReceiver = new textsecure.MessageReceiver(window); + window.addEventListener('signal', function(ev) { + var proto = ev.proto; + if (proto.type === textsecure.protobuf.IncomingPushMessageSignal.Type.RECEIPT) { + onDeliveryReceipt(proto); + } else { + onMessageReceived(proto); + } + }); + messageReceiver.connect(); + } - conversation.fetch().always(function() { - var message = conversation.messageCollection.add({ - source : pushMessage.source, - sourceDevice : pushMessage.sourceDevice, - relay : pushMessage.relay, - sent_at : timestamp, - received_at : now, - conversationId : pushMessage.source, - type : 'incoming' + function onMessageReceived(pushMessage) { + var now = new Date().getTime(); + var timestamp = pushMessage.timestamp.toNumber(); + + var conversation = getConversation({ + id : pushMessage.source, + type : 'private' }); - var newUnreadCount = textsecure.storage.get("unreadCount", 0) + 1; - textsecure.storage.put("unreadCount", newUnreadCount); - extension.navigator.setBadgeText(newUnreadCount); + conversation.fetch().always(function() { + var message = conversation.messageCollection.add({ + source : pushMessage.source, + sourceDevice : pushMessage.sourceDevice, + relay : pushMessage.relay, + sent_at : timestamp, + received_at : now, + conversationId : pushMessage.source, + type : 'incoming' + }); - conversation.save().then(function() { - message.save().then(function() { - return new Promise(function(resolve) { - resolve(textsecure.protocol_wrapper.handleIncomingPushMessageProto(pushMessage).then( - function(pushMessageContent) { - message.handlePushMessageContent(pushMessageContent); + var newUnreadCount = storage.get("unreadCount", 0) + 1; + storage.put("unreadCount", newUnreadCount); + extension.navigator.setBadgeText(newUnreadCount); + + conversation.save().then(function() { + message.save().then(function() { + return new Promise(function(resolve) { + resolve(textsecure.protocol_wrapper.handleIncomingPushMessageProto(pushMessage).then( + function(pushMessageContent) { + message.handlePushMessageContent(pushMessageContent); + } + )); + }).catch(function(e) { + if (e.name === 'IncomingIdentityKeyError') { + message.save({ errors : [e] }).then(function() { + extension.trigger('message', message); + notifyConversation(message); + }); + } else if (e.message === 'Bad MAC') { + message.save({ errors : [ _.pick(e, ['name', 'message'])]}).then(function() { + extension.trigger('message', message); + notifyConversation(message); + }); + } else { + console.log(e); + throw e; } - )); - }).catch(function(e) { - if (e.name === 'IncomingIdentityKeyError') { - message.save({ errors : [e] }).then(function() { - extension.trigger('message', message); - notifyConversation(message); - }); - } else if (e.message === 'Bad MAC') { - message.save({ errors : [ _.pick(e, ['name', 'message'])]}).then(function() { - extension.trigger('message', message); - notifyConversation(message); - }); - } else { - console.log(e); - throw e; - } + }); }); }); }); - }); - } + } - function onDeliveryReceipt(pushMessage) { - var timestamp = pushMessage.timestamp.toNumber(); - var messages = new Whisper.MessageCollection(); - var groups = new Whisper.ConversationCollection(); - console.log('delivery receipt', pushMessage.source, timestamp); - messages.fetchSentAt(timestamp).then(function() { - groups.fetchGroups(pushMessage.source).then(function() { - for (var i in messages.where({type: 'outgoing'})) { - var message = messages.at(i); - var deliveries = message.get('delivered') || 0; - var conversationId = message.get('conversationId'); - if (conversationId === pushMessage.source || groups.get(conversationId)) { - message.save({delivered: deliveries + 1}).then( - // notify frontend listeners - updateConversation.bind(window,conversationId) - ); - return; - // TODO: consider keeping a list of numbers we've - // successfully delivered to? + function onDeliveryReceipt(pushMessage) { + var timestamp = pushMessage.timestamp.toNumber(); + var messages = new Whisper.MessageCollection(); + var groups = new Whisper.ConversationCollection(); + console.log('delivery receipt', pushMessage.source, timestamp); + messages.fetchSentAt(timestamp).then(function() { + groups.fetchGroups(pushMessage.source).then(function() { + for (var i in messages.where({type: 'outgoing'})) { + var message = messages.at(i); + var deliveries = message.get('delivered') || 0; + var conversationId = message.get('conversationId'); + if (conversationId === pushMessage.source || groups.get(conversationId)) { + message.save({delivered: deliveries + 1}).then( + // notify frontend listeners + updateConversation.bind(window,conversationId) + ); + return; + // TODO: consider keeping a list of numbers we've + // successfully delivered to? + } } - } + }); + }).fail(function() { + console.log('got delivery receipt for unknown message', pushMessage.source, timestamp); }); - }).fail(function() { - console.log('got delivery receipt for unknown message', pushMessage.source, timestamp); - }); - } + } + }); })(); diff --git a/js/chromium.js b/js/chromium.js index 2233e832..ae5437dc 100644 --- a/js/chromium.js +++ b/js/chromium.js @@ -98,12 +98,12 @@ window.textsecure = window.textsecure || {}; window.textsecure.registration = { done: function () { - localStorage.setItem("chromiumRegistrationDone", ""); + storage.put("chromiumRegistrationDone", ""); extension.trigger('registration_done'); }, isDone: function () { - return localStorage.getItem("chromiumRegistrationDone") !== null; + return storage.get("chromiumRegistrationDone") === ""; }, }; diff --git a/js/inbox_controller.js b/js/inbox_controller.js index c1a85663..17402ad3 100644 --- a/js/inbox_controller.js +++ b/js/inbox_controller.js @@ -33,9 +33,9 @@ inbox.on('change:unreadCount', function(model, count) { var prev = model.previous('unreadCount') || 0; if (count < prev) { // decreased - var newUnreadCount = textsecure.storage.get("unreadCount", 0) - (prev - count); + var newUnreadCount = storage.get("unreadCount", 0) - (prev - count); setUnreadCount(newUnreadCount); - textsecure.storage.put("unreadCount", newUnreadCount); + storage.put("unreadCount", newUnreadCount); } }); @@ -52,7 +52,7 @@ extension.on('message', fetch); fetch(); - setUnreadCount(textsecure.storage.get("unreadCount", 0)); + setUnreadCount(storage.get("unreadCount", 0)); function setUnreadCount(count) { if (count > 0) { diff --git a/js/notifications.js b/js/notifications.js index 599d8e2e..e1126d23 100644 --- a/js/notifications.js +++ b/js/notifications.js @@ -20,16 +20,16 @@ Whisper.Notifications = { isEnabled: function(callback) { return Notification.permission === 'granted' && - !localStorage.getItem('disable-notifications'); + !storage.get('disable-notifications'); }, enable: function(callback) { - localStorage.removeItem('disable-notifications'); + storage.remove('disable-notifications'); Notification.requestPermission(function(status) { callback(status); }); }, disable: function() { - localStorage.setItem('disable-notifications', true); + storage.put('disable-notifications', true); } }; diff --git a/js/storage.js b/js/storage.js new file mode 100644 index 00000000..1a20c840 --- /dev/null +++ b/js/storage.js @@ -0,0 +1,70 @@ +/* vim: ts=4:sw=4 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +;(function() { + 'use strict'; + window.Whisper = window.Whisper || {}; + var Item = Backbone.Model.extend({ + database: Whisper.Database, + storeName: 'items' + }); + var ItemCollection = Backbone.Collection.extend({ + model: Item, + storeName: 'items', + database: Whisper.Database, + }); + + var ready = false; + var items = new ItemCollection(); + items.on('reset', function() { ready = true; }); + items.fetch({reset: true}); + window.storage = { + /***************************** + *** Base Storage Routines *** + *****************************/ + put: function(key, value) { + if (value === undefined) + throw new Error("Tried to store undefined"); + var item = items.add({id: key, value: value}); + item.save(); + }, + + get: function(key, defaultValue) { + var item = items.get("" + key); + if (!item) + return defaultValue; + return item.get('value'); + }, + + remove: function(key) { + var item = items.get("" + key); + if (item) { + items.remove(item); + item.destroy(); + } + }, + + onready: function(callback) { + if (ready) { + callback(); + } else { + items.on('reset', callback); + } + } + }; + window.textsecure = window.textsecure || {}; + window.textsecure.storage = window.textsecure.storage || {}; + window.textsecure.storage.impl = window.storage; +})();