HackTimer.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. (function (workerScript) {
  2. try {
  3. var blob = new Blob (["\
  4. var fakeIdToId = {};\
  5. onmessage = function (event) {\
  6. var data = event.data,\
  7. name = data.name,\
  8. fakeId = data.fakeId,\
  9. time;\
  10. if(data.hasOwnProperty('time')) {\
  11. time = data.time;\
  12. }\
  13. switch (name) {\
  14. case 'setInterval':\
  15. fakeIdToId[fakeId] = setInterval(function () {\
  16. postMessage({fakeId: fakeId});\
  17. }, time);\
  18. break;\
  19. case 'clearInterval':\
  20. if (fakeIdToId.hasOwnProperty (fakeId)) {\
  21. clearInterval(fakeIdToId[fakeId]);\
  22. delete fakeIdToId[fakeId];\
  23. }\
  24. break;\
  25. case 'setTimeout':\
  26. fakeIdToId[fakeId] = setTimeout(function () {\
  27. postMessage({fakeId: fakeId});\
  28. if (fakeIdToId.hasOwnProperty (fakeId)) {\
  29. delete fakeIdToId[fakeId];\
  30. }\
  31. }, time);\
  32. break;\
  33. case 'clearTimeout':\
  34. if (fakeIdToId.hasOwnProperty (fakeId)) {\
  35. clearTimeout(fakeIdToId[fakeId]);\
  36. delete fakeIdToId[fakeId];\
  37. }\
  38. break;\
  39. }\
  40. }\
  41. "]);
  42. // Obtain a blob URL reference to our worker 'file'.
  43. workerScript = window.URL.createObjectURL(blob);
  44. } catch (error) {
  45. /* Blob is not supported, use external script instead */
  46. }
  47. var worker,
  48. fakeIdToCallback = {},
  49. lastFakeId = 0,
  50. maxFakeId = 0x7FFFFFFF, // 2 ^ 31 - 1, 31 bit, positive values of signed 32 bit integer
  51. logPrefix = 'HackTimer.js by turuslan: ';
  52. if (typeof (Worker) !== 'undefined') {
  53. function getFakeId () {
  54. do {
  55. if (lastFakeId == maxFakeId) {
  56. lastFakeId = 0;
  57. } else {
  58. lastFakeId ++;
  59. }
  60. } while (fakeIdToCallback.hasOwnProperty (lastFakeId));
  61. return lastFakeId;
  62. }
  63. try {
  64. worker = new Worker (workerScript);
  65. window.setInterval = function (callback, time /* , parameters */) {
  66. var fakeId = getFakeId ();
  67. fakeIdToCallback[fakeId] = {
  68. callback: callback,
  69. parameters: Array.prototype.slice.call(arguments, 2)
  70. };
  71. worker.postMessage ({
  72. name: 'setInterval',
  73. fakeId: fakeId,
  74. time: time
  75. });
  76. return fakeId;
  77. };
  78. window.clearInterval = function (fakeId) {
  79. if (fakeIdToCallback.hasOwnProperty(fakeId)) {
  80. delete fakeIdToCallback[fakeId];
  81. worker.postMessage ({
  82. name: 'clearInterval',
  83. fakeId: fakeId
  84. });
  85. }
  86. };
  87. window.setTimeout = function (callback, time /* , parameters */) {
  88. var fakeId = getFakeId ();
  89. fakeIdToCallback[fakeId] = {
  90. callback: callback,
  91. parameters: Array.prototype.slice.call(arguments, 2),
  92. isTimeout: true
  93. };
  94. worker.postMessage ({
  95. name: 'setTimeout',
  96. fakeId: fakeId,
  97. time: time
  98. });
  99. return fakeId;
  100. };
  101. window.clearTimeout = function (fakeId) {
  102. if (fakeIdToCallback.hasOwnProperty(fakeId)) {
  103. delete fakeIdToCallback[fakeId];
  104. worker.postMessage ({
  105. name: 'clearTimeout',
  106. fakeId: fakeId
  107. });
  108. }
  109. };
  110. worker.onmessage = function (event) {
  111. var data = event.data,
  112. fakeId = data.fakeId,
  113. request,
  114. parameters,
  115. callback;
  116. if (fakeIdToCallback.hasOwnProperty(fakeId)) {
  117. request = fakeIdToCallback[fakeId];
  118. callback = request.callback;
  119. parameters = request.parameters;
  120. if (request.hasOwnProperty ('isTimeout') && request.isTimeout) {
  121. delete fakeIdToCallback[fakeId];
  122. }
  123. }
  124. if (typeof (callback) === 'string') {
  125. try {
  126. callback = new Function (callback);
  127. } catch (error) {
  128. console.log (logPrefix + 'Error parsing callback code string: ', error);
  129. }
  130. }
  131. if (typeof (callback) === 'function') {
  132. callback.apply (window, parameters);
  133. }
  134. };
  135. worker.onerror = function (event) {
  136. console.log (event);
  137. };
  138. console.log (logPrefix + 'Initialisation succeeded');
  139. } catch (error) {
  140. console.log (logPrefix + 'Initialisation failed');
  141. console.error (error);
  142. }
  143. } else {
  144. console.log (logPrefix + 'Initialisation failed - HTML5 Web Worker is not supported');
  145. }
  146. }) ('HackTimerWorker.js');