|
1 /* -*- Mode: js; js-indent-level: 2; -*- */ |
|
2 /* |
|
3 * Copyright 2011 Mozilla Foundation and contributors |
|
4 * Licensed under the New BSD license. See LICENSE or: |
|
5 * http://opensource.org/licenses/BSD-3-Clause |
|
6 */ |
|
7 |
|
8 /* |
|
9 * WARNING! |
|
10 * |
|
11 * Do not edit this file directly, it is built from the sources at |
|
12 * https://github.com/mozilla/source-map/ |
|
13 */ |
|
14 |
|
15 Components.utils.import('resource://gre/modules/devtools/Require.jsm'); |
|
16 Components.utils.import('resource://gre/modules/devtools/SourceMap.jsm'); |
|
17 |
|
18 this.EXPORTED_SYMBOLS = [ "define", "runSourceMapTests" ]; |
|
19 /* -*- Mode: js; js-indent-level: 2; -*- */ |
|
20 /* |
|
21 * Copyright 2011 Mozilla Foundation and contributors |
|
22 * Licensed under the New BSD license. See LICENSE or: |
|
23 * http://opensource.org/licenses/BSD-3-Clause |
|
24 */ |
|
25 define('test/source-map/assert', ['exports'], function (exports) { |
|
26 |
|
27 let do_throw = function (msg) { |
|
28 throw new Error(msg); |
|
29 }; |
|
30 |
|
31 exports.init = function (throw_fn) { |
|
32 do_throw = throw_fn; |
|
33 }; |
|
34 |
|
35 exports.doesNotThrow = function (fn) { |
|
36 try { |
|
37 fn(); |
|
38 } |
|
39 catch (e) { |
|
40 do_throw(e.message); |
|
41 } |
|
42 }; |
|
43 |
|
44 exports.equal = function (actual, expected, msg) { |
|
45 msg = msg || String(actual) + ' != ' + String(expected); |
|
46 if (actual != expected) { |
|
47 do_throw(msg); |
|
48 } |
|
49 }; |
|
50 |
|
51 exports.ok = function (val, msg) { |
|
52 msg = msg || String(val) + ' is falsey'; |
|
53 if (!Boolean(val)) { |
|
54 do_throw(msg); |
|
55 } |
|
56 }; |
|
57 |
|
58 exports.strictEqual = function (actual, expected, msg) { |
|
59 msg = msg || String(actual) + ' !== ' + String(expected); |
|
60 if (actual !== expected) { |
|
61 do_throw(msg); |
|
62 } |
|
63 }; |
|
64 |
|
65 exports.throws = function (fn) { |
|
66 try { |
|
67 fn(); |
|
68 do_throw('Expected an error to be thrown, but it wasn\'t.'); |
|
69 } |
|
70 catch (e) { |
|
71 } |
|
72 }; |
|
73 |
|
74 }); |
|
75 /* -*- Mode: js; js-indent-level: 2; -*- */ |
|
76 /* |
|
77 * Copyright 2011 Mozilla Foundation and contributors |
|
78 * Licensed under the New BSD license. See LICENSE or: |
|
79 * http://opensource.org/licenses/BSD-3-Clause |
|
80 */ |
|
81 define('test/source-map/util', ['require', 'exports', 'module' , 'lib/source-map/util'], function(require, exports, module) { |
|
82 |
|
83 var util = require('source-map/util'); |
|
84 |
|
85 // This is a test mapping which maps functions from two different files |
|
86 // (one.js and two.js) to a minified generated source. |
|
87 // |
|
88 // Here is one.js: |
|
89 // |
|
90 // ONE.foo = function (bar) { |
|
91 // return baz(bar); |
|
92 // }; |
|
93 // |
|
94 // Here is two.js: |
|
95 // |
|
96 // TWO.inc = function (n) { |
|
97 // return n + 1; |
|
98 // }; |
|
99 // |
|
100 // And here is the generated code (min.js): |
|
101 // |
|
102 // ONE.foo=function(a){return baz(a);}; |
|
103 // TWO.inc=function(a){return a+1;}; |
|
104 exports.testGeneratedCode = " ONE.foo=function(a){return baz(a);};\n"+ |
|
105 " TWO.inc=function(a){return a+1;};"; |
|
106 exports.testMap = { |
|
107 version: 3, |
|
108 file: 'min.js', |
|
109 names: ['bar', 'baz', 'n'], |
|
110 sources: ['one.js', 'two.js'], |
|
111 sourceRoot: '/the/root', |
|
112 mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' |
|
113 }; |
|
114 exports.testMapWithSourcesContent = { |
|
115 version: 3, |
|
116 file: 'min.js', |
|
117 names: ['bar', 'baz', 'n'], |
|
118 sources: ['one.js', 'two.js'], |
|
119 sourcesContent: [ |
|
120 ' ONE.foo = function (bar) {\n' + |
|
121 ' return baz(bar);\n' + |
|
122 ' };', |
|
123 ' TWO.inc = function (n) {\n' + |
|
124 ' return n + 1;\n' + |
|
125 ' };' |
|
126 ], |
|
127 sourceRoot: '/the/root', |
|
128 mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' |
|
129 }; |
|
130 exports.emptyMap = { |
|
131 version: 3, |
|
132 file: 'min.js', |
|
133 names: [], |
|
134 sources: [], |
|
135 mappings: '' |
|
136 }; |
|
137 |
|
138 |
|
139 function assertMapping(generatedLine, generatedColumn, originalSource, |
|
140 originalLine, originalColumn, name, map, assert, |
|
141 dontTestGenerated, dontTestOriginal) { |
|
142 if (!dontTestOriginal) { |
|
143 var origMapping = map.originalPositionFor({ |
|
144 line: generatedLine, |
|
145 column: generatedColumn |
|
146 }); |
|
147 assert.equal(origMapping.name, name, |
|
148 'Incorrect name, expected ' + JSON.stringify(name) |
|
149 + ', got ' + JSON.stringify(origMapping.name)); |
|
150 assert.equal(origMapping.line, originalLine, |
|
151 'Incorrect line, expected ' + JSON.stringify(originalLine) |
|
152 + ', got ' + JSON.stringify(origMapping.line)); |
|
153 assert.equal(origMapping.column, originalColumn, |
|
154 'Incorrect column, expected ' + JSON.stringify(originalColumn) |
|
155 + ', got ' + JSON.stringify(origMapping.column)); |
|
156 |
|
157 var expectedSource; |
|
158 |
|
159 if (originalSource && map.sourceRoot && originalSource.indexOf(map.sourceRoot) === 0) { |
|
160 expectedSource = originalSource; |
|
161 } else if (originalSource) { |
|
162 expectedSource = map.sourceRoot |
|
163 ? util.join(map.sourceRoot, originalSource) |
|
164 : originalSource; |
|
165 } else { |
|
166 expectedSource = null; |
|
167 } |
|
168 |
|
169 assert.equal(origMapping.source, expectedSource, |
|
170 'Incorrect source, expected ' + JSON.stringify(expectedSource) |
|
171 + ', got ' + JSON.stringify(origMapping.source)); |
|
172 } |
|
173 |
|
174 if (!dontTestGenerated) { |
|
175 var genMapping = map.generatedPositionFor({ |
|
176 source: originalSource, |
|
177 line: originalLine, |
|
178 column: originalColumn |
|
179 }); |
|
180 assert.equal(genMapping.line, generatedLine, |
|
181 'Incorrect line, expected ' + JSON.stringify(generatedLine) |
|
182 + ', got ' + JSON.stringify(genMapping.line)); |
|
183 assert.equal(genMapping.column, generatedColumn, |
|
184 'Incorrect column, expected ' + JSON.stringify(generatedColumn) |
|
185 + ', got ' + JSON.stringify(genMapping.column)); |
|
186 } |
|
187 } |
|
188 exports.assertMapping = assertMapping; |
|
189 |
|
190 function assertEqualMaps(assert, actualMap, expectedMap) { |
|
191 assert.equal(actualMap.version, expectedMap.version, "version mismatch"); |
|
192 assert.equal(actualMap.file, expectedMap.file, "file mismatch"); |
|
193 assert.equal(actualMap.names.length, |
|
194 expectedMap.names.length, |
|
195 "names length mismatch: " + |
|
196 actualMap.names.join(", ") + " != " + expectedMap.names.join(", ")); |
|
197 for (var i = 0; i < actualMap.names.length; i++) { |
|
198 assert.equal(actualMap.names[i], |
|
199 expectedMap.names[i], |
|
200 "names[" + i + "] mismatch: " + |
|
201 actualMap.names.join(", ") + " != " + expectedMap.names.join(", ")); |
|
202 } |
|
203 assert.equal(actualMap.sources.length, |
|
204 expectedMap.sources.length, |
|
205 "sources length mismatch: " + |
|
206 actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", ")); |
|
207 for (var i = 0; i < actualMap.sources.length; i++) { |
|
208 assert.equal(actualMap.sources[i], |
|
209 expectedMap.sources[i], |
|
210 "sources[" + i + "] length mismatch: " + |
|
211 actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", ")); |
|
212 } |
|
213 assert.equal(actualMap.sourceRoot, |
|
214 expectedMap.sourceRoot, |
|
215 "sourceRoot mismatch: " + |
|
216 actualMap.sourceRoot + " != " + expectedMap.sourceRoot); |
|
217 assert.equal(actualMap.mappings, expectedMap.mappings, |
|
218 "mappings mismatch:\nActual: " + actualMap.mappings + "\nExpected: " + expectedMap.mappings); |
|
219 if (actualMap.sourcesContent) { |
|
220 assert.equal(actualMap.sourcesContent.length, |
|
221 expectedMap.sourcesContent.length, |
|
222 "sourcesContent length mismatch"); |
|
223 for (var i = 0; i < actualMap.sourcesContent.length; i++) { |
|
224 assert.equal(actualMap.sourcesContent[i], |
|
225 expectedMap.sourcesContent[i], |
|
226 "sourcesContent[" + i + "] mismatch"); |
|
227 } |
|
228 } |
|
229 } |
|
230 exports.assertEqualMaps = assertEqualMaps; |
|
231 |
|
232 }); |
|
233 /* -*- Mode: js; js-indent-level: 2; -*- */ |
|
234 /* |
|
235 * Copyright 2011 Mozilla Foundation and contributors |
|
236 * Licensed under the New BSD license. See LICENSE or: |
|
237 * http://opensource.org/licenses/BSD-3-Clause |
|
238 */ |
|
239 define('lib/source-map/util', ['require', 'exports', 'module' , ], function(require, exports, module) { |
|
240 |
|
241 /** |
|
242 * This is a helper function for getting values from parameter/options |
|
243 * objects. |
|
244 * |
|
245 * @param args The object we are extracting values from |
|
246 * @param name The name of the property we are getting. |
|
247 * @param defaultValue An optional value to return if the property is missing |
|
248 * from the object. If this is not specified and the property is missing, an |
|
249 * error will be thrown. |
|
250 */ |
|
251 function getArg(aArgs, aName, aDefaultValue) { |
|
252 if (aName in aArgs) { |
|
253 return aArgs[aName]; |
|
254 } else if (arguments.length === 3) { |
|
255 return aDefaultValue; |
|
256 } else { |
|
257 throw new Error('"' + aName + '" is a required argument.'); |
|
258 } |
|
259 } |
|
260 exports.getArg = getArg; |
|
261 |
|
262 var urlRegexp = /([\w+\-.]+):\/\/((\w+:\w+)@)?([\w.]+)?(:(\d+))?(\S+)?/; |
|
263 var dataUrlRegexp = /^data:.+\,.+/; |
|
264 |
|
265 function urlParse(aUrl) { |
|
266 var match = aUrl.match(urlRegexp); |
|
267 if (!match) { |
|
268 return null; |
|
269 } |
|
270 return { |
|
271 scheme: match[1], |
|
272 auth: match[3], |
|
273 host: match[4], |
|
274 port: match[6], |
|
275 path: match[7] |
|
276 }; |
|
277 } |
|
278 exports.urlParse = urlParse; |
|
279 |
|
280 function urlGenerate(aParsedUrl) { |
|
281 var url = aParsedUrl.scheme + "://"; |
|
282 if (aParsedUrl.auth) { |
|
283 url += aParsedUrl.auth + "@" |
|
284 } |
|
285 if (aParsedUrl.host) { |
|
286 url += aParsedUrl.host; |
|
287 } |
|
288 if (aParsedUrl.port) { |
|
289 url += ":" + aParsedUrl.port |
|
290 } |
|
291 if (aParsedUrl.path) { |
|
292 url += aParsedUrl.path; |
|
293 } |
|
294 return url; |
|
295 } |
|
296 exports.urlGenerate = urlGenerate; |
|
297 |
|
298 function join(aRoot, aPath) { |
|
299 var url; |
|
300 |
|
301 if (aPath.match(urlRegexp) || aPath.match(dataUrlRegexp)) { |
|
302 return aPath; |
|
303 } |
|
304 |
|
305 if (aPath.charAt(0) === '/' && (url = urlParse(aRoot))) { |
|
306 url.path = aPath; |
|
307 return urlGenerate(url); |
|
308 } |
|
309 |
|
310 return aRoot.replace(/\/$/, '') + '/' + aPath; |
|
311 } |
|
312 exports.join = join; |
|
313 |
|
314 /** |
|
315 * Because behavior goes wacky when you set `__proto__` on objects, we |
|
316 * have to prefix all the strings in our set with an arbitrary character. |
|
317 * |
|
318 * See https://github.com/mozilla/source-map/pull/31 and |
|
319 * https://github.com/mozilla/source-map/issues/30 |
|
320 * |
|
321 * @param String aStr |
|
322 */ |
|
323 function toSetString(aStr) { |
|
324 return '$' + aStr; |
|
325 } |
|
326 exports.toSetString = toSetString; |
|
327 |
|
328 function fromSetString(aStr) { |
|
329 return aStr.substr(1); |
|
330 } |
|
331 exports.fromSetString = fromSetString; |
|
332 |
|
333 function relative(aRoot, aPath) { |
|
334 aRoot = aRoot.replace(/\/$/, ''); |
|
335 |
|
336 var url = urlParse(aRoot); |
|
337 if (aPath.charAt(0) == "/" && url && url.path == "/") { |
|
338 return aPath.slice(1); |
|
339 } |
|
340 |
|
341 return aPath.indexOf(aRoot + '/') === 0 |
|
342 ? aPath.substr(aRoot.length + 1) |
|
343 : aPath; |
|
344 } |
|
345 exports.relative = relative; |
|
346 |
|
347 function strcmp(aStr1, aStr2) { |
|
348 var s1 = aStr1 || ""; |
|
349 var s2 = aStr2 || ""; |
|
350 return (s1 > s2) - (s1 < s2); |
|
351 } |
|
352 |
|
353 /** |
|
354 * Comparator between two mappings where the original positions are compared. |
|
355 * |
|
356 * Optionally pass in `true` as `onlyCompareGenerated` to consider two |
|
357 * mappings with the same original source/line/column, but different generated |
|
358 * line and column the same. Useful when searching for a mapping with a |
|
359 * stubbed out mapping. |
|
360 */ |
|
361 function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { |
|
362 var cmp; |
|
363 |
|
364 cmp = strcmp(mappingA.source, mappingB.source); |
|
365 if (cmp) { |
|
366 return cmp; |
|
367 } |
|
368 |
|
369 cmp = mappingA.originalLine - mappingB.originalLine; |
|
370 if (cmp) { |
|
371 return cmp; |
|
372 } |
|
373 |
|
374 cmp = mappingA.originalColumn - mappingB.originalColumn; |
|
375 if (cmp || onlyCompareOriginal) { |
|
376 return cmp; |
|
377 } |
|
378 |
|
379 cmp = strcmp(mappingA.name, mappingB.name); |
|
380 if (cmp) { |
|
381 return cmp; |
|
382 } |
|
383 |
|
384 cmp = mappingA.generatedLine - mappingB.generatedLine; |
|
385 if (cmp) { |
|
386 return cmp; |
|
387 } |
|
388 |
|
389 return mappingA.generatedColumn - mappingB.generatedColumn; |
|
390 }; |
|
391 exports.compareByOriginalPositions = compareByOriginalPositions; |
|
392 |
|
393 /** |
|
394 * Comparator between two mappings where the generated positions are |
|
395 * compared. |
|
396 * |
|
397 * Optionally pass in `true` as `onlyCompareGenerated` to consider two |
|
398 * mappings with the same generated line and column, but different |
|
399 * source/name/original line and column the same. Useful when searching for a |
|
400 * mapping with a stubbed out mapping. |
|
401 */ |
|
402 function compareByGeneratedPositions(mappingA, mappingB, onlyCompareGenerated) { |
|
403 var cmp; |
|
404 |
|
405 cmp = mappingA.generatedLine - mappingB.generatedLine; |
|
406 if (cmp) { |
|
407 return cmp; |
|
408 } |
|
409 |
|
410 cmp = mappingA.generatedColumn - mappingB.generatedColumn; |
|
411 if (cmp || onlyCompareGenerated) { |
|
412 return cmp; |
|
413 } |
|
414 |
|
415 cmp = strcmp(mappingA.source, mappingB.source); |
|
416 if (cmp) { |
|
417 return cmp; |
|
418 } |
|
419 |
|
420 cmp = mappingA.originalLine - mappingB.originalLine; |
|
421 if (cmp) { |
|
422 return cmp; |
|
423 } |
|
424 |
|
425 cmp = mappingA.originalColumn - mappingB.originalColumn; |
|
426 if (cmp) { |
|
427 return cmp; |
|
428 } |
|
429 |
|
430 return strcmp(mappingA.name, mappingB.name); |
|
431 }; |
|
432 exports.compareByGeneratedPositions = compareByGeneratedPositions; |
|
433 |
|
434 }); |
|
435 /* -*- Mode: js; js-indent-level: 2; -*- */ |
|
436 /* |
|
437 * Copyright 2011 Mozilla Foundation and contributors |
|
438 * Licensed under the New BSD license. See LICENSE or: |
|
439 * http://opensource.org/licenses/BSD-3-Clause |
|
440 */ |
|
441 function runSourceMapTests(modName, do_throw) { |
|
442 let mod = require(modName); |
|
443 let assert = require('test/source-map/assert'); |
|
444 let util = require('test/source-map/util'); |
|
445 |
|
446 assert.init(do_throw); |
|
447 |
|
448 for (let k in mod) { |
|
449 if (/^test/.test(k)) { |
|
450 mod[k](assert, util); |
|
451 } |
|
452 } |
|
453 |
|
454 } |
|
455 this.runSourceMapTests = runSourceMapTests; |