Skip to content

Commit

Permalink
fix: track frame network events before create
Browse files Browse the repository at this point in the history
  • Loading branch information
blakebyrnes committed Aug 25, 2021
1 parent e13f048 commit 56f924d
Showing 1 changed file with 62 additions and 5 deletions.
67 changes: 62 additions & 5 deletions core/lib/Tab.ts
Expand Up @@ -60,6 +60,13 @@ export default class Tab extends TypedEventEmitter<ITabEventParams> {
atCommandId: number;
};

private onFrameCreatedResourceEventsByFrameId: {
[frameId: string]: {
type: keyof IPuppetPageEvents;
event: IPuppetPageEvents[keyof IPuppetPageEvents];
}[];
} = {};

public get navigations(): FrameNavigations {
return this.mainFrameEnvironment.navigations;
}
Expand Down Expand Up @@ -448,7 +455,7 @@ export default class Tab extends TypedEventEmitter<ITabEventParams> {
// wait for a real url to be requested
if (newTab.url === 'about:blank' || !newTab.url) {
let timeoutMs = options?.timeoutMs ?? 10e3;
const millis = new Date().getTime() - startTime.getTime();
const millis = Date.now() - startTime.getTime();
timeoutMs -= millis;
await newTab.navigations.waitOn('navigation-requested', null, timeoutMs).catch(() => null);
}
Expand Down Expand Up @@ -660,8 +667,20 @@ export default class Tab extends TypedEventEmitter<ITabEventParams> {
const { browserRequestId } = resource;
const url = resource.url.href;

const navigations =
this.frameEnvironmentsByPuppetId.get(frameId)?.navigations ?? this.navigations;
let navigations = this.frameEnvironmentsByPuppetId.get(frameId)?.navigations;
// if no frame id provided, use default
if (!frameId && !navigations) {
navigations = this.navigations;
}

if (!navigations && frameId) {
this.onFrameCreatedResourceEventsByFrameId[frameId] ??= [];
const events = this.onFrameCreatedResourceEventsByFrameId[frameId];
if (!events.some(x => x.event === event)) {
events.push({ event, type: 'resource-will-be-requested' });
}
return;
}

if (isDocumentNavigation && !navigations.top) {
navigations.onNavigationRequested(
Expand Down Expand Up @@ -699,7 +718,20 @@ export default class Tab extends TypedEventEmitter<ITabEventParams> {
event.resource,
this.id,
);
const frame = this.frameEnvironmentsByPuppetId.get(event.frameId) ?? this.mainFrameEnvironment;

let frame = this.frameEnvironmentsByPuppetId.get(event.frameId);
// if no frame id provided, use default
if (!frame && !event.frameId) frame = this.mainFrameEnvironment;

if (!frame && event.frameId) {
this.onFrameCreatedResourceEventsByFrameId[event.frameId] ??= [];
const events = this.onFrameCreatedResourceEventsByFrameId[event.frameId];
if (!events.some(x => x.event === event)) {
events.push({ event, type: 'resource-loaded' });
}
return;
}

if (
!!event.resource.browserServedFromCache &&
event.resource.url?.href === frame.navigations?.top?.requestedUrl &&
Expand Down Expand Up @@ -806,7 +838,21 @@ export default class Tab extends TypedEventEmitter<ITabEventParams> {
}

private onNavigationResourceResponse(event: IPuppetPageEvents['navigation-response']): void {
const frame = this.frameEnvironmentsByPuppetId.get(event.frameId) ?? this.mainFrameEnvironment;
let frame = this.frameEnvironmentsByPuppetId.get(event.frameId);

// if no frame id provided, use default
if (!frame && !event.frameId) {
frame = this.mainFrameEnvironment;
}

if (event.frameId && !frame) {
this.onFrameCreatedResourceEventsByFrameId[event.frameId] ??= [];
const events = this.onFrameCreatedResourceEventsByFrameId[event.frameId];
if (!events.some(x => x.event === event)) {
events.push({ event, type: 'navigation-response' });
}
return;
}

frame.navigations.onHttpResponded(event.browserRequestId, event.url, event.loaderId);
this.session.mitmRequestSession.recordDocumentUserActivity(event.url);
Expand All @@ -822,6 +868,17 @@ export default class Tab extends TypedEventEmitter<ITabEventParams> {
const frame = new FrameEnvironment(this, event.frame);
this.frameEnvironmentsByPuppetId.set(frame.devtoolsFrameId, frame);
this.frameEnvironmentsById.set(frame.id, frame);
const resourceEvents = this.onFrameCreatedResourceEventsByFrameId[frame.devtoolsFrameId];
if (resourceEvents) {
for (const { event: resourceEvent, type } of resourceEvents) {
if (type === 'resource-will-be-requested')
this.onResourceWillBeRequested(resourceEvent as any);
else if (type === 'navigation-response')
this.onNavigationResourceResponse(resourceEvent as any);
else if (type === 'resource-loaded') this.onResourceLoaded(resourceEvent as any);
}
}
delete this.onFrameCreatedResourceEventsByFrameId[frame.devtoolsFrameId];
}

/////// LOGGING EVENTS ///////////////////////////////////////////////////////////////////////////
Expand Down

0 comments on commit 56f924d

Please sign in to comment.