51fc10abb6
This chrome alarm business is in place to help us wake up and check for messages when running in the background. Without it, chrome will suspend our app after a short period of inactivity. Upon waking, if the app discovers it is not linked, it prompts you to link it. However, if you've declined registration (i.e., because you already maxed out your linked device limit, but chrome auto-added the app to another machine), we should just wait until explicitly launched again. Fixes #519 // FREEBIE
250 lines
8.1 KiB
JavaScript
250 lines
8.1 KiB
JavaScript
/*
|
|
* vim: ts=4:sw=4:expandtab
|
|
*/
|
|
(function () {
|
|
'use strict';
|
|
// Browser specific functions for Chrom*
|
|
window.extension = window.extension || {};
|
|
|
|
window.extension.navigator = (function () {
|
|
var self = {},
|
|
tabs = {};
|
|
tabs.create = function (url) {
|
|
if (chrome.tabs) {
|
|
chrome.tabs.create({url: url});
|
|
} else {
|
|
extension.windows.open({url: url});
|
|
}
|
|
};
|
|
self.tabs = tabs;
|
|
|
|
self.setBadgeText = function (text) {
|
|
if (chrome.browserAction && chrome.browserAction.setBadgeText) {
|
|
chrome.browserAction.setBadgeText({text: String(text)});
|
|
}
|
|
};
|
|
|
|
return self;
|
|
}());
|
|
|
|
window.extension.trigger = function (name, object) {
|
|
chrome.runtime.sendMessage(null, { name: name, data: object });
|
|
};
|
|
|
|
window.extension.on = function (name, callback) {
|
|
// this causes every listener to fire on every message.
|
|
// if we eventually end up with lots of listeners (lol)
|
|
// might be worth making a map of 'name' -> [callbacks, ...]
|
|
// so we can fire a single listener that calls only the necessary
|
|
// calllbacks for that message name
|
|
chrome.runtime.onMessage.addListener(function(e) {
|
|
if (e.name === name) {
|
|
callback(e.data);
|
|
}
|
|
});
|
|
};
|
|
|
|
extension.windows = {
|
|
open: function(options, callback) {
|
|
if (chrome.windows) {
|
|
chrome.windows.create(options, callback);
|
|
} else if (chrome.app.window) {
|
|
var url = options.url;
|
|
delete options.url;
|
|
chrome.app.window.create(url, options, callback);
|
|
}
|
|
},
|
|
|
|
focus: function(id, callback) {
|
|
if (chrome.windows) {
|
|
chrome.windows.update(id, { focused: true }, function() {
|
|
callback(chrome.runtime.lastError);
|
|
});
|
|
} else if (chrome.app.window) {
|
|
var appWindow = chrome.app.window.get(id);
|
|
if (appWindow) {
|
|
appWindow.show();
|
|
appWindow.focus();
|
|
callback();
|
|
} else {
|
|
callback('No window found for id ' + id);
|
|
}
|
|
}
|
|
},
|
|
|
|
getCurrent: function(callback) {
|
|
if (chrome.windows) {
|
|
chrome.windows.getCurrent(callback);
|
|
} else if (chrome.app.window) {
|
|
callback(chrome.app.window.current());
|
|
}
|
|
},
|
|
|
|
remove: function(windowId) {
|
|
if (chrome.windows) {
|
|
chrome.windows.remove(windowId);
|
|
} else if (chrome.app.window) {
|
|
chrome.app.window.get(windowId).close();
|
|
}
|
|
},
|
|
|
|
getBackground: function(callback) {
|
|
var getBackground;
|
|
if (chrome.extension) {
|
|
var bg = chrome.extension.getBackgroundPage();
|
|
bg.storage.onready(function() {
|
|
callback(bg);
|
|
resolve();
|
|
});
|
|
} else if (chrome.runtime) {
|
|
chrome.runtime.getBackgroundPage(function(bg) {
|
|
bg.storage.onready(function() {
|
|
callback(bg);
|
|
});
|
|
});
|
|
}
|
|
},
|
|
|
|
getViews: function() {
|
|
if (chrome.extension) {
|
|
return chrome.extension.getViews();
|
|
} else if (chrome.app.window) {
|
|
return chrome.app.window.getAll().map(function(appWindow) {
|
|
return appWindow.contentWindow;
|
|
});
|
|
}
|
|
},
|
|
|
|
onSuspend: function(callback) {
|
|
if (chrome.runtime) {
|
|
chrome.runtime.onSuspend.addListener(callback);
|
|
} else {
|
|
window.addEventListener('beforeunload', callback);
|
|
}
|
|
},
|
|
onClosed: function(callback) {
|
|
// assumes only one front end window
|
|
if (window.chrome && chrome.app && chrome.app.window) {
|
|
return chrome.app.window.getAll()[0].onClosed.addListener(callback);
|
|
} else {
|
|
window.addEventListener('beforeunload', callback);
|
|
}
|
|
},
|
|
|
|
drawAttention: function(window_id) {
|
|
if (chrome.app.window) {
|
|
var w = chrome.app.window.get(window_id);
|
|
w.clearAttention();
|
|
w.drawAttention();
|
|
}
|
|
},
|
|
|
|
clearAttention: function(window_id) {
|
|
if (chrome.app.window) {
|
|
var w = chrome.app.window.get(window_id);
|
|
w.clearAttention();
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
extension.onLaunched = function(callback) {
|
|
if (chrome.browserAction && chrome.browserAction.onClicked) {
|
|
chrome.browserAction.onClicked.addListener(callback);
|
|
}
|
|
if (chrome.app && chrome.app.runtime) {
|
|
chrome.app.runtime.onLaunched.addListener(callback);
|
|
}
|
|
};
|
|
|
|
window.textsecure = window.textsecure || {};
|
|
window.textsecure.registration = {
|
|
done: function () {
|
|
storage.put("chromiumRegistrationDone", "");
|
|
extension.trigger('registration_done');
|
|
},
|
|
|
|
isDone: function () {
|
|
return storage.get("chromiumRegistrationDone") === "";
|
|
},
|
|
};
|
|
|
|
extension.install = function(mode) {
|
|
var id = 'installer';
|
|
var url = 'options.html';
|
|
if (mode === 'standalone') {
|
|
id = 'standalone-installer';
|
|
url = 'register.html';
|
|
}
|
|
if (!chrome.app.window.get(id)) {
|
|
extension.windows.open({
|
|
id: id,
|
|
url: url,
|
|
bounds: { width: 800, height: 666, },
|
|
minWidth: 800,
|
|
minHeight: 666
|
|
});
|
|
}
|
|
};
|
|
|
|
var notification_pending = Promise.resolve();
|
|
extension.notification = {
|
|
clear: function() {
|
|
notification_pending = notification_pending.then(function() {
|
|
return new Promise(function(resolve) {
|
|
chrome.notifications.clear('signal', resolve);
|
|
});
|
|
});
|
|
},
|
|
update: function(options) {
|
|
if (chrome) {
|
|
var chromeOpts = {
|
|
type : options.type,
|
|
title : options.title,
|
|
message : options.message || '', // required
|
|
iconUrl : options.iconUrl,
|
|
imageUrl : options.imageUrl,
|
|
items : options.items,
|
|
buttons : options.buttons
|
|
};
|
|
notification_pending = notification_pending.then(function() {
|
|
return new Promise(function(resolve) {
|
|
chrome.notifications.update('signal', chromeOpts, function(wasUpdated) {
|
|
if (!wasUpdated) {
|
|
chrome.notifications.create('signal', chromeOpts, resolve);
|
|
} else {
|
|
resolve();
|
|
}
|
|
});
|
|
});
|
|
});
|
|
} else {
|
|
var notification = new Notification(options.title, {
|
|
body : options.message,
|
|
icon : options.iconUrl,
|
|
tag : 'signal'
|
|
});
|
|
notification.onclick = function() {
|
|
Whisper.Notifications.onclick();
|
|
};
|
|
}
|
|
}
|
|
};
|
|
|
|
extension.keepAwake = function() {
|
|
if (chrome && chrome.alarms) {
|
|
chrome.alarms.onAlarm.addListener(function() {
|
|
// nothing to do.
|
|
});
|
|
chrome.alarms.create('awake', {periodInMinutes: 1});
|
|
}
|
|
};
|
|
|
|
if (chrome.runtime.onInstalled) {
|
|
chrome.runtime.onInstalled.addListener(function(options) {
|
|
if (options.reason === 'install') {
|
|
extension.install();
|
|
}
|
|
});
|
|
}
|
|
}());
|