<!-- Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/
-->
<html>
<head>
<title>WebAssembly.compile Test</title>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<script>
const testingFunctions = SpecialPowers.Cu.getJSTestingFunctions();
const wasmIsSupported = SpecialPowers.unwrap(testingFunctions.wasmIsSupported);
const wasmHasTier2CompilationCompleted = SpecialPowers.unwrap(testingFunctions.wasmHasTier2CompilationCompleted);
const wasmLoadedFromCache = SpecialPowers.unwrap(testingFunctions.wasmLoadedFromCache);
const isCachingEnabled = SpecialPowers.getBoolPref("javascript.options.wasm_caching");
// The test_webassembly_compile_sample.wasm is a medium-sized module with 100
// functions that call each other recursively, returning a computed sum.
// Any other non-trivial module could be generated and used. var sampleCode;
const sampleURL = "test_webassembly_compile_sample.wasm";
const sampleFileSize = 16053;
const sampleURLWithRandomQuery = () => sampleURL + "?id=" + String(Math.ceil(Math.random()*100000));
const sampleExportName = "run";
const sampleResult = 1275;
function checkSampleModule(m) {
ok(m instanceof WebAssembly.Module, "got a module"); var i = new WebAssembly.Instance(m);
ok(i instanceof WebAssembly.Instance, "got an instance");
ok(i.exports[sampleExportName]() === sampleResult, "got result");
}
function checkSampleInstance(i) {
ok(i instanceof WebAssembly.Instance, "got a module");
ok(i.exports[sampleExportName]() === sampleResult, "got result");
}
function propertiesExist() {
if (!wasmIsSupported()) {
ok(!this.WebAssembly, "If the device doesn't support, there will be no WebAssembly object");
SimpleTest.finish();
return;
}
ok(WebAssembly, "WebAssembly object should exist");
ok(WebAssembly.compile, "WebAssembly.compile function should exist");
runTest();
}
function compileSuccess() {
WebAssembly.compile(sampleCode).then(
m => { checkSampleModule(m); runTest(); }
).catch(
err => { ok(false, String(err)); runTest(); }
);
}
function compileManySuccess() {
const N = 100;
var arr = [];
for (var i = 0; i < N; i++)
arr.push(WebAssembly.compile(sampleCode));
SpecialPowers.gc();
Promise.all(arr).then(ms => {
ok(ms.length === N, "got the right number");
for (var j = 0; j < N; j++)
checkSampleModule(ms[j]);
runTest();
}).catch(
err => { ok(false, String(err)); runTest(); }
);
}
function terminateCompileInWorker() { var w = new Worker(`data:text/plain, var sampleCode;
function spawnWork() {
const N = 100; var arr = [];
for (var i = 0; i < N; i++)
arr.push(WebAssembly.compile(sampleCode));
Promise.all(arr).then(spawnWork);
}
onmessage = e => {
sampleCode = e.data;
spawnWork();
postMessage("ok");
}
`);
w.postMessage(sampleCode);
w.onmessage = e => {
ok(e.data === "ok", "worker finished first step");
w.terminate();
runTest();
};
}
function compileCachedCompressed() {
const url = sampleURLWithRandomQuery();
// It is a rough estimate that compilation code is about
// 2-4 times of the wasm file size. After it compression
// it will be less (about 60% ?)
const EstimatedCompilationArtifactSize = 2 * sampleFileSize;
const EstimatedCompressedArtifactSize = 0.6 * EstimatedCompilationArtifactSize;
// Set limit on cache entry so it will fail if it is not
// compressed.
const cleanup = () => {
SpecialPowers.clearUserPref("browser.cache.disk.max_entry_size")
};
Promise.resolve(SpecialPowers.setIntPref("browser.cache.disk.max_entry_size",
Math.round(EstimatedCompressedArtifactSize / 1024) /* kb */))
.then(() => WebAssembly.compileStreaming(fetch(url)))
.then(module => {
checkSampleModule(module);
ok(!wasmLoadedFromCache(module), "not cached yet");
while(!wasmHasTier2CompilationCompleted(module));
return WebAssembly.compileStreaming(fetch(url));
})
.then(module => {
checkSampleModule(module);
ok(wasmLoadedFromCache(module), "loaded from cache");
})
.then(() => { cleanup(); runTest() })
.catch(err => { cleanup(); ok(false, String(err)) });
}
function compileCachedTooLargeForCache() {
const url = sampleURLWithRandomQuery();
// Set unreasonable limit, caching will fail.
// Bug 1719508 can change name of pref, this and
// compileCachedCompressed tests will become invalid.
const cleanup = () => {
SpecialPowers.clearUserPref("browser.cache.disk.max_entry_size")
};
Promise.resolve(SpecialPowers.setIntPref("browser.cache.disk.max_entry_size", 1 /* kb */))
.then(() => WebAssembly.compileStreaming(fetch(url)))
.then(module => {
console.log(module)
checkSampleModule(module);
ok(!wasmLoadedFromCache(module), "not cached yet");
while(!wasmHasTier2CompilationCompleted(module));
return WebAssembly.compileStreaming(fetch(url));
})
.then(module => {
checkSampleModule(module);
ok(!wasmLoadedFromCache(module), "not cached (size limit)");
})
.then(() => { cleanup(); runTest() })
.catch(err => { cleanup(); ok(false, String(err)) });
}
const Original = "original";
const Clone = "clone";
function compileManyStreamingFetch() {
const N = 20;
var arr = [];
for (var i = 0; i < N; i++)
arr.push(WebAssembly.compileStreaming(fetch(sampleURL)));
SpecialPowers.gc();
Promise.all(arr).then(ms => {
ok(ms.length === N, "got the right number");
for (var j = 0; j < N; j++)
checkSampleModule(ms[j]);
runTest();
}).catch(
err => { ok(false, String(err)); runTest(); }
);
}
function runWorkerTests() { var w = new Worker("test_webassembly_compile_worker.js");
w.postMessage(sampleCode);
w.onmessage = e => {
ok(e.data === "ok", "worker test: " + e.data);
runTest();
};
}
function terminateCompileStreamingInWorker() { var w = new Worker("test_webassembly_compile_worker_terminate.js");
w.onmessage = e => {
ok(e.data === "ok", "worker streaming terminate test: " + e.data);
w.terminate();
runTest();
};
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.