15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Called by the common.js module.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function domContentLoaded(name, tc, config, width, height) {
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var listener = document.getElementById('listener');
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener.addEventListener('loadstart', moduleDidStartLoad, true);
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener.addEventListener('progress', moduleLoadProgress, true);
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener.addEventListener('error', moduleLoadError, true);
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener.addEventListener('abort', moduleLoadAbort, true);
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener.addEventListener('load', moduleDidLoad, true);
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener.addEventListener('loadend', moduleDidEndLoad, true);
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener.addEventListener('message', handleMessage, true);
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  common.createNaClModule(name, tc, config, width, height);
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handler that gets called when the NaCl module starts loading.  This
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// event is always triggered when an <EMBED> tag has a MIME type of
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// application/x-nacl.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function moduleDidStartLoad() {
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  common.logMessage('loadstart');
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Progress event handler.  |event| contains a couple of interesting
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// properties that are used in this example:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     total The size of the NaCl module in bytes.  Note that this value
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         is 0 until |lengthComputable| is true.  In particular, this
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         value is 0 for the first 'progress' event.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     loaded The number of bytes loaded so far.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     lengthComputable A boolean indicating that the |total| field
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         represents a valid length.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// event The ProgressEvent that triggered this handler.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function moduleLoadProgress(event) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var loadPercent = 0.0;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var loadPercentString;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event.lengthComputable && event.total > 0) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loadPercent = event.loaded / event.total * 100.0;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loadPercentString = loadPercent + '%';
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    common.logMessage('progress: ' + event.url + ' ' + loadPercentString +
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                     ' (' + event.loaded + ' of ' + event.total + ' bytes)');
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The total length is not yet known.
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    common.logMessage('progress: Computing...');
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handler that gets called if an error occurred while loading the NaCl
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// module.  Note that the event does not carry any meaningful data about
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the error, you have to check lastError on the <EMBED> element to find
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// out what happened.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function moduleLoadError() {
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  common.logMessage('error: ' + common.naclModule.lastError);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handler that gets called if the NaCl module load is aborted.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function moduleLoadAbort() {
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  common.logMessage('abort');
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When the NaCl module has loaded indicate success.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function moduleDidLoad() {
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  common.logMessage('load');
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  common.updateStatus('LOADED');
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handler that gets called when the NaCl module loading has completed.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// You will always get one of these events, regardless of whether the NaCl
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// module loaded successfully or not.  For example, if there is an error
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// during load, you will get an 'error' event and a 'loadend' event.  Note
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that if the NaCl module loads successfully, you will get both a 'load'
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// event and a 'loadend' event.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function moduleDidEndLoad() {
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  common.logMessage('loadend');
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var lastError = event.target.lastError;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (lastError == undefined || lastError.length == 0) {
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    lastError = '<none>';
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  common.logMessage('lastError: ' + lastError);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handle a message coming from the NaCl module.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function handleMessage(message_event) {
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  common.logMessage('Received PostMessage: ' + message_event.data);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
88