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