2009-11-17 Pavel Feldman <pfeldman@chromium.org>
[WebKit-https.git] / LayoutTests / inspector / timeline-test.js
1 var timelineAgentRecordType = {};
2
3 // Scrub values when printing out these properties in the record or data field.
4 var timelineNonDeterministicProps = { 
5     children : 1,
6     endTime : 1, 
7     startTime : 1,
8     url : 1
9 };
10
11 function printTimelineRecords(performActions, typeName, formatter)
12 {
13     if (performActions) {
14         if (window.layoutTestController)
15             layoutTestController.setTimelineProfilingEnabled(true);
16         performActions();
17     }
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             for (var i = 0; i < timelineRecords.length; ++i) {
28                 if (typeName && timelineRecords[i].type === timelineAgentRecordType[typeName])
29                     printTimelineRecordProperties(timelineRecords[i]);
30                 if (formatter)
31                     formatter(timelineRecords[i]);
32             }
33         }
34         if (window.layoutTestController)
35             layoutTestController.setTimelineProfilingEnabled(false);
36         notifyDone();
37     });
38 }
39
40 // Dump just the record name, indenting output on separate lines for subrecords
41 function dumpTimelineRecord(record, level) 
42 {
43     if (typeof level !== "number")
44         level = 0;
45     var prefix = "";
46     var suffix = "";
47     for (var i = 0; i < level ; ++i)
48         prefix = "----" + prefix;
49     if (level > 0)
50         prefix = prefix + "> ";
51     if (record.type === timelineAgentRecordType.MarkTimeline) {
52         suffix = " : " + record.data.message;
53     }
54     output(prefix + timelineAgentTypeToString(record.type) + suffix);
55
56     var numChildren = record.children ? record.children.length : 0;
57     for (var i = 0; i < numChildren; ++i)
58         dumpTimelineRecord(record.children[i], level + 1);
59 }
60
61 function dumpTimelineRecords(timelineRecords) {
62     for (var i = 0; i < timelineRecords.length; ++i)
63         dumpTimelineRecord(timelineRecords[i], 0);
64 }
65
66 function printTimelineRecordProperties(record)
67 {
68     output(timelineAgentTypeToString(record.type) + " Properties:");
69     // Use this recursive routine to print the properties
70     printProps(record, 0);
71 }
72
73 function isNonDeterministicProp(propName)
74 {
75     if (timelineNonDeterministicProps[propName])
76         return true;
77     return false;
78 }
79
80 function printProps(record, level)
81 {
82     var props = new Array();
83     for (var prop in record) {
84         props.push(prop);
85     }
86
87     var prefix = "+";
88     for (var i = 0; i < level ; i++) {
89         prefix = prefix + "-";
90     }
91
92     prefix = prefix + " ";
93     for (var prop in props) {
94         var propName = props[prop];
95         var propValue = record[propName];
96         if (isNonDeterministicProp(propName))
97             output(prefix + propName + " : " + (propValue === undefined ? "<undefined>" : " * DEFINED *"));
98         else if (typeof propValue === "object") {
99             output(prefix + propName + " : {");
100             printProps(propValue, level + 1);
101             output(prefix + "}");
102         } else
103             output(prefix + propName + " : " + propValue);
104     }
105 }
106
107 function timelineAgentTypeToString(numericType)
108 {
109     for (var prop in timelineAgentRecordType) {
110         if (timelineAgentRecordType[prop] === numericType)
111             return prop;
112     }
113     return undefined;
114 }
115
116 // Injected into Inspector window
117 function frontend_getTimelineResults() {
118     var result = [];
119     var items = WebInspector.panels.timeline._items;
120     for (var i = 0; i < items.length; ++i) {
121         result.push(items[i].record);
122     }
123     return result;
124 }