1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
/**
* An object of this type represents an original source for the style
* editor. An "original" source is one that is mentioned in a source
* map.
*
* @param {String} url
* The URL of the original source.
* @param {String} sourceID
* The source ID of the original source, as used by the source
* map service.
* @param {SourceMapService} sourceMapService
* The source map service; @see Toolbox.sourceMapService
*/
function OriginalSource(url, sourceId, sourceMapService) {
this.isOriginalSource = true;
this._url = url;
this._sourceId = sourceId;
this._sourceMapService = sourceMapService;
}
OriginalSource.prototype = {
get sourceId() {
return this._sourceId;
},
/** Get the original source's URL. */
get url() {
return this._url;
},
/** Get the original source's URL. */
get href() {
return this._url;
},
/**
* Return a promise that will resolve to the original source's full
* text. The return result is actually an object with a single
* `string` method; this method will return the source text as a
* string. This is done because the style editor elsewhere expects
* a long string actor.
*/
getText: function() {
if (!this._sourcePromise) {
this._sourcePromise = this._sourceMapService
.getOriginalSourceText(this._sourceId)
.then(contents => {
// Make it look like a long string actor.
return {
string: () => contents.text,
};
});
}
return this._sourcePromise;
},
/**
* Given a source-mapped, generated style sheet, a line, and a
* column, return the corresponding original location in this style
* sheet.
*
* @param {StyleSheetFront} relatedSheet
* The generated style sheet's actor
* @param {Number} line
* Line number.
* @param {Number} column
* Column number.
* @return {Location}
* The original location, an object with at least
* `sourceUrl`, `source`, `styleSheet`, `line`, and `column`
* properties.
*/
getOriginalLocation: function(relatedSheet, line, column) {
const { href, nodeHref, resourceId: sourceId } = relatedSheet;
const sourceUrl = href || nodeHref;
return this._sourceMapService
.getOriginalLocation({
sourceId,
line,
column,
sourceUrl,
})
.then(location => {
// Add some properties for the style editor.
location.source = location.sourceUrl;
location.styleSheet = relatedSheet;
return location;
});
},
// Dummy implementations, as we never emit an event.
on: function() {},
off: function() {},
};
exports.OriginalSource = OriginalSource;
|