Skip to content

Commit dc19d1c

Browse files
Merge pull request #25 from juliandescottes/ignore-frame-contexts
Ignore frame contexts
2 parents 614b635 + e2fc7da commit dc19d1c

7 files changed

Lines changed: 87 additions & 33 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ff-test-bidi-har-export",
3-
"version": "0.0.12",
3+
"version": "0.0.13",
44
"description": "Experimental helper to export HAR files from WebDriverBiDi network events",
55
"main": "index.js",
66
"scripts": {

src/adapters/events-collection-exporter.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const HarRecorder = require("../har-recorder");
66

77
const EVENT_ORDER = [
88
"network.beforeRequestSent",
9+
"browsingContext.contextCreated",
910
"browsingContext.domContentLoaded",
1011
"network.responseCompleted",
1112
"browsingContext.load",
@@ -25,6 +26,7 @@ const EVENT_ORDER = [
2526
* The expected events are:
2627
* - network.beforeRequestSent
2728
* - network.responseCompleted
29+
* - browsingContext.contextCreated
2830
* - browsingContext.domContentLoaded
2931
* - browsingContext.load
3032
*/

src/adapters/selenium-bidi-har-recorder.js

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,22 @@ class SeleniumBiDiHarRecorder {
4646

4747
this.bidi = await this._driver.getBidi();
4848

49+
await this.bidi.subscribe(
50+
"browsingContext.contextCreated",
51+
this._browsingContextIds,
52+
);
4953
await this.bidi.subscribe(
5054
"browsingContext.domContentLoaded",
51-
this._browsingContextIds
55+
this._browsingContextIds,
5256
);
5357
await this.bidi.subscribe("browsingContext.load", this._browsingContextIds);
5458
await this.bidi.subscribe(
5559
"network.beforeRequestSent",
56-
this._browsingContextIds
60+
this._browsingContextIds,
5761
);
5862
await this.bidi.subscribe(
5963
"network.responseCompleted",
60-
this._browsingContextIds
64+
this._browsingContextIds,
6165
);
6266

6367
this.ws = await this.bidi.socket;
@@ -76,21 +80,25 @@ class SeleniumBiDiHarRecorder {
7680
async stopRecording() {
7781
this.ws.off("message", this._onMessage);
7882

83+
await this.bidi.unsubscribe(
84+
"browsingContext.contextCreated",
85+
this._browsingContextIds,
86+
);
7987
await this.bidi.unsubscribe(
8088
"browsingContext.domContentLoaded",
81-
this._browsingContextIds
89+
this._browsingContextIds,
8290
);
8391
await this.bidi.unsubscribe(
8492
"browsingContext.load",
85-
this._browsingContextIds
93+
this._browsingContextIds,
8694
);
8795
await this.bidi.unsubscribe(
8896
"network.beforeRequestSent",
89-
this._browsingContextIds
97+
this._browsingContextIds,
9098
);
9199
await this.bidi.unsubscribe(
92100
"network.responseCompleted",
93-
this._browsingContextIds
101+
this._browsingContextIds,
94102
);
95103

96104
const lastPageUrl = await this._getPageUrl();
@@ -108,13 +116,13 @@ class SeleniumBiDiHarRecorder {
108116
try {
109117
const browsingContextId = this._browsingContextIds[0];
110118
const params = {
111-
method: 'browsingContext.getTree',
119+
method: "browsingContext.getTree",
112120
params: {
113121
root: browsingContextId,
114122
},
115-
}
123+
};
116124

117-
const response = await this.bidi.send(params)
125+
const response = await this.bidi.send(params);
118126
pageUrl = response.result.contexts[0].url;
119127
} catch (e) {
120128
// Could not fetch page url.

src/har-recorder.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class HarRecorder {
3535

3636
this.networkEntries = [];
3737
this.pageTimings = [];
38+
this.topLevelContexts = [];
3839
}
3940

4041
recordEvent(event) {
@@ -56,6 +57,9 @@ class HarRecorder {
5657
case "network.responseCompleted":
5758
this._onResponseCompleted(params);
5859
break;
60+
case "browsingContext.contextCreated":
61+
this._onContextCreatedEvent(params);
62+
break;
5963
case "browsingContext.domContentLoaded":
6064
this._onBrowsingContextEvent("domContentLoaded", params);
6165
break;
@@ -331,6 +335,15 @@ class HarRecorder {
331335
_onBrowsingContextEvent(type, params) {
332336
let { context, timestamp, url } = params;
333337

338+
if (!this.topLevelContexts.includes(context)) {
339+
this._log(
340+
`Browsing context event "${type}" for url: ${this._shortUrl(
341+
url,
342+
)} discarded (not a top-level context)`,
343+
);
344+
return;
345+
}
346+
334347
let relativeTime = +Infinity,
335348
startedTime = -1;
336349

@@ -417,6 +430,12 @@ class HarRecorder {
417430
});
418431
}
419432

433+
_onContextCreatedEvent(params) {
434+
if (!params.parent) {
435+
this.topLevelContexts.push(params.context);
436+
}
437+
}
438+
420439
_onResponseCompleted(params) {
421440
const id = params.request.request + "-" + params.redirectCount;
422441
const url = params.request.url;

test/adapters/events-collection-exporter.test.js

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,34 @@ test("EventsCollectionExporter generates simple har export", () => {
88
const startTime = Date.now();
99
const {
1010
beforeRequestSentEvent,
11+
contextCreatedEvent,
1112
domContentLoadedEvent,
1213
loadEvent,
1314
responseCompletedEvent,
1415
} = getMockEvents(startTime);
1516

16-
const testCases = [{
17-
name: "Expected order",
18-
events: [
19-
beforeRequestSentEvent,
20-
domContentLoadedEvent,
21-
loadEvent,
22-
responseCompletedEvent,
23-
],
24-
},
25-
{
26-
name: "random order",
27-
events: [
28-
loadEvent,
29-
domContentLoadedEvent,
30-
responseCompletedEvent,
31-
beforeRequestSentEvent,
32-
],
33-
}];
17+
const testCases = [
18+
{
19+
name: "Expected order",
20+
events: [
21+
beforeRequestSentEvent,
22+
contextCreatedEvent,
23+
domContentLoadedEvent,
24+
loadEvent,
25+
responseCompletedEvent,
26+
],
27+
},
28+
{
29+
name: "random order",
30+
events: [
31+
loadEvent,
32+
domContentLoadedEvent,
33+
responseCompletedEvent,
34+
contextCreatedEvent,
35+
beforeRequestSentEvent,
36+
],
37+
},
38+
];
3439

3540
for (const { name, events } of testCases) {
3641
console.log("Test case: " + name);
@@ -47,4 +52,4 @@ test("EventsCollectionExporter generates simple har export", () => {
4752
expect(harExport.log.pages.length).toBe(1);
4853
expect(harExport.log.entries.length).toBe(1);
4954
}
50-
});
55+
});

test/har-recorder.initial-page.test.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ test("HarRecorder generates har export with default initial page", () => {
1313
const {
1414
beforeRequestSentEvent: earlyBeforeRequestSentEvent,
1515
responseCompletedEvent: earlyResponseCompletedEvent,
16-
} = getMockEvents(startTime, { url: "https://other.example.com/"});
16+
} = getMockEvents(startTime, { url: "https://other.example.com/" });
1717

1818
const {
1919
beforeRequestSentEvent,
20+
contextCreatedEvent,
2021
domContentLoadedEvent,
2122
loadEvent,
2223
responseCompletedEvent,
@@ -26,6 +27,7 @@ test("HarRecorder generates har export with default initial page", () => {
2627
recorder.recordEvent(earlyResponseCompletedEvent);
2728
recorder.recordEvent(beforeRequestSentEvent);
2829
recorder.recordEvent(responseCompletedEvent);
30+
recorder.recordEvent(contextCreatedEvent);
2931
recorder.recordEvent(domContentLoadedEvent);
3032
recorder.recordEvent(loadEvent);
3133

@@ -54,10 +56,11 @@ test("HarRecorder generates har export with provided initial page", () => {
5456
const {
5557
beforeRequestSentEvent: earlyBeforeRequestSentEvent,
5658
responseCompletedEvent: earlyResponseCompletedEvent,
57-
} = getMockEvents(startTime, { url: "https://other.example.com/"});
59+
} = getMockEvents(startTime, { url: "https://other.example.com/" });
5860

5961
const {
6062
beforeRequestSentEvent,
63+
contextCreatedEvent,
6164
domContentLoadedEvent,
6265
loadEvent,
6366
responseCompletedEvent,
@@ -67,6 +70,7 @@ test("HarRecorder generates har export with provided initial page", () => {
6770
recorder.recordEvent(earlyResponseCompletedEvent);
6871
recorder.recordEvent(beforeRequestSentEvent);
6972
recorder.recordEvent(responseCompletedEvent);
73+
recorder.recordEvent(contextCreatedEvent);
7074
recorder.recordEvent(domContentLoadedEvent);
7175
recorder.recordEvent(loadEvent);
7276

test/resources/mock-events.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ let { requestHeaders, responseHeaders } = require("./common-resources");
55
let gRequestId = 10;
66

77
function getMockEvents(startTime, options = {}) {
8-
const { contextId = "context-1", useLegacyHeaderFormat = false } = options;
8+
const {
9+
contextId = "context-1",
10+
parentContextId = null,
11+
useLegacyHeaderFormat = false,
12+
} = options;
913
const highResStartTime = startTime * 1000;
1014
const requestId = (options.requestId || gRequestId++) + "";
1115

@@ -112,6 +116,17 @@ function getMockEvents(startTime, options = {}) {
112116
},
113117
};
114118

119+
const contextCreatedEvent = {
120+
method: "browsingContext.contextCreated",
121+
params: {
122+
context: contextId,
123+
parent: parentContextId,
124+
url: options.url || "https://example.com/",
125+
userContext: "default",
126+
timestamp: startTime + 4,
127+
},
128+
};
129+
115130
const domContentLoadedEvent = {
116131
method: "browsingContext.domContentLoaded",
117132
params: {
@@ -132,6 +147,7 @@ function getMockEvents(startTime, options = {}) {
132147

133148
return {
134149
beforeRequestSentEvent,
150+
contextCreatedEvent,
135151
domContentLoadedEvent,
136152
loadEvent,
137153
responseCompletedEvent,

0 commit comments

Comments
 (0)