aboutsummaryrefslogtreecommitdiff
path: root/src/library_browser.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/library_browser.js')
-rw-r--r--src/library_browser.js99
1 files changed, 75 insertions, 24 deletions
diff --git a/src/library_browser.js b/src/library_browser.js
index 59d37336..ce59dbdd 100644
--- a/src/library_browser.js
+++ b/src/library_browser.js
@@ -3,12 +3,26 @@
// Utilities for browser environments
mergeInto(LibraryManager.library, {
- $Browser__postset: 'Module["requestFullScreen"] = function() { Browser.requestFullScreen() };\n', // export requestFullScreen
+ $Browser__postset: 'Module["requestFullScreen"] = function() { Browser.requestFullScreen() };\n' + // exports
+ 'Module["requestAnimationFrame"] = function(func) { Browser.requestAnimationFrame(func) };\n' +
+ 'Module["pauseMainLoop"] = function() { Browser.mainLoop.pause() };\n' +
+ 'Module["resumeMainLoop"] = function() { Browser.mainLoop.resume() };\n',
$Browser: {
mainLoop: {
scheduler: null,
shouldPause: false,
- paused: false
+ paused: false,
+ queue: [],
+ pause: function() {
+ Browser.mainLoop.shouldPause = true;
+ },
+ resume: function() {
+ if (Browser.mainLoop.paused) {
+ Browser.mainLoop.paused = false;
+ Browser.mainLoop.scheduler();
+ }
+ Browser.mainLoop.shouldPause = false;
+ },
},
pointerLock: false,
moduleContextCreatedCallbacks: [],
@@ -86,6 +100,7 @@ mergeInto(LibraryManager.library, {
requestFullScreen: function() {
var canvas = Module.canvas;
function fullScreenChange() {
+ if (Module['onFullScreen']) Module['onFullScreen']();
if (document['webkitFullScreenElement'] === canvas ||
document['mozFullScreenElement'] === canvas ||
document['fullScreenElement'] === canvas) {
@@ -128,40 +143,69 @@ mergeInto(LibraryManager.library, {
window.requestAnimationFrame(func);
},
- getMovementX: function(delta, event) {
- if (!Browser.pointerLock) return delta;
+ getMovementX: function(event) {
return event['movementX'] ||
event['mozMovementX'] ||
event['webkitMovementX'] ||
- 0; // delta;
+ 0;
},
- getMovementY: function(delta, event) {
- if (!Browser.pointerLock) return delta;
+ getMovementY: function(event) {
return event['movementY'] ||
event['mozMovementY'] ||
event['webkitMovementY'] ||
- 0; // delta;
+ 0;
},
- asyncLoad: function(url, callback) {
+ xhrLoad: function(url, onload, onerror) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'arraybuffer';
xhr.onload = function() {
- var arrayBuffer = xhr.response;
+ if (xhr.status == 200) {
+ onload(xhr.response);
+ } else {
+ onerror();
+ }
+ };
+ xhr.onerror = onerror;
+ xhr.send(null);
+ },
+
+ asyncLoad: function(url, callback) {
+ Browser.xhrLoad(url, function(arrayBuffer) {
assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).');
callback(new Uint8Array(arrayBuffer));
removeRunDependency();
- };
- xhr.onerror = function(event) {
- assert(arrayBuffer, 'Loading data file "' + url + '" failed.');
- };
- xhr.send(null);
+ }, function(event) {
+ throw 'Loading data file "' + url + '" failed.';
+ });
addRunDependency();
}
},
+ emscripten_async_wget: function(url, file, onload, onerror) {
+ url = Pointer_stringify(url);
+
+ Browser.xhrLoad(url, function(response) {
+ var absolute = Pointer_stringify(file);
+ var index = absolute.lastIndexOf('/');
+ FS.createDataFile(
+ absolute.substr(0, index),
+ absolute.substr(index +1),
+ new Uint8Array(response),
+ true, true);
+
+ if (onload) {
+ FUNCTION_TABLE[onload](file);
+ }
+ }, function(event) {
+ if (onerror) {
+ FUNCTION_TABLE[onerror](file);
+ }
+ });
+ },
+
emscripten_async_run_script__deps: ['emscripten_run_script'],
emscripten_async_run_script: function(script, millis) {
Module['noExitRuntime'] = true;
@@ -177,6 +221,12 @@ mergeInto(LibraryManager.library, {
var jsFunc = FUNCTION_TABLE[func];
var wrapper = function() {
+ if (Browser.mainLoop.queue.length > 0) {
+ Browser.mainLoop.queue.shift()();
+ if (Browser.mainLoop.queue.length == 0 && Module['setStatus']) Module['setStatus']('');
+ setTimeout(wrapper, 0);
+ return;
+ }
if (Browser.mainLoop.shouldPause) {
// catch pauses from non-main loop sources
Browser.mainLoop.paused = true;
@@ -204,21 +254,22 @@ mergeInto(LibraryManager.library, {
Browser.mainLoop.scheduler();
},
- emscripten_cancel_main_loop: function(func) {
+ emscripten_cancel_main_loop: function() {
Browser.mainLoop.scheduler = null;
Browser.mainLoop.shouldPause = true;
},
- emscripten_pause_main_loop: function(func) {
- Browser.mainLoop.shouldPause = true;
+ emscripten_pause_main_loop: function() {
+ Browser.mainLoop.pause();
},
- emscripten_resume_main_loop: function(func) {
- if (Browser.mainLoop.paused) {
- Browser.mainLoop.paused = false;
- Browser.mainLoop.scheduler();
- }
- Browser.mainLoop.shouldPause = false;
+ emscripten_resume_main_loop: function() {
+ Browser.mainLoop.resume();
+ },
+
+ emscripten_push_main_loop_blocker: function(func) {
+ if (Module['setStatus']) Module['setStatus']('Please wait..');
+ Browser.mainLoop.queue.push(FUNCTION_TABLE[func]);
},
emscripten_async_call: function(func, millis) {