2010-04-07 Sheriff Bot <webkit.review.bot@gmail.com>
[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     height : 1,
8     identifier : 1,
9     startTime : 1,
10     width : 1,
11     callerScriptName: 1,
12     callerScriptLine: 1,
13     url : 1,
14     usedHeapSize: 1,
15     totalHeapSize: 1,
16     mimeType : 1
17 };
18
19 function printTimelineRecords(performActions, typeName, formatter)
20 {
21     if (performActions) {
22         if (window.layoutTestController)
23             layoutTestController.setTimelineProfilingEnabled(true);
24         performActions();
25     }
26
27     evaluateInWebInspector("WebInspector.TimelineAgent.RecordType", function(result) {
28         timelineAgentRecordType = result;
29     });
30
31     evaluateInWebInspector("frontend_getTimelineResults", function(timelineRecords) {
32         try {
33             if (typeof(timelineRecords) === "string")
34                 output("Error fetching Timeline results: " + timelineRecords);
35             else {
36                 for (var i = 0; i < timelineRecords.length; ++i) {
37                     var record = timelineRecords[i];
38                     if (typeName && record.type === timelineAgentRecordType[typeName])
39                         printTimelineRecordProperties(record);
40                     if (formatter)
41                         formatter(record);
42                 }
43             }
44             if (window.layoutTestController)
45                 layoutTestController.setTimelineProfilingEnabled(false);
46             notifyDone();
47         } catch (e) {
48             console.log("An exception was caught: " + e.toString());
49             notifyDone(e.toString());
50         }
51     });
52 }
53
54 // Dump just the record name, indenting output on separate lines for subrecords
55 function dumpTimelineRecord(record, level) 
56 {
57     if (typeof level !== "number")
58         level = 0;
59     var prefix = "";
60     var suffix = "";
61     for (var i = 0; i < level ; ++i)
62         prefix = "----" + prefix;
63     if (level > 0)
64         prefix = prefix + "> ";
65     if (record.type === timelineAgentRecordType.MarkTimeline) {
66         suffix = " : " + record.data.message;
67     }
68     output(prefix + timelineAgentTypeToString(record.type) + suffix);
69
70     var numChildren = record.children ? record.children.length : 0;
71     for (var i = 0; i < numChildren; ++i)
72         dumpTimelineRecord(record.children[i], level + 1);
73 }
74
75 function dumpTimelineRecords(timelineRecords) {
76     for (var i = 0; i < timelineRecords.length; ++i)
77         dumpTimelineRecord(timelineRecords[i], 0);
78 }
79
80 function printTimelineRecordProperties(record)
81 {
82     output(timelineAgentTypeToString(record.type) + " Properties:");
83     // Use this recursive routine to print the properties
84     printProps(record, 0);
85 }
86
87 function isNonDeterministicProp(propName)
88 {
89     if (timelineNonDeterministicProps[propName])
90         return true;
91     return false;
92 }
93
94 function printProps(record, level)
95 {
96     var props = new Array();
97     for (var prop in record) {
98         props.push(prop);
99     }
100
101     var prefix = "+";
102     for (var i = 0; i < level ; i++) {
103         prefix = prefix + "-";
104     }
105
106     prefix = prefix + " ";
107     for (var prop in props) {
108         var propName = props[prop];
109         var propValue = record[propName];
110         if (isNonDeterministicProp(propName))
111             output(prefix + propName + " : " + (propValue === undefined ? "<undefined>" : " * DEFINED *"));
112         else if (typeof propValue === "object") {
113             output(prefix + propName + " : {");
114             printProps(propValue, level + 1);
115             output(prefix + "}");
116         } else
117             output(prefix + propName + " : " + propValue);
118     }
119 }
120
121 function timelineAgentTypeToString(numericType)
122 {
123     for (var prop in timelineAgentRecordType) {
124         if (timelineAgentRecordType[prop] === numericType)
125             return prop;
126     }
127     return undefined;
128 }
129
130 // Injected into Inspector window
131 function frontend_getTimelineResults() {
132     var result = [];
133     function addRecords(records)
134     {
135         if (!records)
136             return;
137         for (var i = 0; i < records.length; ++i) {
138             result.push(records[i].originalRecordForTests);
139             addRecords(records[i].children);
140         }
141     }
142     addRecords(WebInspector.panels.timeline._rootRecord.children);
143     return result;
144 }