/
resourcetiming-gather.js
95 lines (80 loc) · 2.77 KB
/
resourcetiming-gather.js
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
"use strict";
/* eslint-env browser */
//
// Exports
//
exports.fetch = async function() {
/**
* Determines if the frame is accessible and has the performance object
*
* @param {Frame} frame Frame
*
* @returns {boolean} True if accessible
*/
function isFrameAccessible(frame) {
/* eslint-disable-next-line no-unused-vars */
var dummy;
try {
dummy = frame.location && frame.location.href;
dummy = frame.document;
if (("performance" in frame) && frame.performance) {
return true;
}
} catch (e) {
// NOP
}
return false;
}
/**
* Crawls the frame
*
* @param {Frame} frame Frame
* @param {boolean} isTopWindow If the top window
* @param {number} depth Frame depth
*
* @returns {object} ResourceTiming data
*/
function crawlFrame(frame, isTopWindow, depth) {
console.log(`Crawling frame top: ${isTopWindow} depth: ${depth}`);
let entries = [];
try {
if (!isFrameAccessible(frame)) {
return [];
}
console.log(` url: ${frame.location.href}`);
if (frame.frames) {
for (let i = 0; i < frame.frames.length; i++) {
entries = entries.concat(crawlFrame(frame.frames[i], false, depth + 1, i));
}
}
if (typeof frame.performance.getEntriesByType !== "function") {
return [];
}
let frameEntries = frame.performance.getEntriesByType("resource");
for (let i = 0; frameEntries && i < frameEntries.length; i++) {
let res = frameEntries[i];
// reduce to what we want in the analyzer
let rtEntry = {
name: res.name,
initiatorType: res.initiatorType,
transferSize: res.transferSize,
decodedBodySize: res.decodedBodySize,
noTao: res.responseStart === 0,
responseStart: res.responseStart,
frameDepth: depth
};
entries.push(rtEntry);
}
} catch (e) {
// NOP
}
return entries;
}
return {
resources: crawlFrame(window, true, 0, 0, 0),
bufferSize: window.setResourceTimingBufferSize ? window.setResourceTimingBufferSize : 150,
clearResourceTimingsCalled: window.clearResourceTimingsCalled ? window.clearResourceTimingsCalled : false,
exceededDefaultBuffer: window.performance.getEntriesByType("resource").length >= 150,
mainFrameEntries: window.performance.getEntriesByType("resource").length
};
};