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.js107
1 files changed, 80 insertions, 27 deletions
diff --git a/src/library_browser.js b/src/library_browser.js
index ce59dbdd..3ac61dc5 100644
--- a/src/library_browser.js
+++ b/src/library_browser.js
@@ -23,10 +23,39 @@ mergeInto(LibraryManager.library, {
}
Browser.mainLoop.shouldPause = false;
},
+ updateStatus: function() {
+ if (Module['setStatus']) {
+ var remaining = Browser.mainLoop.remainingBlockers;
+ var expected = Browser.mainLoop.expectedBlockers;
+ if (remaining) {
+ if (remaining < expected) {
+ Module['setStatus']('Please wait... (' + (expected - remaining) + '/' + expected + ')');
+ } else {
+ Module['setStatus']('Please wait...');
+ }
+ } else {
+ Module['setStatus']('');
+ }
+ }
+ }
},
pointerLock: false,
moduleContextCreatedCallbacks: [],
+ ensureObjects: function() {
+ if (Browser.ensured) return;
+ Browser.ensured = true;
+ try {
+ new Blob();
+ Browser.hasBlobConstructor = true;
+ } catch(e) {
+ Browser.hasBlobConstructor = false;
+ console.log("warning: no blob constructor, cannot create blobs with mimetypes");
+ }
+ Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : console.log("warning: cannot build blobs"));
+ Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : console.log("warning: cannot create object URLs");
+ },
+
createContext: function(canvas, useWebGL, setInModule) {
#if !USE_TYPED_ARRAYS
if (useWebGL) {
@@ -172,38 +201,52 @@ mergeInto(LibraryManager.library, {
xhr.send(null);
},
- asyncLoad: function(url, callback) {
+ asyncLoad: function(url, onload, onerror) {
Browser.xhrLoad(url, function(arrayBuffer) {
assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).');
- callback(new Uint8Array(arrayBuffer));
- removeRunDependency();
+ onload(new Uint8Array(arrayBuffer));
+ removeRunDependency('al ' + url);
}, function(event) {
- throw 'Loading data file "' + url + '" failed.';
+ if (onerror) {
+ onerror();
+ } else {
+ throw 'Loading data file "' + url + '" failed.';
+ }
});
- addRunDependency();
- }
+ addRunDependency('al ' + url);
+ },
+
+ isImageFile: function(name) {
+ return name.substr(-4) in { '.jpg': 1, '.png': 1, '.bmp': 1 };
+ },
+
+ isAudioFile: function(name) {
+ return name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 };
+ },
+
+ getAudioMimetype: function(name) {
+ var ret = { 'ogg': 'audio/ogg', 'wav': 'audio/wav', 'mp3': 'audio/mpeg' }[name.substr(-3)];
+ assert(ret);
+ return ret;
+ },
+
},
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) {
+ var _url = Pointer_stringify(url);
+ var _file = Pointer_stringify(file);
+ var index = _file.lastIndexOf('/');
+ FS.createPreloadedFile(
+ _file.substr(0, index),
+ _file.substr(index +1),
+ _url, true, true,
+ function() {
FUNCTION_TABLE[onload](file);
- }
- }, function(event) {
- if (onerror) {
+ },
+ function() {
FUNCTION_TABLE[onerror](file);
}
- });
+ );
},
emscripten_async_run_script__deps: ['emscripten_run_script'],
@@ -222,8 +265,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']('');
+ var start = Date.now();
+ var blocker = Browser.mainLoop.queue.shift();
+ blocker.func();
+ console.log('main loop blocker "' + blocker.name + '" took ' + (Date.now() - start) + ' ms');
+ if (Browser.mainLoop.remainingBlockers) Browser.mainLoop.remainingBlockers--;
+ Browser.mainLoop.updateStatus();
setTimeout(wrapper, 0);
return;
}
@@ -267,9 +314,15 @@ mergeInto(LibraryManager.library, {
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_push_main_loop_blocker: function(func, name) {
+ Browser.mainLoop.queue.push({ func: FUNCTION_TABLE[func], name: Pointer_stringify(name) });
+ Browser.mainLoop.updateStatus();
+ },
+
+ emscripten_set_main_loop_expected_blockers: function(num) {
+ Browser.mainLoop.expectedBlockers = num;
+ Browser.mainLoop.remainingBlockers = num;
+ Browser.mainLoop.updateStatus();
},
emscripten_async_call: function(func, millis) {