You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			271 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			271 lines
		
	
	
		
			8.8 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;
 | |
|     }());
 | |
| 
 | |
|     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);
 | |
|             }
 | |
|         });
 | |
|     }
 | |
| }());
 |