blob: 57cec25ec93d71ecad7f8f4f6474890c1c161b4f [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
(async function() {
TestRunner.addResult(`Verify TextSourceMap implementation\n`);
await TestRunner.loadModule('sources_test_runner');
function checkMapping(
compiledLineNumber, compiledColumnNumber, sourceURL, sourceLineNumber, sourceColumnNumber, mapping) {
var entry = mapping.findEntry(compiledLineNumber, compiledColumnNumber);
TestRunner.addResult(sourceURL + ' === ' + entry.sourceURL);
TestRunner.addResult(sourceLineNumber + ' === ' + entry.sourceLineNumber);
TestRunner.addResult(sourceColumnNumber + ' === ' + entry.sourceColumnNumber);
}
function checkReverseMapping(compiledLineNumber, compiledColumnNumber, sourceURL, sourceLineNumber, mapping) {
var entry = mapping.sourceLineMapping(sourceURL, sourceLineNumber, 0);
if (!entry) {
TestRunner.addResult('source line ' + sourceLineNumber + ' has no mappings.');
return;
}
TestRunner.addResult(compiledLineNumber + ' === ' + entry.lineNumber);
TestRunner.addResult(compiledColumnNumber + ' === ' + entry.columnNumber);
}
TestRunner.runTestSuite([
function testSimpleMap(next) {
/*
example.js:
0 1 2 3
012345678901234567890123456789012345
function add(variable_x, variable_y)
{
return variable_x + variable_y;
}
var global = "foo";
----------------------------------------
example-compiled.js:
0 1 2 3
012345678901234567890123456789012345
function add(a,b){return a+b}var global="foo";
foo
*/
var mappingPayload = {
'mappings': 'AAASA,QAAAA,IAAG,CAACC,CAAD,CAAaC,CAAb,CACZ,CACI,MAAOD,EAAP,CAAoBC,CADxB,CAIA,IAAIC,OAAS;A',
'sources': ['example.js']
};
var mapping = new SDK.TextSourceMap('compiled.js', 'source-map.json', mappingPayload);
checkMapping(0, 9, 'example.js', 0, 9, mapping);
checkMapping(0, 13, 'example.js', 0, 13, mapping);
checkMapping(0, 15, 'example.js', 0, 25, mapping);
checkMapping(0, 18, 'example.js', 2, 4, mapping);
checkMapping(0, 25, 'example.js', 2, 11, mapping);
checkMapping(0, 27, 'example.js', 2, 24, mapping);
checkMapping(1, 0, undefined, undefined, undefined, mapping);
checkReverseMapping(0, 0, 'example.js', 0, mapping);
checkReverseMapping(0, 17, 'example.js', 1, mapping);
checkReverseMapping(0, 18, 'example.js', 2, mapping);
checkReverseMapping(0, 29, 'example.js', 4, mapping);
checkReverseMapping(0, 29, 'example.js', 5, mapping);
next();
},
function testNoMappingEntry(next) {
var mappingPayload = {'mappings': 'AAAA,C,CAAE;', 'sources': ['example.js']};
var mapping = new SDK.TextSourceMap('compiled.js', 'source-map.json', mappingPayload);
checkMapping(0, 0, 'example.js', 0, 0, mapping);
var entry = mapping.findEntry(0, 1);
TestRunner.assertTrue(!entry.sourceURL);
checkMapping(0, 2, 'example.js', 0, 2, mapping);
next();
},
function testEmptyLine(next) {
var mappingPayload = {'mappings': 'AAAA;;;CACA', 'sources': ['example.js']};
var mapping = new SDK.TextSourceMap('compiled.js', 'source-map.json', mappingPayload);
checkMapping(0, 0, 'example.js', 0, 0, mapping);
checkReverseMapping(3, 1, 'example.js', 1, mapping);
next();
},
function testNonSortedMappings(next) {
/*
example.js:
ABCD
compiled.js:
DCBA
*/
var mappingPayload = {
// mappings go in reversed direction.
'mappings': 'GAAA,DAAC,DAAC,DAAC',
'sources': ['example.js']
};
var mapping = new SDK.TextSourceMap('compiled.js', 'source-map.json', mappingPayload);
checkMapping(0, 0, 'example.js', 0, 3, mapping);
checkMapping(0, 1, 'example.js', 0, 2, mapping);
checkMapping(0, 2, 'example.js', 0, 1, mapping);
checkMapping(0, 3, 'example.js', 0, 0, mapping);
next();
},
function testSections(next) {
var mappingPayload = {
'sections': [
{
'offset': {'line': 0, 'column': 0},
'map': {'mappings': 'AAAA,CAEC', 'sources': ['source1.js', 'source2.js']}
},
{'offset': {'line': 2, 'column': 10}, 'map': {'mappings': 'AAAA,CAEC', 'sources': ['source2.js']}}
]
};
var mapping = new SDK.TextSourceMap('compiled.js', 'source-map.json', mappingPayload);
TestRunner.assertEquals(2, mapping.sourceURLs().length);
checkMapping(0, 0, 'source1.js', 0, 0, mapping);
checkMapping(0, 1, 'source1.js', 2, 1, mapping);
checkMapping(2, 10, 'source2.js', 0, 0, mapping);
checkMapping(2, 11, 'source2.js', 2, 1, mapping);
next();
},
function testSourceRoot(next) {
/*
example.js:
0 1 2 3
012345678901234567890123456789012345
function add(variable_x, variable_y)
{
return variable_x + variable_y;
}
var global = "foo";
----------------------------------------
example-compiled.js:
0 1 2 3
012345678901234567890123456789012345
function add(a,b){return a+b}var global="foo";
*/
var mappingPayload = {
'mappings': 'AAASA,QAAAA,IAAG,CAACC,CAAD,CAAaC,CAAb,CACZ,CACI,MAAOD,EAAP,CAAoBC,CADxB,CAIA,IAAIC,OAAS;',
'sources': ['example.js'],
'sourceRoot': '/'
};
var mapping = new SDK.TextSourceMap('compiled.js', 'source-map.json', mappingPayload);
checkMapping(0, 9, '/example.js', 0, 9, mapping);
checkReverseMapping(0, 0, '/example.js', 0, mapping);
next();
},
function testNameClash(next) {
var mappingPayload = {
'mappings': 'AAASA,QAAAA,IAAG,CAACC,CAAD,CAAaC,CAAb,CACZ,CACI,MAAOD,EAAP,CAAoBC,CADxB,CAIA,IAAIC,OAAS;',
'sources': ['example.js'],
'sourcesContent': ['var i = 0;']
};
var mapping = new SDK.TextSourceMap('example.js', 'source-map.json', mappingPayload);
checkMapping(0, 9, 'example.js', 0, 9, mapping);
checkReverseMapping(0, 0, 'example.js', 0, mapping);
next();
},
function testNameIndexes(next) {
/*
------------------------------------------------------------------------------------
chrome_issue_611738.clj:
(ns devtools-sample.chrome-issue-611738)
(defmacro m []
`(let [generated# "value2"]))
------------------------------------------------------------------------------------
chrome_issue_611738.cljs:
(ns devtools-sample.chrome-issue-611738
(:require-macros [devtools-sample.chrome-issue-611738 :refer [m]]))
(let [name1 "value1"]
(m))
------------------------------------------------------------------------------------
chrome_issue_611738.js:
// Compiled by ClojureScript 1.9.89 {}
goog.provide('devtools_sample.chrome_issue_611738');
goog.require('cljs.core');
var name1_31466 = "value1";
var generated31465_31467 = "value2";
//# sourceMappingURL=chrome_issue_611738.js.map
------------------------------------------------------------------------------------
chrome_issue_611738.js.map:
{"version":3,"file":"\/Users\/darwin\/code\/cljs-devtools-sample\/resources\/public\/_compiled\/demo\/devtools_sample\/chrome_issue_611738.js","sources":["chrome_issue_611738.cljs"],"lineCount":7,"mappings":";AAAA;;AAGA,kBAAA,dAAMA;AAAN,AACE,IAAAC,uBAAA;AAAA,AAAA","names":["name1","generated31465"]}
------------------------------------------------------------------------------------
*/
var mappingPayload = {
'sources': ['chrome_issue_611738.cljs'],
'mappings': ';AAAA;;AAGA,kBAAA,dAAMA;AAAN,AACE,IAAAC,uBAAA;AAAA,AAAA',
'names': ['name1', 'generated31465']
};
var mapping = new SDK.TextSourceMap('chrome_issue_611738.js', 'chrome_issue_611738.js.map', mappingPayload);
mapping.mappings().forEach(function(entry) {
const name = entry.name ? '\'' + entry.name + '\'' : '[no name assigned]';
TestRunner.addResult(entry.lineNumber + ':' + entry.columnNumber + ' > ' + name);
});
next();
}
]);
})();