diff options
Diffstat (limited to 'src/library_browser.js')
-rw-r--r-- | src/library_browser.js | 99 |
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) { |