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 + '%';
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The total length is not yet known.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loadPercent = -1.0;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loadPercentString = 'Computing...';
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  common.logMessage('progress: ' + loadPercentString +
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                   ' (' + event.loaded + ' of ' + event.total + ' bytes)');
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handler that gets called if an error occurred while loading the NaCl
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// module.  Note that the event does not carry any meaningful data about
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the error, you have to check lastError on the <EMBED> element to find
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// out what happened.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function moduleLoadError() {
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  common.logMessage('error: ' + common.naclModule.lastError);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handler that gets called if the NaCl module load is aborted.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function moduleLoadAbort() {
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  common.logMessage('abort');
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When the NaCl module has loaded indicate success.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function moduleDidLoad() {
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  common.logMessage('load');
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  common.updateStatus('LOADED');
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handler that gets called when the NaCl module loading has completed.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// You will always get one of these events, regardless of whether the NaCl
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// module loaded successfully or not.  For example, if there is an error
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// during load, you will get an 'error' event and a 'loadend' event.  Note
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that if the NaCl module loads successfully, you will get both a 'load'
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// event and a 'loadend' event.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function moduleDidEndLoad() {
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  common.logMessage('loadend');
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var lastError = event.target.lastError;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (lastError == undefined || lastError.length == 0) {
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    lastError = '<none>';
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  common.logMessage('lastError: ' + lastError);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handle a message coming from the NaCl module.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function handleMessage(message_event) {
87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  common.logMessage('Received PostMessage: ' + message_event.data);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
89