@@ -52,48 +52,58 @@ export class HarTracer {
52
52
pages : [ ] ,
53
53
entries : [ ]
54
54
} ;
55
- context . on ( BrowserContext . Events . Page , page => this . _onPage ( page ) ) ;
55
+ context . on ( BrowserContext . Events . Page , ( page : Page ) => this . _ensurePageEntry ( page ) ) ;
56
+ context . on ( BrowserContext . Events . Request , ( request : network . Request ) => this . _onRequest ( request ) ) ;
57
+ context . on ( BrowserContext . Events . Response , ( response : network . Response ) => this . _onResponse ( response ) ) ;
56
58
}
57
59
58
- private _onPage ( page : Page ) {
59
- const pageEntry : har . Page = {
60
- startedDateTime : new Date ( ) ,
61
- id : `page_${ this . _lastPage ++ } ` ,
62
- title : '' ,
63
- pageTimings : {
64
- onContentLoad : - 1 ,
65
- onLoad : - 1 ,
66
- } ,
67
- } ;
68
- this . _pageEntries . set ( page , pageEntry ) ;
69
- this . _log . pages . push ( pageEntry ) ;
70
- page . on ( Page . Events . Request , ( request : network . Request ) => this . _onRequest ( page , request ) ) ;
71
- page . on ( Page . Events . Response , ( response : network . Response ) => this . _onResponse ( page , response ) ) ;
60
+ private _ensurePageEntry ( page : Page ) {
61
+ let pageEntry = this . _pageEntries . get ( page ) ;
62
+ if ( ! pageEntry ) {
63
+ page . on ( Page . Events . DOMContentLoaded , ( ) => this . _onDOMContentLoaded ( page ) ) ;
64
+ page . on ( Page . Events . Load , ( ) => this . _onLoad ( page ) ) ;
72
65
73
- page . on ( Page . Events . DOMContentLoaded , ( ) => {
74
- const promise = page . mainFrame ( ) . evaluateExpression ( String ( ( ) => {
75
- return {
76
- title : document . title ,
77
- domContentLoaded : performance . timing . domContentLoadedEventStart ,
78
- } ;
79
- } ) , true , undefined , 'utility' ) . then ( result => {
80
- pageEntry . title = result . title ;
81
- pageEntry . pageTimings . onContentLoad = result . domContentLoaded ;
82
- } ) . catch ( ( ) => { } ) ;
83
- this . _addBarrier ( page , promise ) ;
84
- } ) ;
85
- page . on ( Page . Events . Load , ( ) => {
86
- const promise = page . mainFrame ( ) . evaluateExpression ( String ( ( ) => {
87
- return {
88
- title : document . title ,
89
- loaded : performance . timing . loadEventStart ,
90
- } ;
91
- } ) , true , undefined , 'utility' ) . then ( result => {
92
- pageEntry . title = result . title ;
93
- pageEntry . pageTimings . onLoad = result . loaded ;
94
- } ) . catch ( ( ) => { } ) ;
95
- this . _addBarrier ( page , promise ) ;
96
- } ) ;
66
+ pageEntry = {
67
+ startedDateTime : new Date ( ) ,
68
+ id : `page_${ this . _lastPage ++ } ` ,
69
+ title : '' ,
70
+ pageTimings : {
71
+ onContentLoad : - 1 ,
72
+ onLoad : - 1 ,
73
+ } ,
74
+ } ;
75
+ this . _pageEntries . set ( page , pageEntry ) ;
76
+ this . _log . pages . push ( pageEntry ) ;
77
+ }
78
+ return pageEntry ;
79
+ }
80
+
81
+ private _onDOMContentLoaded ( page : Page ) {
82
+ const pageEntry = this . _ensurePageEntry ( page ) ;
83
+ const promise = page . mainFrame ( ) . evaluateExpression ( String ( ( ) => {
84
+ return {
85
+ title : document . title ,
86
+ domContentLoaded : performance . timing . domContentLoadedEventStart ,
87
+ } ;
88
+ } ) , true , undefined , 'utility' ) . then ( result => {
89
+ pageEntry . title = result . title ;
90
+ pageEntry . pageTimings . onContentLoad = result . domContentLoaded ;
91
+ } ) . catch ( ( ) => { } ) ;
92
+ this . _addBarrier ( page , promise ) ;
93
+ }
94
+
95
+ private _onLoad ( page : Page ) {
96
+ const pageEntry = this . _ensurePageEntry ( page ) ;
97
+ const promise = page . mainFrame ( ) . evaluateExpression ( String ( ( ) => {
98
+ return {
99
+ title : document . title ,
100
+ loaded : performance . timing . loadEventStart ,
101
+ } ;
102
+ } ) , true , undefined , 'utility' ) . then ( result => {
103
+ pageEntry . title = result . title ;
104
+ pageEntry . pageTimings . onLoad = result . loaded ;
105
+ } ) . catch ( ( ) => { } ) ;
106
+ this . _addBarrier ( page , promise ) ;
97
107
}
98
108
99
109
private _addBarrier ( page : Page , promise : Promise < void > ) {
@@ -107,12 +117,13 @@ export class HarTracer {
107
117
this . _barrierPromises . add ( race ) ;
108
118
}
109
119
110
- private _onRequest ( page : Page , request : network . Request ) {
111
- const pageEntry = this . _pageEntries . get ( page ) ! ;
120
+ private _onRequest ( request : network . Request ) {
121
+ const page = request . frame ( ) . _page ;
112
122
const url = network . parsedURL ( request . url ( ) ) ;
113
123
if ( ! url )
114
124
return ;
115
125
126
+ const pageEntry = this . _ensurePageEntry ( page ) ;
116
127
const harEntry : har . Entry = {
117
128
pageref : pageEntry . id ,
118
129
startedDateTime : new Date ( ) ,
@@ -160,8 +171,9 @@ export class HarTracer {
160
171
this . _entries . set ( request , harEntry ) ;
161
172
}
162
173
163
- private _onResponse ( page : Page , response : network . Response ) {
164
- const pageEntry = this . _pageEntries . get ( page ) ! ;
174
+ private _onResponse ( response : network . Response ) {
175
+ const page = response . frame ( ) . _page ;
176
+ const pageEntry = this . _ensurePageEntry ( page ) ;
165
177
const harEntry = this . _entries . get ( response . request ( ) ) ! ;
166
178
// Rewrite provisional headers with actual
167
179
const request = response . request ( ) ;
0 commit comments