Skip to content

Commit 3b016f1

Browse files
authored
refactor: simplify issue management (#564)
follow-up for #505
1 parent c1e4118 commit 3b016f1

File tree

2 files changed

+49
-47
lines changed

2 files changed

+49
-47
lines changed

src/PageCollector.ts

Lines changed: 38 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414

1515
import {FakeIssuesManager} from './DevtoolsUtils.js';
1616
import {logger} from './logger.js';
17-
import type {ConsoleMessage, Protocol} from './third_party/index.js';
17+
import type {CDPSession, ConsoleMessage} from './third_party/index.js';
1818
import {
1919
type Browser,
2020
type Frame,
@@ -210,23 +210,18 @@ export class PageCollector<T> {
210210
export class ConsoleCollector extends PageCollector<
211211
ConsoleMessage | Error | AggregatedIssue
212212
> {
213-
#seenIssueKeys = new WeakMap<Page, Set<string>>();
214-
#issuesAggregators = new WeakMap<Page, IssueAggregator>();
215-
#mockIssuesManagers = new WeakMap<Page, FakeIssuesManager>();
216-
217213
override addPage(page: Page): void {
214+
const subscribed = this.storage.has(page);
218215
super.addPage(page);
219-
void this.subscribeForIssues(page);
216+
if (!subscribed) {
217+
void this.subscribeForIssues(page);
218+
}
220219
}
221-
async subscribeForIssues(page: Page) {
222-
if (this.#seenIssueKeys.has(page)) return;
223220

224-
this.#seenIssueKeys.set(page, new Set());
221+
async subscribeForIssues(page: Page) {
222+
const seenKeys = new Set<string>();
225223
const mockManager = new FakeIssuesManager();
226224
const aggregator = new IssueAggregator(mockManager);
227-
this.#mockIssuesManagers.set(page, mockManager);
228-
this.#issuesAggregators.set(page, aggregator);
229-
230225
aggregator.addEventListener(
231226
IssueAggregatorEvents.AGGREGATED_ISSUE_UPDATED,
232227
event => {
@@ -238,45 +233,45 @@ export class ConsoleCollector extends PageCollector<
238233
page.emit('issue', event.data);
239234
},
240235
);
236+
241237
try {
242-
const session = await page.createCDPSession();
238+
// @ts-expect-error use existing CDP client (internal Puppeteer API).
239+
const session = page._client() as CDPSession;
243240
session.on('Audits.issueAdded', data => {
244-
const inspectorIssue =
245-
data.issue satisfies Protocol.Audits.InspectorIssue;
246-
// @ts-expect-error Types of protocol from Puppeteer and CDP are incomparable for InspectorIssueCode, one is union, other is enum
247-
const issue = createIssuesFromProtocolIssue(null, inspectorIssue)[0];
248-
if (!issue) {
249-
logger('No issue mapping for for the issue: ', inspectorIssue.code);
250-
return;
241+
try {
242+
const inspectorIssue = data.issue;
243+
// @ts-expect-error Types of protocol from Puppeteer and CDP are
244+
// incomparable for InspectorIssueCode, one is union, other is enum.
245+
const issue = createIssuesFromProtocolIssue(null, inspectorIssue)[0];
246+
if (!issue) {
247+
logger('No issue mapping for for the issue: ', inspectorIssue.code);
248+
return;
249+
}
250+
251+
const primaryKey = issue.primaryKey();
252+
if (seenKeys.has(primaryKey)) {
253+
return;
254+
}
255+
seenKeys.add(primaryKey);
256+
257+
mockManager.dispatchEventToListeners(
258+
IssuesManagerEvents.ISSUE_ADDED,
259+
{
260+
issue,
261+
// @ts-expect-error We don't care that issues model is null
262+
issuesModel: null,
263+
},
264+
);
265+
} catch (error) {
266+
logger('Error creating a new issue', error);
251267
}
252-
253-
const seenKeys = this.#seenIssueKeys.get(page)!;
254-
const primaryKey = issue.primaryKey();
255-
if (seenKeys.has(primaryKey)) return;
256-
seenKeys.add(primaryKey);
257-
258-
const mockManager = this.#mockIssuesManagers.get(page);
259-
if (!mockManager) return;
260-
261-
mockManager.dispatchEventToListeners(IssuesManagerEvents.ISSUE_ADDED, {
262-
issue,
263-
// @ts-expect-error We don't care that issues model is null
264-
issuesModel: null,
265-
});
266268
});
267269

268270
await session.send('Audits.enable');
269-
} catch (e) {
270-
logger('Error subscribing to issues', e);
271+
} catch (error) {
272+
logger('Error subscribing to issues', error);
271273
}
272274
}
273-
274-
override cleanupPageDestroyed(page: Page) {
275-
super.cleanupPageDestroyed(page);
276-
this.#seenIssueKeys.delete(page);
277-
this.#issuesAggregators.delete(page);
278-
this.#mockIssuesManagers.delete(page);
279-
}
280275
}
281276

282277
export class NetworkCollector extends PageCollector<HTTPRequest> {

tests/PageCollector.test.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,11 @@ function getMockPage(): Page {
6464
return Promise.resolve(cdpSession as unknown as CDPSession);
6565
},
6666
...mockListener(),
67-
} as Page;
67+
// @ts-expect-error internal API.
68+
_client() {
69+
return cdpSession;
70+
},
71+
} satisfies Page;
6872
}
6973

7074
function getMockBrowser(): Browser {
@@ -362,7 +366,8 @@ describe('ConsoleCollector', () => {
362366
it('emits issues on page', async () => {
363367
const browser = getMockBrowser();
364368
const page = (await browser.pages())[0];
365-
const cdpSession = await page.createCDPSession();
369+
// @ts-expect-error internal API.
370+
const cdpSession = page._client();
366371
const onIssuesListener = sinon.spy();
367372

368373
page.on('issue', onIssuesListener);
@@ -385,7 +390,8 @@ describe('ConsoleCollector', () => {
385390
it('collects issues', async () => {
386391
const browser = getMockBrowser();
387392
const page = (await browser.pages())[0];
388-
const cdpSession = await page.createCDPSession();
393+
// @ts-expect-error internal API.
394+
const cdpSession = page._client();
389395

390396
const collector = new ConsoleCollector(browser, collect => {
391397
return {
@@ -416,7 +422,8 @@ describe('ConsoleCollector', () => {
416422
it('filters duplicated issues', async () => {
417423
const browser = getMockBrowser();
418424
const page = (await browser.pages())[0];
419-
const cdpSession = await page.createCDPSession();
425+
// @ts-expect-error internal API.
426+
const cdpSession = page._client();
420427

421428
const collector = new ConsoleCollector(browser, collect => {
422429
return {

0 commit comments

Comments
 (0)