1
1
import { bind } from 'angular2/di' ;
2
- import { ListWrapper } from 'angular2/src/facade/collection' ;
2
+ import { ListWrapper , StringMapWrapper } from 'angular2/src/facade/collection' ;
3
3
import {
4
- Json , isPresent , isBlank , RegExpWrapper , StringWrapper
4
+ Json , isPresent , isBlank , RegExpWrapper , StringWrapper , BaseException , NumberWrapper
5
5
} from 'angular2/src/facade/lang' ;
6
6
7
7
import { WebDriverExtension } from '../web_driver_extension' ;
8
8
import { WebDriverAdapter } from '../web_driver_adapter' ;
9
9
import { Promise } from 'angular2/src/facade/async' ;
10
10
11
11
12
- var BEGIN_MARK_RE = RegExpWrapper . create ( 'begin_(.*)' ) ;
13
- var END_MARK_RE = RegExpWrapper . create ( 'end_(.*)' ) ;
14
-
15
12
export class ChromeDriverExtension extends WebDriverExtension {
16
13
// TODO(tbosch): use static values when our transpiler supports them
17
14
static get BINDINGS ( ) { return _BINDINGS ; }
@@ -28,15 +25,13 @@ export class ChromeDriverExtension extends WebDriverExtension {
28
25
}
29
26
30
27
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 } ');` ) ;
33
29
}
34
30
35
31
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 } ');` ;
38
33
if ( isPresent ( restartName ) ) {
39
- script += `console.timeStamp('begin_ ${ restartName } ');`
34
+ script += `console.time(' ${ restartName } ');`
40
35
}
41
36
return this . _driver . executeScript ( script ) ;
42
37
}
@@ -47,100 +42,81 @@ export class ChromeDriverExtension extends WebDriverExtension {
47
42
return this . _driver . executeScript ( '1+1' )
48
43
. then ( ( _ ) => this . _driver . logs ( 'performance' ) )
49
44
. then ( ( entries ) => {
50
- var records = [ ] ;
45
+ var events = [ ] ;
51
46
ListWrapper . forEach ( entries , function ( entry ) {
52
47
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!' ) ;
55
53
}
56
54
} ) ;
57
- return this . _convertPerfRecordsToEvents ( records ) ;
55
+ return this . _convertPerfRecordsToEvents ( events ) ;
58
56
} ) ;
59
57
}
60
58
61
- _convertPerfRecordsToEvents ( records , events = null ) {
62
- if ( isBlank ( events ) ) {
63
- events = [ ] ;
59
+ _convertPerfRecordsToEvents ( chromeEvents , normalizedEvents = null ) {
60
+ if ( isBlank ( normalizedEvents ) ) {
61
+ normalizedEvents = [ ] ;
64
62
}
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
+ } ) ) ;
119
89
}
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
+ } ) ) ;
140
94
}
141
95
} ) ;
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 ;
143
115
}
116
+ StringMapWrapper . forEach ( data , ( value , prop ) => {
117
+ result [ prop ] = value ;
118
+ } ) ;
119
+ return result ;
144
120
}
145
121
146
122
var _BINDINGS = [
0 commit comments