aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Kligman <ack@mozilla.com>2013-04-18 02:28:41 -0400
committerAlan Kligman <ack@mozilla.com>2013-04-25 00:58:25 -0400
commit3839dd4deaeb4d9983bd64f58556190d3980fb41 (patch)
tree64a728535ada3fdf4c0f0356577f1f26af08aee5
parentd0d52b189b23f45a18dce0118296723e0ca2fb0d (diff)
Add --use-preload-cache flag to enable indexeddb preload cache. Defaults to original behaviour.
-rw-r--r--tools/file_packager.py209
1 files changed, 116 insertions, 93 deletions
diff --git a/tools/file_packager.py b/tools/file_packager.py
index 3598c857..e7a39079 100644
--- a/tools/file_packager.py
+++ b/tools/file_packager.py
@@ -359,7 +359,7 @@ if has_preloaded:
byteArray = new Uint8Array(decompressed);
%s
});
-''' % use_data
+ ''' % use_data
code += r'''
if (!Module.expectedDataFileDownloads) {
@@ -376,76 +376,101 @@ if has_preloaded:
var PACKAGE_STORE_NAME = 'PACKAGES';
var PACKAGE_NAME = '%s';
var REMOTE_PACKAGE_NAME = '%s';
+ ''' % (data_target, os.path.basename(Compression.compressed_name(data_target) if Compression.on else data_target))
- function openDatabase(callback, errback) {
- var openRequest = indexedDB.open(DB_NAME);
- openRequest.onupgradeneeded = function(event) {
- var db = event.target.result;
+ if use_preload_cache:
+ code += r'''
+ function openDatabase(callback, errback) {
+ var openRequest = indexedDB.open(DB_NAME);
+ openRequest.onupgradeneeded = function(event) {
+ var db = event.target.result;
- if(db.objectStoreNames.contains(PACKAGE_STORE_NAME)) {
- db.deleteObjectStore(PACKAGE_STORE_NAME);
- }
- var packages = db.createObjectStore(PACKAGE_STORE_NAME);
+ if(db.objectStoreNames.contains(PACKAGE_STORE_NAME)) {
+ db.deleteObjectStore(PACKAGE_STORE_NAME);
+ }
+ var packages = db.createObjectStore(PACKAGE_STORE_NAME);
- if(db.objectStoreNames.contains(METADATA_STORE_NAME)) {
- db.deleteObjectStore(METADATA_STORE_NAME);
- }
- var metadata = db.createObjectStore(METADATA_STORE_NAME);
- };
- openRequest.onsuccess = function(event) {
- var db = event.target.result;
- callback(db);
- };
- openRequest.onerror = function(error) {
- errback(error);
+ if(db.objectStoreNames.contains(METADATA_STORE_NAME)) {
+ db.deleteObjectStore(METADATA_STORE_NAME);
+ }
+ var metadata = db.createObjectStore(METADATA_STORE_NAME);
+ };
+ openRequest.onsuccess = function(event) {
+ var db = event.target.result;
+ callback(db);
+ };
+ openRequest.onerror = function(error) {
+ errback(error);
+ };
};
- };
- /* Check if there's a cached package, and if so whether it's the latest available */
- function checkCachedPackage(db, packageName, callback, errback) {
- var transaction = db.transaction([METADATA_STORE_NAME], IDB_RO);
- var metadata = transaction.objectStore(METADATA_STORE_NAME);
+ /* Check if there's a cached package, and if so whether it's the latest available */
+ function checkCachedPackage(db, packageName, callback, errback) {
+ var transaction = db.transaction([METADATA_STORE_NAME], IDB_RO);
+ var metadata = transaction.objectStore(METADATA_STORE_NAME);
- var getRequest = metadata.get(packageName);
- getRequest.onsuccess = function(event) {
- var result = event.target.result;
- if(!result) {
- return callback(false);
- }
- var mtime = result.mtime;
- var xhr = new XMLHttpRequest();
- xhr.open('HEAD', packageName, true);
- xhr.setRequestHeader('If-Modified-Since', mtime);
- xhr.setRequestHeader('Cache-Control', 'no-cache');
- xhr.onreadystatechange = function() {
- if(4 === xhr.readyState) {
- console.log('DEBUG', packageName, mtime, xhr.getResponseHeader('Last-Modified'), xhr.status);
- var useCached = (304 === xhr.status);
- return callback(useCached);
+ var getRequest = metadata.get(packageName);
+ getRequest.onsuccess = function(event) {
+ var result = event.target.result;
+ if(!result) {
+ return callback(false);
}
+ var mtime = result.mtime;
+ var xhr = new XMLHttpRequest();
+ xhr.open('HEAD', packageName, true);
+ xhr.setRequestHeader('If-Modified-Since', mtime);
+ xhr.setRequestHeader('Cache-Control', 'no-cache');
+ xhr.onreadystatechange = function() {
+ if(4 === xhr.readyState) {
+ console.log('DEBUG', packageName, mtime, xhr.getResponseHeader('Last-Modified'), xhr.status);
+ var useCached = (304 === xhr.status);
+ return callback(useCached);
+ }
+ };
+ xhr.send(null);
+ };
+ getRequest.onerror = function(error) {
+ errback(error);
};
- xhr.send(null);
- };
- getRequest.onerror = function(error) {
- errback(error);
};
- };
- function fetchCachedPackage(db, packageName, callback, errback) {
- var transaction = db.transaction([PACKAGE_STORE_NAME], IDB_RO);
- var packages = transaction.objectStore(PACKAGE_STORE_NAME);
+ function fetchCachedPackage(db, packageName, callback, errback) {
+ var transaction = db.transaction([PACKAGE_STORE_NAME], IDB_RO);
+ var packages = transaction.objectStore(PACKAGE_STORE_NAME);
- var getRequest = packages.get(packageName);
- getRequest.onsuccess = function(event) {
- var result = event.target.result;
- callback(result);
+ var getRequest = packages.get(packageName);
+ getRequest.onsuccess = function(event) {
+ var result = event.target.result;
+ callback(result);
+ };
+ getRequest.onerror = function(error) {
+ errback(error);
+ };
};
- getRequest.onerror = function(error) {
- errback(error);
+
+ function cacheRemotePackage(db, packageName, packageData, packageMeta, callback, errback) {
+ var transaction = db.transaction([PACKAGE_STORE_NAME, METADATA_STORE_NAME], IDB_RW);
+ var packages = transaction.objectStore(PACKAGE_STORE_NAME);
+ var metadata = transaction.objectStore(METADATA_STORE_NAME);
+
+ var putPackageRequest = packages.put(packageData, packageName);
+ putPackageRequest.onsuccess = function(event) {
+ var putMetadataRequest = metadata.put(packageMeta, packageName);
+ putMetadataRequest.onsuccess = function(event) {
+ callback(packageData);
+ };
+ putMetadataRequest.onerror = function(error) {
+ errback(error);
+ };
+ };
+ putPackageRequest.onerror = function(error) {
+ errback(error);
+ };
};
- };
+ '''
- function fetchRemotePackage(db, packageName, callback, errback) {
+ code += r'''
+ function fetchRemotePackage(packageName, callback, errback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', packageName, true);
xhr.responseType = 'arraybuffer';
@@ -466,7 +491,7 @@ if has_preloaded:
var loaded = 0;
var num = 0;
for (var download in Module.dataFileDownloads) {
- var data = Module.dataFileDownloads[download];
+ var data = Module.dataFileDownloads[download];
total += data.total;
loaded += data.loaded;
num++;
@@ -482,24 +507,7 @@ if has_preloaded:
var packageMeta = {
'mtime': xhr.getResponseHeader('Last-Modified')
};
-
- var transaction = db.transaction([PACKAGE_STORE_NAME, METADATA_STORE_NAME], IDB_RW);
- var packages = transaction.objectStore(PACKAGE_STORE_NAME);
- var metadata = transaction.objectStore(METADATA_STORE_NAME);
-
- var putPackageRequest = packages.put(packageData, packageName);
- putPackageRequest.onsuccess = function(event) {
- var putMetadataRequest = metadata.put(packageMeta, packageName);
- putMetadataRequest.onsuccess = function(event) {
- callback(packageData);
- };
- putMetadataRequest.onerror = function(error) {
- errback(error);
- };
- };
- putPackageRequest.onerror = function(error) {
- errback(error);
- };
+ callback(packageData, packageMeta);
};
xhr.send(null);
};
@@ -516,25 +524,40 @@ if has_preloaded:
function handleError(error) {
console.error('package error:', error);
};
-
- openDatabase(
- function(db) {
- checkCachedPackage(db, PACKAGE_NAME,
- function(useCached) {
- if(useCached) {
- console.info('loading ' + PACKAGE_NAME + ' from cache');
- fetchCachedPackage(db, PACKAGE_NAME, processPackageData, handleError);
- } else {
- console.info('loading ' + PACKAGE_NAME + ' from remote');
- fetchRemotePackage(db, PACKAGE_NAME, processPackageData, handleError);
+ ''' % (use_data, data_target) # use basename because from the browser's point of view, we need to find the datafile in the same dir as the html file
+
+ if use_preload_cache:
+ code += r'''
+ openDatabase(
+ function(db) {
+ checkCachedPackage(db, PACKAGE_NAME,
+ function(useCached) {
+ if(useCached) {
+ console.info('loading ' + PACKAGE_NAME + ' from cache');
+ fetchCachedPackage(db, PACKAGE_NAME,
+ function(packageData, packageMeta) {
+ cacheRemotePackage(packageData, packageMeta, processPackageData, handleError);
+ }
+ , handleError);
+ } else {
+ console.info('loading ' + PACKAGE_NAME + ' from remote');
+ fetchRemotePackage(PACKAGE_NAME,
+ function(packageData, packageMeta) {
+ cacheRemotePackage(db, PACKAGE_NAME, packageData, packageMeta, processPackageData, handleError);
+ }
+ , handleError);
+ }
}
- }
- , handleError);
- }
- , handleError);
+ , handleError);
+ }
+ , handleError);
- if (Module['setStatus']) Module['setStatus']('Downloading...');
- ''' % (data_target, os.path.basename(Compression.compressed_name(data_target) if Compression.on else data_target), use_data, data_target) # use basename because from the browser's point of view, we need to find the datafile in the same dir as the html file
+ if (Module['setStatus']) Module['setStatus']('Downloading...');
+ '''
+ else:
+ code += r'''
+ fetchRemotePackage(PACKAGE_NAME, processPackageData, handleError);
+ '''
if pre_run:
ret += '''