var gData1 = "TEST_DATA_1:ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var gData2 = "TEST_DATA_2:1234567890"; var gPaddingChar = "."; var gPaddingSize = 10000; var gPadding = ""; for (var i = 0; i < gPaddingSize; i++) { gPadding += gPaddingChar; } function ok(a, msg) { postMessage({ type: "status", status: !!a, msg }); } function is(a, b, msg) { postMessage({ type: "status", status: a === b, msg }); } function checkData(response, data_head, cb) { ok(response, "Data is non-null"); var str = String.fromCharCode.apply(null, new Uint8Array(response)); ok(str.length == data_head.length + gPaddingSize, "Data size is correct"); ok(str.slice(0, data_head.length) == data_head, "Data head is correct"); ok(str.slice(data_head.length) == gPadding, "Data padding is correct"); cb(); } self.onmessage = function onmessage(event) { var jar = event.data; function makeJarURL(entry) { return "jar:" + jar + "!/" + entry; } function test_mapped_sync() { var xhr = new XMLHttpRequest({ mozAnon: true, mozSystem: true }); xhr.open("GET", makeJarURL("data_1.txt"), false); xhr.responseType = "arraybuffer"; xhr.send(); if (xhr.status) { ok(xhr.status == 200, "Status is 200"); var ct = xhr.getResponseHeader("Content-Type"); ok(ct.includes("mem-mapped"), "Data is memory-mapped"); checkData(xhr.response, gData1, runTests); } } function test_mapped_async() { var xhr = new XMLHttpRequest({ mozAnon: true, mozSystem: true }); xhr.open("GET", makeJarURL("data_1.txt")); xhr.responseType = "arraybuffer"; xhr.onreadystatechange = function() { if (xhr.readyState !== xhr.DONE) { return; } if (xhr.status) { ok(xhr.status == 200, "Status is 200"); var ct = xhr.getResponseHeader("Content-Type"); ok(ct.includes("mem-mapped"), "Data is memory-mapped"); checkData(xhr.response, gData1, runTests); } }; xhr.send(); } // Make sure array buffer retrieved from compressed file in package is // handled by memory allocation instead of memory mapping. function test_non_mapped() { var xhr = new XMLHttpRequest({ mozAnon: true, mozSystem: true }); xhr.open("GET", makeJarURL("data_2.txt")); xhr.responseType = "arraybuffer"; xhr.onreadystatechange = function() { if (xhr.readyState !== xhr.DONE) { return; } if (xhr.status) { ok(xhr.status == 200, "Status is 200"); var ct = xhr.getResponseHeader("Content-Type"); ok(!ct.includes("mem-mapped"), "Data is not memory-mapped"); checkData(xhr.response, gData2, runTests); } }; xhr.send(); } var tests = [test_mapped_sync, test_mapped_async, test_non_mapped]; function runTests() { if (!tests.length) { postMessage({ type: "finish" }); return; } var test = tests.shift(); test(); } runTests(); };