Skip to content

Commit 23cf3be

Browse files
authored
api: make request.frame() non-null (#1319)
1 parent 0ce8efa commit 23cf3be

File tree

7 files changed

+33
-32
lines changed

7 files changed

+33
-32
lines changed

docs/api.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -3405,7 +3405,7 @@ page.on('requestfailed', request => {
34053405
```
34063406

34073407
#### request.frame()
3408-
- returns: <?[Frame]> A [Frame] that initiated this request, or `null` if navigating to error pages.
3408+
- returns: <[Frame]> A [Frame] that initiated this request.
34093409

34103410
#### request.fulfill(response)
34113411
- `response` <[Object]> Response that will fulfill this request
@@ -3516,7 +3516,7 @@ ResourceType will be one of the following: `document`, `stylesheet`, `image`, `m
35163516
- returns: <Promise[?string]> Waits for this response to finish, throws when corresponding request failed.
35173517

35183518
#### response.frame()
3519-
- returns: <?[Frame]> A [Frame] that initiated this response, or `null` if navigating to error pages.
3519+
- returns: <[Frame]> A [Frame] that initiated this response.
35203520

35213521
#### response.headers()
35223522
- returns: <[Object]> An object with HTTP headers associated with the response. All header names are lower-case.

src/chromium/crNetworkManager.ts

+16-12
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ export class CRNetworkManager {
4242
this._eventListeners = this.instrumentNetworkEvents(client);
4343
}
4444

45-
instrumentNetworkEvents(session: CRSession): RegisteredListener[] {
45+
instrumentNetworkEvents(session: CRSession, workerFrame?: frames.Frame): RegisteredListener[] {
4646
return [
47-
helper.addEventListener(session, 'Fetch.requestPaused', this._onRequestPaused.bind(this)),
47+
helper.addEventListener(session, 'Fetch.requestPaused', this._onRequestPaused.bind(this, workerFrame)),
4848
helper.addEventListener(session, 'Fetch.authRequired', this._onAuthRequired.bind(this)),
49-
helper.addEventListener(session, 'Network.requestWillBeSent', this._onRequestWillBeSent.bind(this)),
49+
helper.addEventListener(session, 'Network.requestWillBeSent', this._onRequestWillBeSent.bind(this, workerFrame)),
5050
helper.addEventListener(session, 'Network.responseReceived', this._onResponseReceived.bind(this)),
5151
helper.addEventListener(session, 'Network.loadingFinished', this._onLoadingFinished.bind(this)),
5252
helper.addEventListener(session, 'Network.loadingFailed', this._onLoadingFailed.bind(this)),
@@ -102,20 +102,20 @@ export class CRNetworkManager {
102102
}
103103
}
104104

105-
_onRequestWillBeSent(event: Protocol.Network.requestWillBeSentPayload) {
105+
_onRequestWillBeSent(workerFrame: frames.Frame | undefined, event: Protocol.Network.requestWillBeSentPayload) {
106106
// Request interception doesn't happen for data URLs with Network Service.
107107
if (this._protocolRequestInterceptionEnabled && !event.request.url.startsWith('data:')) {
108108
const requestId = event.requestId;
109109
const interceptionId = this._requestIdToInterceptionId.get(requestId);
110110
if (interceptionId) {
111-
this._onRequest(event, interceptionId);
111+
this._onRequest(workerFrame, event, interceptionId);
112112
this._requestIdToInterceptionId.delete(requestId);
113113
} else {
114114
this._requestIdToRequestWillBeSentEvent.set(event.requestId, event);
115115
}
116116
return;
117117
}
118-
this._onRequest(event, null);
118+
this._onRequest(workerFrame, event, null);
119119
}
120120

121121
_onAuthRequired(event: Protocol.Fetch.authRequiredPayload) {
@@ -133,7 +133,7 @@ export class CRNetworkManager {
133133
}).catch(debugError);
134134
}
135135

136-
_onRequestPaused(event: Protocol.Fetch.requestPausedPayload) {
136+
_onRequestPaused(workerFrame: frames.Frame | undefined, event: Protocol.Fetch.requestPausedPayload) {
137137
if (!this._userRequestInterceptionEnabled && this._protocolRequestInterceptionEnabled) {
138138
this._client.send('Fetch.continueRequest', {
139139
requestId: event.requestId
@@ -146,14 +146,14 @@ export class CRNetworkManager {
146146
const interceptionId = event.requestId;
147147
const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(requestId);
148148
if (requestWillBeSentEvent) {
149-
this._onRequest(requestWillBeSentEvent, interceptionId);
149+
this._onRequest(workerFrame, requestWillBeSentEvent, interceptionId);
150150
this._requestIdToRequestWillBeSentEvent.delete(requestId);
151151
} else {
152152
this._requestIdToInterceptionId.set(requestId, interceptionId);
153153
}
154154
}
155155

156-
_onRequest(event: Protocol.Network.requestWillBeSentPayload, interceptionId: string | null) {
156+
_onRequest(workerFrame: frames.Frame | undefined, event: Protocol.Network.requestWillBeSentPayload, interceptionId: string | null) {
157157
if (event.request.url.startsWith('data:'))
158158
return;
159159
let redirectChain: network.Request[] = [];
@@ -165,8 +165,12 @@ export class CRNetworkManager {
165165
redirectChain = request.request._redirectChain;
166166
}
167167
}
168-
// TODO: how can frame be null here?
169-
const frame = event.frameId ? this._page._frameManager.frame(event.frameId) : null;
168+
const frame = event.frameId ? this._page._frameManager.frame(event.frameId) : workerFrame;
169+
if (!frame) {
170+
if (interceptionId)
171+
this._client.send('Fetch.continueRequest', { requestId: interceptionId }).catch(debugError);
172+
return;
173+
}
170174
const isNavigationRequest = event.requestId === event.loaderId && event.type === 'Document';
171175
const documentId = isNavigationRequest ? event.loaderId : undefined;
172176
const request = new InterceptableRequest(this._client, frame, interceptionId, documentId, this._userRequestInterceptionEnabled, event, redirectChain);
@@ -244,7 +248,7 @@ class InterceptableRequest implements network.RequestDelegate {
244248
_documentId: string | undefined;
245249
private _client: CRSession;
246250

247-
constructor(client: CRSession, frame: frames.Frame | null, interceptionId: string | null, documentId: string | undefined, allowInterception: boolean, event: Protocol.Network.requestWillBeSentPayload, redirectChain: network.Request[]) {
251+
constructor(client: CRSession, frame: frames.Frame, interceptionId: string | null, documentId: string | undefined, allowInterception: boolean, event: Protocol.Network.requestWillBeSentPayload, redirectChain: network.Request[]) {
248252
this._client = client;
249253
this._requestId = event.requestId;
250254
this._interceptionId = interceptionId;

src/chromium/crPage.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,8 @@ export class CRPage implements PageDelegate {
249249
this._page._addConsoleMessage(event.type, args, toConsoleMessageLocation(event.stackTrace));
250250
});
251251
session.on('Runtime.exceptionThrown', exception => this._page.emit(Events.Page.PageError, exceptionToError(exception.exceptionDetails)));
252-
this._networkManager.instrumentNetworkEvents(session);
252+
// TODO: attribute workers to the right frame.
253+
this._networkManager.instrumentNetworkEvents(session, this._page.mainFrame());
253254
}
254255

255256
_onDetachedFromTarget(event: Protocol.Target.detachedFromTargetPayload) {

src/frames.ts

+7-11
Original file line numberDiff line numberDiff line change
@@ -211,11 +211,8 @@ export class FrameManager {
211211

212212
requestStarted(request: network.Request) {
213213
this._inflightRequestStarted(request);
214-
const frame = request.frame();
215-
if (frame) {
216-
for (const watcher of frame._requestWatchers)
217-
watcher(request);
218-
}
214+
for (const watcher of request.frame()._requestWatchers)
215+
watcher(request);
219216
if (!request._isFavicon)
220217
this._page._requestStarted(request);
221218
}
@@ -233,14 +230,13 @@ export class FrameManager {
233230

234231
requestFailed(request: network.Request, canceled: boolean) {
235232
this._inflightRequestFinished(request);
236-
const frame = request.frame();
237-
if (request._documentId && frame) {
238-
const isCurrentDocument = frame._lastDocumentId === request._documentId;
233+
if (request._documentId) {
234+
const isCurrentDocument = request.frame()._lastDocumentId === request._documentId;
239235
if (!isCurrentDocument) {
240236
let errorText = request.failure()!.errorText;
241237
if (canceled)
242238
errorText += '; maybe frame was detached?';
243-
for (const watcher of frame._documentWatchers)
239+
for (const watcher of request.frame()._documentWatchers)
244240
watcher(request._documentId, new Error(errorText));
245241
}
246242
}
@@ -263,7 +259,7 @@ export class FrameManager {
263259

264260
private _inflightRequestFinished(request: network.Request) {
265261
const frame = request.frame();
266-
if (!frame || request._isFavicon)
262+
if (request._isFavicon)
267263
return;
268264
if (!frame._inflightRequests.has(request))
269265
return;
@@ -276,7 +272,7 @@ export class FrameManager {
276272

277273
private _inflightRequestStarted(request: network.Request) {
278274
const frame = request.frame();
279-
if (!frame || request._isFavicon)
275+
if (request._isFavicon)
280276
return;
281277
frame._inflightRequests.add(request);
282278
if (frame._inflightRequests.size === 1)

src/network.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -107,14 +107,14 @@ export class Request {
107107
private _method: string;
108108
private _postData: string | undefined;
109109
private _headers: Headers;
110-
private _frame: frames.Frame | null;
110+
private _frame: frames.Frame;
111111
private _waitForResponsePromise: Promise<Response>;
112112
private _waitForResponsePromiseCallback: (value: Response) => void = () => {};
113113
private _waitForFinishedPromise: Promise<Response | null>;
114114
private _waitForFinishedPromiseCallback: (value: Response | null) => void = () => {};
115115
private _interceptionHandled = false;
116116

117-
constructor(delegate: RequestDelegate | null, frame: frames.Frame | null, redirectChain: Request[], documentId: string | undefined,
117+
constructor(delegate: RequestDelegate | null, frame: frames.Frame, redirectChain: Request[], documentId: string | undefined,
118118
url: string, resourceType: string, method: string, postData: string | undefined, headers: Headers) {
119119
assert(!url.startsWith('data:'), 'Data urls should not fire requests');
120120
this._delegate = delegate;
@@ -177,7 +177,7 @@ export class Request {
177177
response._finishedPromise.then(() => this._waitForFinishedPromiseCallback(response));
178178
}
179179

180-
frame(): frames.Frame | null {
180+
frame(): frames.Frame {
181181
return this._frame;
182182
}
183183

@@ -309,7 +309,7 @@ export class Response {
309309
return this._request;
310310
}
311311

312-
frame(): frames.Frame | null {
312+
frame(): frames.Frame {
313313
return this._request.frame();
314314
}
315315
}

src/webkit/wkInterceptableRequest.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export class WKInterceptableRequest implements network.RequestDelegate {
4646
_interceptedCallback: () => void = () => {};
4747
private _interceptedPromise: Promise<unknown>;
4848

49-
constructor(session: WKSession, allowInterception: boolean, frame: frames.Frame | null, event: Protocol.Network.requestWillBeSentPayload, redirectChain: network.Request[], documentId: string | undefined) {
49+
constructor(session: WKSession, allowInterception: boolean, frame: frames.Frame, event: Protocol.Network.requestWillBeSentPayload, redirectChain: network.Request[], documentId: string | undefined) {
5050
this._session = session;
5151
this._requestId = event.requestId;
5252
this.request = new network.Request(allowInterception ? this : null, frame, redirectChain, documentId, event.request.url,

src/webkit/wkPage.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,7 @@ export class WKPage implements PageDelegate {
728728
redirectChain = request.request._redirectChain;
729729
}
730730
}
731-
const frame = this._page._frameManager.frame(event.frameId);
731+
const frame = this._page._frameManager.frame(event.frameId)!;
732732
// TODO(einbinder) this will fail if we are an XHR document request
733733
const isNavigationRequest = event.type === 'Document';
734734
const documentId = isNavigationRequest ? event.loaderId : undefined;

0 commit comments

Comments
 (0)