util.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. 'use strict';
  2. function cancelEvent (event) {
  3. event = event || window.event;
  4. if (event) {
  5. event = event.originalEvent || event;
  6. if (event.stopPropagation) event.stopPropagation();
  7. if (event.preventDefault) event.preventDefault();
  8. }
  9. return false;
  10. }
  11. function getGuid() {
  12. return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
  13. var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
  14. return v.toString(16);
  15. });
  16. }
  17. //ConfigStorage
  18. (function(window)
  19. {
  20. var keyPrefix = '';
  21. var noPrefix = false;
  22. var cache = {};
  23. var useCs = !!(window.chrome && chrome.storage && chrome.storage.local);
  24. var useLs = !useCs && !!window.localStorage;
  25. function storageSetPrefix(newPrefix)
  26. {
  27. keyPrefix = newPrefix;
  28. }
  29. function storageSetNoPrefix()
  30. {
  31. noPrefix = true;
  32. }
  33. function storageGetPrefix()
  34. {
  35. if (noPrefix)
  36. {
  37. noPrefix = false;
  38. return '';
  39. }
  40. return keyPrefix;
  41. }
  42. function storageGetValue()
  43. {
  44. var keys = Array.prototype.slice.call(arguments),
  45. callback = keys.pop(),
  46. result = [],
  47. single = keys.length == 1,
  48. value,
  49. allFound = true,
  50. prefix = storageGetPrefix(),
  51. i, key;
  52. for (i = 0; i < keys.length; i++)
  53. {
  54. key = keys[i] = prefix + keys[i];
  55. if (key.substr(0, 3) != 'xt_' && cache[key] !== undefined)
  56. {
  57. result.push(cache[key]);
  58. }
  59. else if (useLs)
  60. {
  61. try
  62. {
  63. value = localStorage.getItem(key);
  64. }
  65. catch (e)
  66. {
  67. useLs = false;
  68. }
  69. try
  70. {
  71. value = (value === undefined || value === null) ? false : JSON.parse(value);
  72. }
  73. catch (e)
  74. {
  75. value = false;
  76. }
  77. result.push(cache[key] = value);
  78. }
  79. else if (!useCs)
  80. {
  81. result.push(cache[key] = false);
  82. }
  83. else
  84. {
  85. allFound = false;
  86. }
  87. }
  88. if (allFound)
  89. {
  90. return callback(single ? result[0] : result);
  91. }
  92. chrome.storage.local.get(keys, function(resultObj)
  93. {
  94. var value;
  95. result = [];
  96. for (i = 0; i < keys.length; i++)
  97. {
  98. key = keys[i];
  99. value = resultObj[key];
  100. value = value === undefined || value === null ? false : JSON.parse(value);
  101. result.push(cache[key] = value);
  102. }
  103. callback(single ? result[0] : result);
  104. });
  105. };
  106. function storageSetValue(obj, callback)
  107. {
  108. var keyValues = {},
  109. prefix = storageGetPrefix(),
  110. key, value;
  111. for (key in obj)
  112. {
  113. if (obj.hasOwnProperty(key))
  114. {
  115. value = obj[key];
  116. key = prefix + key;
  117. cache[key] = value;
  118. value = JSON.stringify(value);
  119. if (useLs)
  120. {
  121. try
  122. {
  123. localStorage.setItem(key, value);
  124. }
  125. catch (e)
  126. {
  127. useLs = false;
  128. }
  129. }
  130. else
  131. {
  132. keyValues[key] = value;
  133. }
  134. }
  135. }
  136. if (useLs || !useCs)
  137. {
  138. if (callback)
  139. {
  140. callback();
  141. }
  142. return;
  143. }
  144. chrome.storage.local.set(keyValues, callback);
  145. };
  146. function storageRemoveValue()
  147. {
  148. var keys = Array.prototype.slice.call(arguments),
  149. prefix = storageGetPrefix(),
  150. i, key, callback;
  151. if (typeof keys[keys.length - 1] === 'function')
  152. {
  153. callback = keys.pop();
  154. }
  155. for (i = 0; i < keys.length; i++)
  156. {
  157. key = keys[i] = prefix + keys[i];
  158. delete cache[key];
  159. if (useLs)
  160. {
  161. try
  162. {
  163. localStorage.removeItem(key);
  164. }
  165. catch (e)
  166. {
  167. useLs = false;
  168. }
  169. }
  170. }
  171. if (useCs)
  172. {
  173. chrome.storage.local.remove(keys, callback);
  174. }
  175. else if (callback)
  176. {
  177. callback();
  178. }
  179. };
  180. window.ConfigStorage = {
  181. prefix: storageSetPrefix,
  182. noPrefix: storageSetNoPrefix,
  183. get: storageGetValue,
  184. set: storageSetValue,
  185. remove: storageRemoveValue
  186. };
  187. })(this);
  188. // Pollyfill for IE 9 support of CustomEvent
  189. (function () {
  190. if ( typeof window.CustomEvent === "function" ) return false;
  191. function CustomEvent ( event, params ) {
  192. params = params || { bubbles: false, cancelable: false, detail: undefined };
  193. var evt = document.createEvent( 'CustomEvent' );
  194. evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
  195. return evt;
  196. }
  197. CustomEvent.prototype = window.Event.prototype;
  198. window.CustomEvent = CustomEvent;
  199. })();