11import { bind } from 'angular2/di' ;
2- import { ListWrapper } from 'angular2/src/facade/collection' ;
2+ import { ListWrapper , StringMapWrapper } from 'angular2/src/facade/collection' ;
33import {
4- Json , isPresent , isBlank , RegExpWrapper , StringWrapper
4+ Json , isPresent , isBlank , RegExpWrapper , StringWrapper , BaseException , NumberWrapper
55} from 'angular2/src/facade/lang' ;
66
77import { WebDriverExtension } from '../web_driver_extension' ;
88import { WebDriverAdapter } from '../web_driver_adapter' ;
99import { Promise } from 'angular2/src/facade/async' ;
1010
1111
12- var BEGIN_MARK_RE = RegExpWrapper . create ( 'begin_(.*)' ) ;
13- var END_MARK_RE = RegExpWrapper . create ( 'end_(.*)' ) ;
14-
1512export class ChromeDriverExtension extends WebDriverExtension {
1613 // TODO(tbosch): use static values when our transpiler supports them
1714 static get BINDINGS ( ) { return _BINDINGS ; }
@@ -28,15 +25,13 @@ export class ChromeDriverExtension extends WebDriverExtension {
2825 }
2926
3027 timeBegin ( name :string ) :Promise {
31- // Note: Can't use console.time / console.timeEnd as it does not show up in the perf log!
32- return this . _driver . executeScript ( `console.timeStamp('begin_${ name } ');` ) ;
28+ return this . _driver . executeScript ( `console.time('${ name } ');` ) ;
3329 }
3430
3531 timeEnd ( name :string , restartName :string = null ) :Promise {
36- // Note: Can't use console.time / console.timeEnd as it does not show up in the perf log!
37- var script = `console.timeStamp('end_${ name } ');` ;
32+ var script = `console.timeEnd('${ name } ');` ;
3833 if ( isPresent ( restartName ) ) {
39- script += `console.timeStamp('begin_ ${ restartName } ');`
34+ script += `console.time(' ${ restartName } ');`
4035 }
4136 return this . _driver . executeScript ( script ) ;
4237 }
@@ -47,100 +42,81 @@ export class ChromeDriverExtension extends WebDriverExtension {
4742 return this . _driver . executeScript ( '1+1' )
4843 . then ( ( _ ) => this . _driver . logs ( 'performance' ) )
4944 . then ( ( entries ) => {
50- var records = [ ] ;
45+ var events = [ ] ;
5146 ListWrapper . forEach ( entries , function ( entry ) {
5247 var message = Json . parse ( entry [ 'message' ] ) [ 'message' ] ;
53- if ( StringWrapper . equals ( message [ 'method' ] , 'Timeline.eventRecorded' ) ) {
54- ListWrapper . push ( records , message [ 'params' ] [ 'record' ] ) ;
48+ if ( StringWrapper . equals ( message [ 'method' ] , 'Tracing.dataCollected' ) ) {
49+ ListWrapper . push ( events , message [ 'params' ] ) ;
50+ }
51+ if ( StringWrapper . equals ( message [ 'method' ] , 'Tracing.bufferUsage' ) ) {
52+ throw new BaseException ( 'The DevTools trace buffer filled during the test!' ) ;
5553 }
5654 } ) ;
57- return this . _convertPerfRecordsToEvents ( records ) ;
55+ return this . _convertPerfRecordsToEvents ( events ) ;
5856 } ) ;
5957 }
6058
61- _convertPerfRecordsToEvents ( records , events = null ) {
62- if ( isBlank ( events ) ) {
63- events = [ ] ;
59+ _convertPerfRecordsToEvents ( chromeEvents , normalizedEvents = null ) {
60+ if ( isBlank ( normalizedEvents ) ) {
61+ normalizedEvents = [ ] ;
6462 }
65- records . forEach ( ( record ) => {
66- var endEvent = null ;
67- var type = record [ 'type' ] ;
68- var data = record [ 'data' ] ;
69- var startTime = record [ 'startTime' ] ;
70- var endTime = record [ 'endTime' ] ;
71-
72- if ( StringWrapper . equals ( type , 'FunctionCall' ) &&
73- ( isBlank ( data ) || ! StringWrapper . equals ( data [ 'scriptName' ] , 'InjectedScript' ) ) ) {
74- ListWrapper . push ( events , {
75- 'name' : 'script' ,
76- 'ts' : startTime ,
77- 'ph' : 'B'
78- } ) ;
79- endEvent = {
80- 'name' : 'script' ,
81- 'ts' : endTime ,
82- 'ph' : 'E' ,
83- 'args' : null
84- }
85- } else if ( StringWrapper . equals ( type , 'TimeStamp' ) ) {
86- var name = data [ 'message' ] ;
87- var ph ;
88- var match = RegExpWrapper . firstMatch ( BEGIN_MARK_RE , name ) ;
89- if ( isPresent ( match ) ) {
90- ph = 'b' ;
91- } else {
92- match = RegExpWrapper . firstMatch ( END_MARK_RE , name ) ;
93- if ( isPresent ( match ) ) {
94- ph = 'e' ;
95- }
96- }
97- if ( isPresent ( ph ) ) {
98- ListWrapper . push ( events , {
99- 'name' : match [ 1 ] ,
100- 'ph' : ph
101- } ) ;
102- }
103- } else if ( StringWrapper . equals ( type , 'RecalculateStyles' ) ||
104- StringWrapper . equals ( type , 'Layout' ) ||
105- StringWrapper . equals ( type , 'UpdateLayerTree' ) ||
106- StringWrapper . equals ( type , 'Paint' ) ||
107- StringWrapper . equals ( type , 'Rasterize' ) ||
108- StringWrapper . equals ( type , 'CompositeLayers' ) ) {
109- ListWrapper . push ( events , {
110- 'name' : 'render' ,
111- 'ts' : startTime ,
112- 'ph' : 'B'
113- } ) ;
114- endEvent = {
115- 'name' : 'render' ,
116- 'ts' : endTime ,
117- 'ph' : 'E' ,
118- 'args' : null
63+ chromeEvents . forEach ( ( event ) => {
64+ var cat = event [ 'cat' ] ;
65+ var name = event [ 'name' ] ;
66+ var args = event [ 'args' ] ;
67+ if ( StringWrapper . equals ( cat , 'disabled-by-default-devtools.timeline' ) ) {
68+ if ( StringWrapper . equals ( name , 'FunctionCall' ) &&
69+ ( isBlank ( args ) || isBlank ( args [ 'data' ] ) || ! StringWrapper . equals ( args [ 'data' ] [ 'scriptName' ] , 'InjectedScript' ) ) ) {
70+ ListWrapper . push ( normalizedEvents , normalizeEvent ( event , {
71+ 'name' : 'script'
72+ } ) ) ;
73+ } else if ( StringWrapper . equals ( name , 'RecalculateStyles' ) ||
74+ StringWrapper . equals ( name , 'Layout' ) ||
75+ StringWrapper . equals ( name , 'UpdateLayerTree' ) ||
76+ StringWrapper . equals ( name , 'Paint' ) ||
77+ StringWrapper . equals ( name , 'Rasterize' ) ||
78+ StringWrapper . equals ( name , 'CompositeLayers' ) ) {
79+ ListWrapper . push ( normalizedEvents , normalizeEvent ( event , {
80+ 'name' : 'render'
81+ } ) ) ;
82+ } else if ( StringWrapper . equals ( name , 'GCEvent' ) ) {
83+ ListWrapper . push ( normalizedEvents , normalizeEvent ( event , {
84+ 'name' : 'gc' ,
85+ 'args' : {
86+ 'usedHeapSize' : isPresent ( args [ 'usedHeapSizeAfter' ] ) ? args [ 'usedHeapSizeAfter' ] : args [ 'usedHeapSizeBefore' ]
87+ }
88+ } ) ) ;
11989 }
120- } else if ( StringWrapper . equals ( type , 'GCEvent' ) ) {
121- ListWrapper . push ( events , {
122- 'name' : 'gc' ,
123- 'ts' : startTime ,
124- 'ph' : 'B'
125- } ) ;
126- endEvent = {
127- 'name' : 'gc' ,
128- 'ts' : endTime ,
129- 'ph' : 'E' ,
130- 'args' : {
131- 'amount' : data [ 'usedHeapSizeDelta' ]
132- }
133- } ;
134- }
135- if ( isPresent ( record [ 'children' ] ) ) {
136- this . _convertPerfRecordsToEvents ( record [ 'children' ] , events ) ;
137- }
138- if ( isPresent ( endEvent ) ) {
139- ListWrapper . push ( events , endEvent ) ;
90+ } else if ( StringWrapper . equals ( cat , 'blink.console' ) ) {
91+ ListWrapper . push ( normalizedEvents , normalizeEvent ( event , {
92+ 'name' : name
93+ } ) ) ;
14094 }
14195 } ) ;
142- return events ;
96+ return normalizedEvents ;
97+ }
98+ }
99+
100+ function normalizeEvent ( chromeEvent , data ) {
101+ var ph = chromeEvent [ 'ph' ] ;
102+ if ( StringWrapper . equals ( ph , 'S' ) ) {
103+ ph = 'b' ;
104+ } else if ( StringWrapper . equals ( ph , 'F' ) ) {
105+ ph = 'e' ;
106+ }
107+ var result = {
108+ 'pid' : chromeEvent [ 'pid' ] ,
109+ 'ph' : ph ,
110+ 'cat' : 'timeline' ,
111+ 'ts' : chromeEvent [ 'ts' ] / 1000
112+ } ;
113+ if ( chromeEvent [ 'ph' ] === 'X' ) {
114+ result [ 'dur' ] = chromeEvent [ 'dur' ] / 1000 ;
143115 }
116+ StringMapWrapper . forEach ( data , ( value , prop ) => {
117+ result [ prop ] = value ;
118+ } ) ;
119+ return result ;
144120}
145121
146122var _BINDINGS = [
0 commit comments