chromium.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. /*
  2. * vim: ts=4:sw=4:expandtab
  3. */
  4. (function () {
  5. 'use strict';
  6. // Browser specific functions for Chrom*
  7. window.extension = window.extension || {};
  8. window.extension.navigator = (function () {
  9. var self = {},
  10. tabs = {};
  11. tabs.create = function (url) {
  12. if (chrome.tabs) {
  13. chrome.tabs.create({url: url});
  14. } else {
  15. extension.windows.open({url: url});
  16. }
  17. };
  18. self.tabs = tabs;
  19. self.setBadgeText = function (text) {
  20. if (chrome.browserAction && chrome.browserAction.setBadgeText) {
  21. chrome.browserAction.setBadgeText({text: String(text)});
  22. }
  23. };
  24. return self;
  25. }());
  26. extension.windows = {
  27. open: function(options, callback) {
  28. if (chrome.windows) {
  29. chrome.windows.create(options, callback);
  30. } else if (chrome.app.window) {
  31. var url = options.url;
  32. delete options.url;
  33. chrome.app.window.create(url, options, callback);
  34. }
  35. },
  36. focus: function(id, callback) {
  37. if (chrome.windows) {
  38. chrome.windows.update(id, { focused: true }, function() {
  39. callback(chrome.runtime.lastError);
  40. });
  41. } else if (chrome.app.window) {
  42. var appWindow = chrome.app.window.get(id);
  43. if (appWindow) {
  44. appWindow.show();
  45. appWindow.focus();
  46. callback();
  47. } else {
  48. callback('No window found for id ' + id);
  49. }
  50. }
  51. },
  52. getCurrent: function(callback) {
  53. if (chrome.windows) {
  54. chrome.windows.getCurrent(callback);
  55. } else if (chrome.app.window) {
  56. callback(chrome.app.window.current());
  57. }
  58. },
  59. remove: function(windowId) {
  60. if (chrome.windows) {
  61. chrome.windows.remove(windowId);
  62. } else if (chrome.app.window) {
  63. chrome.app.window.get(windowId).close();
  64. }
  65. },
  66. getBackground: function(callback) {
  67. var getBackground;
  68. if (chrome.extension) {
  69. var bg = chrome.extension.getBackgroundPage();
  70. bg.storage.onready(function() {
  71. callback(bg);
  72. resolve();
  73. });
  74. } else if (chrome.runtime) {
  75. chrome.runtime.getBackgroundPage(function(bg) {
  76. bg.storage.onready(function() {
  77. callback(bg);
  78. });
  79. });
  80. }
  81. },
  82. getAll: function() {
  83. return chrome.app.window.getAll();
  84. },
  85. getViews: function() {
  86. if (chrome.extension) {
  87. return chrome.extension.getViews();
  88. } else if (chrome.app.window) {
  89. return chrome.app.window.getAll().map(function(appWindow) {
  90. return appWindow.contentWindow;
  91. });
  92. }
  93. },
  94. onSuspend: function(callback) {
  95. if (chrome.runtime) {
  96. chrome.runtime.onSuspend.addListener(callback);
  97. } else {
  98. window.addEventListener('beforeunload', callback);
  99. }
  100. },
  101. onClosed: function(callback) {
  102. // assumes only one front end window
  103. if (window.chrome && chrome.app && chrome.app.window) {
  104. return chrome.app.window.getAll()[0].onClosed.addListener(callback);
  105. } else {
  106. window.addEventListener('beforeunload', callback);
  107. }
  108. },
  109. drawAttention: function(window_id) {
  110. console.log('draw attention');
  111. if (chrome.app.window) {
  112. var w = chrome.app.window.get(window_id);
  113. if (w) {
  114. w.clearAttention();
  115. w.drawAttention();
  116. }
  117. }
  118. },
  119. clearAttention: function(window_id) {
  120. console.log('clear attention');
  121. if (chrome.app.window) {
  122. var w = chrome.app.window.get(window_id);
  123. if (w) {
  124. w.clearAttention();
  125. }
  126. }
  127. }
  128. };
  129. extension.onLaunched = function(callback) {
  130. if (chrome.browserAction && chrome.browserAction.onClicked) {
  131. chrome.browserAction.onClicked.addListener(callback);
  132. }
  133. if (chrome.app && chrome.app.runtime) {
  134. chrome.app.runtime.onLaunched.addListener(callback);
  135. }
  136. };
  137. // Translate
  138. window.i18n = function(message, substitutions) {
  139. if (window.chrome && chrome.i18n) {
  140. return chrome.i18n.getMessage(message, substitutions);
  141. }
  142. };
  143. i18n.getLocale = function() {
  144. if (window.chrome && chrome.i18n) {
  145. return chrome.i18n.getUILanguage();
  146. }
  147. return 'en';
  148. };
  149. extension.install = function(mode) {
  150. var id = 'installer';
  151. var url = 'options.html';
  152. if (mode === 'standalone') {
  153. id = 'standalone-installer';
  154. url = 'register.html';
  155. }
  156. if (!chrome.app.window.get(id)) {
  157. extension.windows.open({
  158. id: id,
  159. url: url,
  160. bounds: { width: 800, height: 666, },
  161. minWidth: 800,
  162. minHeight: 666
  163. });
  164. }
  165. };
  166. var notification_pending = Promise.resolve();
  167. extension.notification = {
  168. init: function() {
  169. // register some chrome listeners
  170. if (chrome.notifications) {
  171. chrome.notifications.onClicked.addListener(function() {
  172. extension.notification.clear();
  173. Whisper.Notifications.onclick();
  174. });
  175. chrome.notifications.onButtonClicked.addListener(function() {
  176. extension.notification.clear();
  177. Whisper.Notifications.clear();
  178. getInboxCollection().each(function(model) {
  179. model.markRead();
  180. });
  181. });
  182. chrome.notifications.onClosed.addListener(function(id, byUser) {
  183. if (byUser) {
  184. Whisper.Notifications.clear();
  185. }
  186. });
  187. }
  188. },
  189. clear: function() {
  190. notification_pending = notification_pending.then(function() {
  191. return new Promise(function(resolve) {
  192. chrome.notifications.clear('signal', resolve);
  193. });
  194. });
  195. },
  196. update: function(options) {
  197. if (chrome) {
  198. var chromeOpts = {
  199. type : options.type,
  200. title : options.title,
  201. message : options.message || '', // required
  202. iconUrl : options.iconUrl,
  203. imageUrl : options.imageUrl,
  204. items : options.items,
  205. buttons : options.buttons
  206. };
  207. notification_pending = notification_pending.then(function() {
  208. return new Promise(function(resolve) {
  209. chrome.notifications.update('signal', chromeOpts, function(wasUpdated) {
  210. if (!wasUpdated) {
  211. chrome.notifications.create('signal', chromeOpts, resolve);
  212. } else {
  213. resolve();
  214. }
  215. });
  216. });
  217. });
  218. } else {
  219. var notification = new Notification(options.title, {
  220. body : options.message,
  221. icon : options.iconUrl,
  222. tag : 'signal'
  223. });
  224. notification.onclick = function() {
  225. Whisper.Notifications.onclick();
  226. };
  227. }
  228. }
  229. };
  230. extension.keepAwake = function() {
  231. if (chrome && chrome.alarms) {
  232. chrome.alarms.onAlarm.addListener(function() {
  233. // nothing to do.
  234. });
  235. chrome.alarms.create('awake', {periodInMinutes: 1});
  236. }
  237. };
  238. if (chrome.runtime.onInstalled) {
  239. chrome.runtime.onInstalled.addListener(function(options) {
  240. if (options.reason === 'install') {
  241. console.log('new install');
  242. extension.install();
  243. } else if (options.reason === 'update') {
  244. console.log('new update. previous version:', options.previousVersion);
  245. } else {
  246. console.log('onInstalled', options.reason);
  247. }
  248. });
  249. }
  250. }());