123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- /*
- * 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;
- }());
- 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);
- });
- });
- }
- },
- getAll: function() {
- return chrome.app.window.getAll();
- },
- 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) {
- console.log('draw attention');
- if (chrome.app.window) {
- var w = chrome.app.window.get(window_id);
- if (w) {
- w.clearAttention();
- w.drawAttention();
- }
- }
- },
- clearAttention: function(window_id) {
- console.log('clear attention');
- if (chrome.app.window) {
- var w = chrome.app.window.get(window_id);
- if (w) {
- 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);
- }
- };
- // Translate
- window.i18n = function(message, substitutions) {
- if (window.chrome && chrome.i18n) {
- return chrome.i18n.getMessage(message, substitutions);
- }
- };
- i18n.getLocale = function() {
- if (window.chrome && chrome.i18n) {
- return chrome.i18n.getUILanguage();
- }
- return 'en';
- };
- 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 = {
- init: function() {
- // register some chrome listeners
- if (chrome.notifications) {
- chrome.notifications.onClicked.addListener(function() {
- extension.notification.clear();
- Whisper.Notifications.onclick();
- });
- chrome.notifications.onButtonClicked.addListener(function() {
- extension.notification.clear();
- Whisper.Notifications.clear();
- getInboxCollection().each(function(model) {
- model.markRead();
- });
- });
- chrome.notifications.onClosed.addListener(function(id, byUser) {
- if (byUser) {
- Whisper.Notifications.clear();
- }
- });
- }
- },
- 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') {
- console.log('new install');
- extension.install();
- } else if (options.reason === 'update') {
- console.log('new update. previous version:', options.previousVersion);
- } else {
- console.log('onInstalled', options.reason);
- }
- });
- }
- }());
|