| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 'use strict'; | 5 'use strict'; |
| 6 | 6 |
| 7 var naclModule = null; | 7 var naclModule = null; |
| 8 | 8 |
| 9 /** | 9 /** |
| 10 * MIME type for PNaCl | 10 * MIME type for PNaCl |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 var listenerDiv = document.getElementById('listener'); | 59 var listenerDiv = document.getElementById('listener'); |
| 60 listenerDiv.appendChild(moduleEl); | 60 listenerDiv.appendChild(moduleEl); |
| 61 } | 61 } |
| 62 | 62 |
| 63 /** | 63 /** |
| 64 * Add the default event listeners to the element with id "listener". | 64 * Add the default event listeners to the element with id "listener". |
| 65 */ | 65 */ |
| 66 function attachDefaultListeners() { | 66 function attachDefaultListeners() { |
| 67 var listenerDiv = document.getElementById('listener'); | 67 var listenerDiv = document.getElementById('listener'); |
| 68 listenerDiv.addEventListener('load', moduleDidLoad, true); | 68 listenerDiv.addEventListener('load', moduleDidLoad, true); |
| 69 listenerDiv.addEventListener('error', moduleLoadError, true); |
| 69 listenerDiv.addEventListener('progress', moduleLoadProgress, true); | 70 listenerDiv.addEventListener('progress', moduleLoadProgress, true); |
| 70 listenerDiv.addEventListener('message', handleMessage, true); | 71 listenerDiv.addEventListener('message', handleMessage, true); |
| 71 listenerDiv.addEventListener('crash', handleCrash, true); | 72 listenerDiv.addEventListener('crash', handleCrash, true); |
| 72 if (typeof window.attachListeners !== 'undefined') { | 73 if (typeof window.attachListeners !== 'undefined') { |
| 73 window.attachListeners(); | 74 window.attachListeners(); |
| 74 } | 75 } |
| 75 } | 76 } |
| 76 | 77 |
| 77 /** | 78 /** |
| 78 * Called when the Browser can not communicate with the Module | 79 * Called when the Browser can not communicate with the Module |
| (...skipping 16 matching lines...) Expand all Loading... |
| 95 /** | 96 /** |
| 96 * Called when the NaCl module is loaded. | 97 * Called when the NaCl module is loaded. |
| 97 * | 98 * |
| 98 * This event listener is registered in attachDefaultListeners above. | 99 * This event listener is registered in attachDefaultListeners above. |
| 99 */ | 100 */ |
| 100 function moduleDidLoad() { | 101 function moduleDidLoad() { |
| 101 var bar = document.getElementById('progress'); | 102 var bar = document.getElementById('progress'); |
| 102 bar.value = 100; | 103 bar.value = 100; |
| 103 bar.max = 100; | 104 bar.max = 100; |
| 104 naclModule = document.getElementById('nacl_module'); | 105 naclModule = document.getElementById('nacl_module'); |
| 105 updateStatus('RUNNING'); | 106 hideStatus(); |
| 107 } |
| 106 | 108 |
| 107 setAuxElementsVisibility(true); | 109 function hideStatus() { |
| 110 document.getElementById('statusField').style.display = 'none'; |
| 111 document.getElementById('progress').style.display = 'none'; |
| 112 } |
| 113 |
| 114 function moduleLoadError(event) { |
| 115 updateStatus('Load failed.'); |
| 108 } | 116 } |
| 109 | 117 |
| 110 /** | 118 /** |
| 111 * Called when the plugin reports progress events. | 119 * Called when the plugin reports progress events. |
| 112 * | 120 * |
| 113 * @param {Object} event | 121 * @param {Object} event |
| 114 */ | 122 */ |
| 115 function moduleLoadProgress(event) { | 123 function moduleLoadProgress(event) { |
| 124 document.getElementById('progress').style.display = 'block'; |
| 125 |
| 116 var loadPercent = 0.0; | 126 var loadPercent = 0.0; |
| 117 var bar = document.getElementById('progress'); | 127 var bar = document.getElementById('progress'); |
| 118 bar.max = 100; | 128 bar.max = 100; |
| 119 if (event.lengthComputable && event.total > 0) { | 129 if (event.lengthComputable && event.total > 0) { |
| 120 loadPercent = event.loaded / event.total * 100.0; | 130 loadPercent = event.loaded / event.total * 100.0; |
| 121 } else { | 131 } else { |
| 122 // The total length is not yet known. | 132 // The total length is not yet known. |
| 123 loadPercent = -1.0; | 133 loadPercent = -1.0; |
| 124 } | 134 } |
| 125 bar.value = loadPercent; | 135 bar.value = loadPercent; |
| 126 } | 136 } |
| 127 | 137 |
| 128 /** | 138 /** |
| 129 * Return true when |s| starts with the string |prefix|. | 139 * Return true when |s| starts with the string |prefix|. |
| 130 * | 140 * |
| 131 * @param {string} s The string to search. | 141 * @param {string} s The string to search. |
| 132 * @param {string} prefix The prefix to search for in |s|. | 142 * @param {string} prefix The prefix to search for in |s|. |
| 133 * @return {bool} | 143 * @return {bool} |
| 134 */ | 144 */ |
| 135 function startsWith(s, prefix) { | 145 function startsWith(s, prefix) { |
| 136 // indexOf would search the entire string, lastIndexOf(p, 0) only checks at | 146 // indexOf would search the entire string, lastIndexOf(p, 0) only checks at |
| 137 // the first index. See: http://stackoverflow.com/a/4579228 | 147 // the first index. See: http://stackoverflow.com/a/4579228 |
| 138 return s.lastIndexOf(prefix, 0) === 0; | 148 return s.lastIndexOf(prefix, 0) === 0; |
| 139 } | 149 } |
| 140 | 150 |
| 141 /** | 151 /** |
| 142 * Add a message to an element with id "log". | |
| 143 * | |
| 144 * This function is used by the default "log:" message handler. | |
| 145 * | |
| 146 * @param {string} message The message to log. | |
| 147 */ | |
| 148 function logMessage(message) { | |
| 149 document.getElementById('log').textContent = logMessageArray.join(''); | |
| 150 console.log(message); | |
| 151 } | |
| 152 | |
| 153 var defaultMessageTypes = { | |
| 154 'alert': alert, | |
| 155 'log': logMessage | |
| 156 }; | |
| 157 | |
| 158 /** | |
| 159 * Called when the NaCl module sends a message to JavaScript (via | |
| 160 * PPB_Messaging.PostMessage()) | |
| 161 * | |
| 162 * This event listener is registered in createNaClModule above. | |
| 163 * | |
| 164 * @param {Event} message_event A message event. message_event.data contains | |
| 165 * the data sent from the NaCl module. | |
| 166 */ | |
| 167 function handleMessage(message_event) { | |
| 168 if (typeof message_event.data === 'string') { | |
| 169 for (var type in defaultMessageTypes) { | |
| 170 if (defaultMessageTypes.hasOwnProperty(type)) { | |
| 171 if (startsWith(message_event.data, type + ':')) { | |
| 172 func = defaultMessageTypes[type]; | |
| 173 func(message_event.data.slice(type.length + 1)); | |
| 174 return; | |
| 175 } | |
| 176 } | |
| 177 } | |
| 178 } | |
| 179 | |
| 180 if (typeof window.handleMessage !== 'undefined') { | |
| 181 window.handleMessage(message_event); | |
| 182 return; | |
| 183 } | |
| 184 | |
| 185 logMessage('Unhandled message: ' + message_event.data + '\n'); | |
| 186 } | |
| 187 | |
| 188 /** | |
| 189 * Called when the DOM content has loaded; i.e. the page's document is fully | 152 * Called when the DOM content has loaded; i.e. the page's document is fully |
| 190 * parsed. At this point, we can safely query any elements in the document via | 153 * parsed. At this point, we can safely query any elements in the document via |
| 191 * document.querySelector, document.getElementById, etc. | 154 * document.querySelector, document.getElementById, etc. |
| 192 * | 155 * |
| 193 * @param {string} name The name of the example. | 156 * @param {string} name The name of the example. |
| 194 * @param {number} width The width to create the plugin. | 157 * @param {number} width The width to create the plugin. |
| 195 * @param {number} height The height to create the plugin. | 158 * @param {number} height The height to create the plugin. |
| 196 * @param {Object} attrs Optional dictionary of additional attributes. | 159 * @param {Object} attrs Optional dictionary of additional attributes. |
| 197 */ | 160 */ |
| 198 function domContentLoaded(name, width, height, attrs) { | 161 function domContentLoaded(name, width, height, attrs) { |
| 199 // If the page loads before the Native Client module loads, then set the | 162 updateStatus('Loading...'); |
| 200 // status message indicating that the module is still loading. Otherwise, | |
| 201 // do not change the status message. | |
| 202 setAuxElementsVisibility(false); | |
| 203 updateStatus('Page loaded.'); | |
| 204 if (!browserSupportsPNaCl()) { | 163 if (!browserSupportsPNaCl()) { |
| 205 updateStatus('Browser does not support PNaCl or PNaCl is disabled'); | 164 updateStatus('Browser does not support PNaCl or PNaCl is disabled'); |
| 206 } else if (naclModule == null) { | 165 } else if (naclModule == null) { |
| 207 // We use a non-zero sized embed to give Chrome space to place the bad | 166 // We use a non-zero sized embed to give Chrome space to place the bad |
| 208 // plug-in graphic, if there is a problem. | 167 // plug-in graphic, if there is a problem. |
| 209 width = typeof width !== 'undefined' ? width : 200; | 168 width = typeof width !== 'undefined' ? width : 200; |
| 210 height = typeof height !== 'undefined' ? height : 200; | 169 height = typeof height !== 'undefined' ? height : 200; |
| 211 createNaClModule(name, width, height, attrs); | 170 createNaClModule(name, width, height, attrs); |
| 212 attachDefaultListeners(); | 171 attachDefaultListeners(); |
| 213 } else { | 172 } else { |
| 214 // It's possible that the Native Client module onload event fired | 173 // It's possible that the Native Client module onload event fired |
| 215 // before the page's onload event. In this case, the status message | 174 // before the page's onload event. In this case, the status message |
| 216 // will reflect 'SUCCESS', but won't be displayed. This call will | 175 // will reflect 'SUCCESS', but won't be displayed. This call will |
| 217 // display the current message. | 176 // display the current message. |
| 218 updateStatus('Waiting.'); | 177 updateStatus('Waiting.'); |
| 219 } | 178 } |
| 220 } | 179 } |
| 221 | 180 |
| 222 /** | 181 /** |
| 223 * If the element with id 'statusField' exists, then set its HTML to the status | 182 * If the element with id 'statusField' exists, then set its HTML to the status |
| 224 * message as well. | 183 * message as well. |
| 225 * | 184 * |
| 226 * @param {string} opt_message The message to set. | 185 * @param {string} opt_message The message to set. |
| 227 */ | 186 */ |
| 228 function updateStatus(opt_message) { | 187 function updateStatus(opt_message) { |
| 229 var statusField = document.getElementById('statusField'); | 188 var statusField = document.getElementById('statusField'); |
| 230 if (statusField) { | 189 if (statusField) { |
| 231 statusField.innerHTML = opt_message; | 190 statusField.style.display = 'block'; |
| 232 } | 191 statusField.textContent = opt_message; |
| 233 } | |
| 234 | |
| 235 function postThreadFunc(numThreads) { | |
| 236 return function() { | |
| 237 naclModule.postMessage({'message' : 'set_threads', | |
| 238 'value' : numThreads}); | |
| 239 } | 192 } |
| 240 } | 193 } |
| 241 | 194 |
| 242 // Add event listeners after the NaCl module has loaded. These listeners will | 195 // Add event listeners after the NaCl module has loaded. These listeners will |
| 243 // forward messages to the NaCl module via postMessage() | 196 // forward messages to the NaCl module via postMessage() |
| 244 function attachListeners() { | 197 function attachListeners() { |
| 245 var threads = [0, 1, 2, 4, 6, 8, 12, 16, 24, 32]; | 198 document.getElementById('threadCount').addEventListener('change', |
| 246 for (var i = 0; i < threads.length; i++) { | 199 function() { |
| 247 document.getElementById('radio' + i).addEventListener('click', | 200 var value = parseInt(document.getElementById('threadCount').value); |
| 248 postThreadFunc(threads[i])); | 201 naclModule.postMessage({'message': 'set_threads', |
| 249 } | 202 'value': value}); |
| 203 }); |
| 250 document.getElementById('zoomRange').addEventListener('change', | 204 document.getElementById('zoomRange').addEventListener('change', |
| 251 function() { | 205 function() { |
| 252 var value = parseFloat(document.getElementById('zoomRange').value); | 206 var value = parseFloat(document.getElementById('zoomRange').value); |
| 253 naclModule.postMessage({'message' : 'set_zoom', | 207 naclModule.postMessage({'message' : 'set_zoom', |
| 254 'value' : value}); | 208 'value' : value}); |
| 255 }); | 209 }); |
| 256 document.getElementById('lightRange').addEventListener('change', | 210 document.getElementById('lightRange').addEventListener('change', |
| 257 function() { | 211 function() { |
| 258 var value = parseFloat(document.getElementById('lightRange').value); | 212 var value = parseFloat(document.getElementById('lightRange').value); |
| 259 naclModule.postMessage({'message' : 'set_light', | 213 naclModule.postMessage({'message' : 'set_light', |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 var value = attr[1]; | 294 var value = attr[1]; |
| 341 attrs[key] = value; | 295 attrs[key] = value; |
| 342 } | 296 } |
| 343 } | 297 } |
| 344 | 298 |
| 345 domContentLoaded(body.dataset.name, | 299 domContentLoaded(body.dataset.name, |
| 346 body.dataset.width, | 300 body.dataset.width, |
| 347 body.dataset.height, attrs); | 301 body.dataset.height, attrs); |
| 348 } | 302 } |
| 349 }); | 303 }); |
| OLD | NEW |