forked from dequelabs/axe-core
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparse-crossorigin-stylesheet.js
More file actions
66 lines (59 loc) · 1.65 KB
/
parse-crossorigin-stylesheet.js
File metadata and controls
66 lines (59 loc) · 1.65 KB
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
import parseStylesheet from './parse-stylesheet';
import constants from '../constants';
/**
* Parse cross-origin stylesheets
*
* @method parseCrossOriginStylesheet
* @memberof axe.utils
* @param {String} url url from which to fetch stylesheet
* @param {Object} options options object from `axe.utils.parseStylesheet`
* @param {Array<Number>} priority sheet priority
* @param {Array<String>} importedUrls urls of already imported stylesheets
* @param {Boolean} isCrossOrigin boolean denoting if a stylesheet is `cross-origin`
* @returns {Promise}
*/
function parseCrossOriginStylesheet(
url,
options,
priority,
importedUrls,
isCrossOrigin
) {
/**
* Add `url` to `importedUrls`
*/
importedUrls.push(url);
return new Promise((resolve, reject) => {
const request = new window.XMLHttpRequest();
request.open('GET', url);
request.timeout = constants.preload.timeout;
request.addEventListener('error', reject);
request.addEventListener('timeout', reject);
request.addEventListener('loadend', event => {
if (event.loaded && request.responseText) {
return resolve(request.responseText);
}
reject(request.responseText);
});
request.send();
}).then(data => {
const result = options.convertDataToStylesheet({
data,
isCrossOrigin,
priority,
root: options.rootNode,
shadowId: options.shadowId
});
/**
* Parse resolved stylesheet further for any `@import` styles
*/
return parseStylesheet(
result.sheet,
options,
priority,
importedUrls,
result.isCrossOrigin
);
});
}
export default parseCrossOriginStylesheet;