browser_wasm-source-map.js (3409B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 // Test source mappings WASM sources. 7 // This test is quite general and test various functions. 8 9 const { 10 WasmRemap, 11 } = require("resource://devtools/client/shared/source-map-loader/utils/wasmRemap.js"); 12 const { 13 SourceMapConsumer, 14 } = require("resource://devtools/client/shared/vendor/source-map/source-map.js"); 15 16 SourceMapConsumer.initialize({ 17 "lib/mappings.wasm": 18 "resource://devtools/client/shared/vendor/source-map/lib/mappings.wasm", 19 }); 20 21 add_setup(function () { 22 return SpecialPowers.pushPrefEnv({ 23 set: [["security.allow_eval_with_system_principal", true]], 24 }); 25 }); 26 27 add_task(async function smokeTest() { 28 const testMap1 = { 29 version: 3, 30 file: "min.js", 31 names: [], 32 sources: ["one.js", "two.js"], 33 sourceRoot: "/the/root", 34 mappings: "CAAC,IAAM,SACU,GAAC", 35 }; 36 const testMap1Entries = [ 37 { offset: 1, line: 1, column: 1 }, 38 { offset: 5, line: 1, column: 7 }, 39 { offset: 14, line: 2, column: 17 }, 40 { offset: 17, line: 2, column: 18 }, 41 ]; 42 43 const map1 = await new SourceMapConsumer(testMap1); 44 45 const remap1 = new WasmRemap(map1); 46 47 is(remap1.file, "min.js"); 48 is(remap1.hasContentsOfAllSources(), false); 49 is(remap1.sources.length, 2); 50 is(remap1.sources[0], "/the/root/one.js"); 51 is(remap1.sources[1], "/the/root/two.js"); 52 53 const expectedEntries = testMap1Entries.slice(0); 54 remap1.eachMapping(function (entry) { 55 const expected = expectedEntries.shift(); 56 is(entry.generatedLine, expected.offset); 57 is(entry.generatedColumn, 0); 58 is(entry.originalLine, expected.line); 59 is(entry.originalColumn, expected.column); 60 is(entry.name, null); 61 }); 62 63 const pos1 = remap1.originalPositionFor({ line: 5, column: 0 }); 64 is(pos1.line, 1); 65 is(pos1.column, 7); 66 is(pos1.source, "/the/root/one.js"); 67 68 const pos2 = remap1.generatedPositionFor({ 69 source: "/the/root/one.js", 70 line: 2, 71 column: 18, 72 }); 73 is(pos2.line, 17); 74 is(pos2.column, 0); 75 is(pos2.lastColumn, undefined); 76 77 remap1.computeColumnSpans(); 78 const pos3 = remap1.allGeneratedPositionsFor({ 79 source: "/the/root/one.js", 80 line: 2, 81 column: 17, 82 }); 83 is(pos3.length, 1); 84 is(pos3[0].line, 14); 85 is(pos3[0].column, 0); 86 is(pos3[0].lastColumn, 0); 87 88 map1.destroy(); 89 }); 90 91 add_task(async function contentPresents() { 92 const testMap2 = { 93 version: 3, 94 file: "none.js", 95 names: [], 96 sources: ["zero.js"], 97 mappings: "", 98 sourcesContent: ["//test"], 99 }; 100 101 const map2 = await new SourceMapConsumer(testMap2); 102 const remap2 = new WasmRemap(map2); 103 is(remap2.file, "none.js"); 104 ok(remap2.hasContentsOfAllSources()); 105 is(remap2.sourceContentFor("zero.js"), "//test"); 106 107 map2.destroy(); 108 }); 109 110 add_task(async function readAndTransposeWasmMap() { 111 const source = { 112 id: "wasm.js", 113 sourceMapBaseURL: "wasm:http://example.com/whatever/:min.js", 114 sourceMapURL: `${URL_ROOT}fixtures/wasm.js.map`, 115 isWasm: true, 116 }; 117 118 const urls = await gSourceMapLoader.getOriginalURLs(source); 119 Assert.deepEqual(urls, [ 120 { 121 id: "wasm.js/originalSource-63954a1c231200652c0d99c6a69cd178", 122 url: `${URL_ROOT}fixtures/one.js`, 123 }, 124 ]); 125 126 const { line, column } = await gSourceMapLoader.getOriginalLocation({ 127 sourceId: source.id, 128 line: 5, 129 }); 130 is(line, 1); 131 is(column, 7); 132 });