
Previous commit removed notification models from the global collection but did not actually update the existing notification. This commit refactors the notification interface to allow us to update it without re-surfacing the notifcation onscreen. // FREEBIE
224 lines
7.1 KiB
JavaScript
224 lines
7.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();
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
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
|
|
});
|
|
}
|
|
};
|
|
|
|
extension.notification = {
|
|
clear: function() {
|
|
chrome.notifications.clear('signal');
|
|
},
|
|
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
|
|
};
|
|
chrome.notifications.update('signal', chromeOpts, function(wasUpdated) {
|
|
if (!wasUpdated) {
|
|
chrome.notifications.create('signal', chromeOpts);
|
|
}
|
|
});
|
|
} else {
|
|
var notification = new Notification(options.title, {
|
|
body : options.message,
|
|
icon : options.iconUrl,
|
|
tag : 'signal'
|
|
});
|
|
notification.onclick = function() {
|
|
Whisper.Notifications.onclick();
|
|
};
|
|
}
|
|
}
|
|
};
|
|
|
|
if (chrome.runtime.onInstalled) {
|
|
chrome.runtime.onInstalled.addListener(function(options) {
|
|
if (options.reason === 'install') {
|
|
extension.install();
|
|
}
|
|
});
|
|
}
|
|
}());
|