You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

211 line
6.2 KiB

  1. g_status_text = [null];
  2. g_status_timer = [-1.0];
  3. g_var_progress_bar = -1;
  4. g_embed_nacl_module = null;
  5. if (IsUsingNaCl()) NaClLoadingInit();
  6. function InitNaClModuleVar() { g_embed_nacl_module = GetiFrameModuleVar(); }
  7. function RegisterListener()
  8. {
  9. //Register all the correct functions to the listener
  10. var div_listener = GetiFrameDivEmbed();
  11. if (div_listener)
  12. {
  13. div_listener.addEventListener('loadstart', ModuleStartedLoad, true);
  14. div_listener.addEventListener('load', ModuleDidLoad, true);
  15. div_listener.addEventListener('error', ModuleError, true);
  16. div_listener.addEventListener('progress', ModuleLoadUpdate, true);
  17. div_listener.addEventListener('message', ModuleSentMessage, true);
  18. div_listener.addEventListener('crash', ModuleCrash, true);
  19. window.setTimeout("UpdateTextStatus(0.1)", 100);
  20. }
  21. else if (IsUsingNaCl())
  22. window.setTimeout("RegisterListener()", 200);
  23. }
  24. //-------------------------------------------------------------------------
  25. // MODULE LOADING FUNCTIONS
  26. //-------------------------------------------------------------------------
  27. //Indicate page has been loaded.
  28. function NaClLoadingInit()
  29. {
  30. HideProgressStatus(false);
  31. //Page did load before NaCl module
  32. if (!g_embed_nacl_module)
  33. AddTextStatus('Please wait for module loading');
  34. RegisterListener();
  35. }
  36. //Module starts load
  37. function ModuleStartedLoad()
  38. {
  39. AddTextStatus('Module Started Loading');
  40. InitNaClModuleVar();
  41. }
  42. //Module progress event
  43. function ModuleLoadUpdate(event)
  44. {
  45. var progress_bar = GetProgressBar();
  46. if (progress_bar)
  47. {
  48. if (event.lengthComputable)
  49. {
  50. if (progress_bar.value < 0)
  51. g_var_progress_bar = -1;
  52. var loading_text = 'Please wait, loading [' + (Math.min(1.0, event.loaded / event.total) * 100.0).toFixed(0) + '%]';
  53. //update the progress status.
  54. progress_bar.max = event.total;
  55. progress_bar.value = event.loaded;
  56. g_var_progress_bar = AddTextStatus(loading_text, g_var_progress_bar);
  57. }
  58. //Load length is not usable.
  59. else
  60. {
  61. progress_bar.value = -1;
  62. g_var_progress_bar = AddTextStatus('Please wait, calculating load balance ...', g_var_progress_bar);
  63. }
  64. }
  65. }
  66. //Indicate module load success.
  67. function ModuleDidLoad()
  68. {
  69. if (!g_embed_nacl_module)
  70. InitNaClModuleVar();
  71. //Hide the progress div
  72. AddTextStatus('Module is live, thank you for your patience.');
  73. var hide_timer = 0.1;
  74. for (var i = 0; i < g_status_timer.length; i++)
  75. if (g_status_timer[i])
  76. hide_timer = Math.max(g_status_timer[i], hide_timer);
  77. window.setTimeout('HideProgressStatus(true)', hide_timer * 1000);
  78. }
  79. //Module did crash
  80. function ModuleCrash(event)
  81. {
  82. RestartModule();
  83. AddTextStatus("Module has crashed ! Restarting ...");
  84. }
  85. //Module had an error
  86. function ModuleError(event)
  87. {
  88. RestartModule();
  89. AddTextStatus("Module Load/start Error ! Restarting ...");
  90. }
  91. //Used to restart module on crash/error/load fail ....
  92. function RestartModule()
  93. {
  94. var id_frame_embed = GetFrameData();
  95. if (id_frame_embed)
  96. {
  97. HideProgressStatus(false);
  98. window.setTimeout('GetFrameData().contentDocument.location.reload(true)', 1000);
  99. }
  100. }
  101. //-------------------------------------------------------------------------
  102. // MODULE COMMUNICATION FUNCTIONS
  103. //-------------------------------------------------------------------------
  104. //Handle message from the NaCl module
  105. function ModuleSentMessage(message)
  106. {
  107. alert('Module sent message: ' + message.data);
  108. }
  109. //Called by the "Send Mesh Command !" button
  110. function SendMessageToModule()
  111. {
  112. if (g_embed_nacl_module)
  113. g_embed_nacl_module.postMessage(GetTextAreaCodeSrc().value);
  114. else
  115. alert("Module not loaded !");
  116. }
  117. //-------------------------------------------------------------------------
  118. // PROGRESS BAR STATUS FUNCTIONS
  119. //-------------------------------------------------------------------------
  120. //Update progress bar status
  121. function UpdateTextStatus(seconds)
  122. {
  123. var div_progress_status = GetDivProgressStatus();
  124. if (div_progress_status)
  125. {
  126. div_progress_status.innerHTML = '';
  127. for (var i = 0; i < g_status_text.length; i++)
  128. {
  129. if (g_status_timer[i] == undefined || g_status_timer[i] < 0.0)
  130. {
  131. g_status_timer[i] = -1.0;
  132. g_status_text[i] = undefined;
  133. }
  134. else
  135. {
  136. g_status_timer[i] -= seconds;
  137. div_progress_status.innerHTML += g_status_text[i];
  138. //div_progress_status.innerHTML += '[' + g_status_timer[i].toFixed(2) + ']';
  139. if (i < g_status_text.length - 1)
  140. div_progress_status.innerHTML += '<br>';
  141. }
  142. }
  143. window.setTimeout("UpdateTextStatus(0.1)", 100);
  144. }
  145. }
  146. //Add text status to the stack
  147. function AddTextStatus(message, message_id)
  148. {
  149. var msg_timer = 2.0;
  150. if (message_id == undefined || message_id < 0)
  151. {
  152. for (var i = g_status_timer.length - 1; i >= 0; i--)
  153. if (g_status_timer[i])
  154. msg_timer = Math.max(msg_timer, g_status_timer[i] + 0.5);
  155. g_status_text[g_status_text.length] = message;
  156. g_status_timer[g_status_timer.length] = msg_timer;
  157. return g_status_timer.length - 1;
  158. }
  159. else
  160. {
  161. g_status_text[message_id] = message;
  162. g_status_timer[message_id] = msg_timer;
  163. return message_id;
  164. }
  165. }
  166. //Hide Progress Status and empty status texts
  167. function HideProgressStatus(should_hide)
  168. {
  169. var progress_bar = GetProgressBar();
  170. var div_progress = GetDivProgress();
  171. if (div_progress && progress_bar)
  172. {
  173. if (should_hide == true)
  174. {
  175. div_progress.style.visibility = "hidden";
  176. g_status_text.splice(0, g_status_text.length);
  177. g_status_timer.splice(0, g_status_timer.length);
  178. progress_bar.value = -1;
  179. UpdateTextStatus(1.0);
  180. }
  181. else
  182. {
  183. div_progress.style.visibility = "visible";
  184. progress_bar.value = -1;
  185. AddTextStatus('Please wait for module loading');
  186. UpdateTextStatus(1.0);
  187. }
  188. }
  189. }