7d040fcb3bb232f1136c823721bcaaad783258f4
[WebKit-https.git] / LayoutTests / inspector / timeline-test.js
1 // Used to mark timeline records as belonging to the test framework.
2 var timelineOverheadMark = "***Overhead***";
3
4 // TimelineAgent record type definitions from the inspector
5 var timelineAgentRecordType = {};
6
7 // Scrub values when printing out these properties in the record or data field.
8 var timelineNonDeterministicProps = { 
9     children : 1,
10     endTime : 1, 
11     startTime : 1,
12     url : 1
13 };
14
15 // Call this function from the doit() function in the main test page.
16 // Pass a function that will get an array of timeline data to process.
17 function retrieveTimelineData(analyzeFunction)
18 {
19     evaluateInWebInspector("WebInspector.TimelineAgent.RecordType", function(result) {
20         timelineAgentRecordType = result;
21     });
22
23     evaluateInWebInspector("frontend_getTimelineResults()", function(timelineRecords) {
24         if (typeof(timelineRecords) === "string")
25             output("Error fetching Timeline results: " + timelineRecords);
26         else 
27             analyzeFunction(timelineRecords);
28         notifyDone();
29     });
30     markTimelineRecordAsOverhead("onload" + (ignoreLoad ? ":ignoreLoad": ""));
31 }
32
33 // Dump just the record name, indenting output on separate lines for subrecords
34 function dumpTimelineRecord(record, level) 
35 {
36     var prefix = "";
37     var suffix = "";
38     for (var i = 0; i < level ; ++i)
39         prefix = "----" + prefix;
40     if (level > 0)
41         prefix = prefix + "> ";
42     if (record.type == timelineAgentRecordType.MarkTimeline) {
43         suffix = " : " + record.data.message;
44     }
45     output(prefix + timelineAgentTypeToString(record.type) + suffix);
46
47     var numChildren = record.children ? record.children.length : 0;
48     for (var i = 0; i < numChildren; ++i)
49         dumpTimelineRecord(record.children[i], level + 1);
50 }
51
52 // Dumps an entire list of records, culling out those marked as overhead
53 function dumpTimelineRecords(timelineRecords) {
54     var numRecords = timelineRecords.length;
55     for (var i = 0; i < numRecords; ++i) {
56         var record = timelineRecords[i];
57         if (!isTimelineOverheadRecord(record))
58             dumpTimelineRecord(record, 0);
59     }
60 }
61
62 // Sort the fields, then strip out startTime and endTime, they are not deterministic.
63 // Also remove children - that field isn't important for the printout.
64 function printTimelineRecordProperties(record)
65 {
66     output(timelineAgentTypeToString(record.type) + " Properties:");
67     // Use this recursive routine to print the properties
68     printProps(record, 0);
69 }
70
71 function isNonDeterministicProp(propName)
72 {
73     if (timelineNonDeterministicProps[propName])
74         return true;
75     return false;
76 }
77
78 function printProps (record, level)
79 {
80     var props = new Array();
81     for (var prop in record) {
82         props.push(prop);
83     }
84
85     var prefix = "+";
86     for (var i = 0; i < level ; i++) {
87         prefix = prefix + "-";
88     }
89
90     prefix = prefix + " ";
91     for (var prop in props) {
92         var propName = props[prop];
93         var propValue = record[propName];
94         if (isNonDeterministicProp(propName))
95             output(prefix + propName + " : " + (propValue === undefined ? "<undefined>" : " * DEFINED *"));
96         else if (typeof propValue === "object") {
97             output(prefix + propName + " : {");
98             printProps(propValue, level + 1);
99             output(prefix + "}");
100         } else
101             output(prefix + propName + " : " + propValue);
102     }
103 }
104
105 // Records that have been marked with console.markTimeline(timelineMark)
106 // are a part of the test framework and not a part of the test being performed
107 function isTimelineOverheadRecord(record) {
108     if (record.type === 11 && record.data.message.indexOf(timelineOverheadMark) !== -1)
109         return true;
110     var numChildren = record.children ?  record.children.length : 0;
111     for (var i = 0; i < numChildren; ++i) {
112         if (isTimelineOverheadRecord(record.children[i]))
113             return true;
114     }
115     return false;
116 }
117
118 // This mark will help the test analysis cull out records that are overhead.
119 function markTimelineRecordAsOverhead(arg)
120 {
121     var suffix = '';
122     if (arg)
123         suffix = ": " + arg;
124     console.markTimeline(timelineOverheadMark + suffix);
125 }
126
127 function timelineAgentTypeToString(numericType)
128 {
129     for (var prop in timelineAgentRecordType) {
130         if (timelineAgentRecordType[prop] == numericType)
131             return prop;
132     }
133     return undefined;
134 }
135
136 // Injected into Inspector window
137 function frontend_startTimelineProfiler()
138 {
139     window.timelineResults = new Array();
140     window.WebInspector.addRecordToTimeline = function(arg) {
141         window.timelineResults.push(arg);
142     };
143     window.InspectorController.startTimelineProfiler();
144     return 'done';
145 }
146
147 // Injected into Inspector window
148 function frontend_getTimelineResults() {
149     return window.timelineResults;
150 }
151
152 // Injected into Inspector window
153 // frontend_setup always gets called before the page is reloaded.
154 function frontend_setup() {
155     frontend_startTimelineProfiler();
156 }