diff --git a/package-lock.json b/package-lock.json index d1fbf4cf4..e1eb9deed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "globals": "^17.0.0", "lighthouse": "13.1.0", "prettier": "^3.6.2", - "puppeteer": "24.40.0", + "puppeteer": "24.41.0", "rollup": "4.60.1", "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-license": "^3.6.0", @@ -3870,9 +3870,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1581282", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1581282.tgz", - "integrity": "sha512-nv7iKtNZQshSW2hKzYNr46nM/Cfh5SEvE2oV0/SEGgc9XupIY5ggf84Cz8eJIkBce7S3bmTAauFD6aysMpnqsQ==", + "version": "0.0.1595872", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1595872.tgz", + "integrity": "sha512-kRfgp8vWVjBu/fbYCiVFiOqsCk3CrMKEo3WbgGT2NXK2dG7vawWPBljixajVgGK9II8rDO9G0oD0zLt3I1daRg==", "dev": true, "license": "BSD-3-Clause" }, @@ -7477,9 +7477,9 @@ } }, "node_modules/puppeteer": { - "version": "24.40.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.40.0.tgz", - "integrity": "sha512-IxQbDq93XHVVLWHrAkFP7F7iHvb9o0mgfsSIMlhHb+JM+JjM1V4v4MNSQfcRWJopx9dsNOr9adYv0U5fm9BJBQ==", + "version": "24.41.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.41.0.tgz", + "integrity": "sha512-W6Fk0J3TPjjtwjXOyR/qf+YaL0H/Uq8HIgHcXG4mNM/IgbKMCH/HPyK0Fi2qbTU/QpSl9bCte2yBpGHKejTpIw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -7487,8 +7487,8 @@ "@puppeteer/browsers": "2.13.0", "chromium-bidi": "14.0.0", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1581282", - "puppeteer-core": "24.40.0", + "devtools-protocol": "0.0.1595872", + "puppeteer-core": "24.41.0", "typed-query-selector": "^2.12.1" }, "bin": { @@ -7499,16 +7499,16 @@ } }, "node_modules/puppeteer-core": { - "version": "24.40.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.40.0.tgz", - "integrity": "sha512-MWL3XbUCfVgGR0gRsidzT6oKJT2QydPLhMITU6HoVWiiv4gkb6gJi3pcdAa8q4HwjBTbqISOWVP4aJiiyUJvag==", + "version": "24.41.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.41.0.tgz", + "integrity": "sha512-rLIUri7E/NQ3APSEYCCozaSJx0u8Tu9wxO6BJwnvXmIgILSK3L0TombaVh3izp1njAGrO6H2ru0hcIrLF+gWLw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.13.0", "chromium-bidi": "14.0.0", "debug": "^4.4.3", - "devtools-protocol": "0.0.1581282", + "devtools-protocol": "0.0.1595872", "typed-query-selector": "^2.12.1", "webdriver-bidi-protocol": "0.4.1", "ws": "^8.19.0" diff --git a/package.json b/package.json index 2925e659b..3ea6bfc5d 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "globals": "^17.0.0", "lighthouse": "13.1.0", "prettier": "^3.6.2", - "puppeteer": "24.40.0", + "puppeteer": "24.41.0", "rollup": "4.60.1", "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-license": "^3.6.0", diff --git a/src/McpContext.ts b/src/McpContext.ts index 32b7413e6..63f7f8fc6 100644 --- a/src/McpContext.ts +++ b/src/McpContext.ts @@ -117,7 +117,7 @@ export class McpContext implements Context { uncaughtError: event => { collect(event); }, - issue: event => { + devtoolsAggregatedIssue: event => { collect(event); }, } as ListenerMap; diff --git a/src/PageCollector.ts b/src/PageCollector.ts index d943baa54..ce6a792e6 100644 --- a/src/PageCollector.ts +++ b/src/PageCollector.ts @@ -11,6 +11,7 @@ import type { CDPSession, ConsoleMessage, Protocol, + Issue, } from './third_party/index.js'; import {DevTools} from './third_party/index.js'; import { @@ -33,7 +34,7 @@ export class UncaughtError { } interface PageEvents extends PuppeteerPageEvents { - issue: DevTools.AggregatedIssue; + devtoolsAggregatedIssue: DevTools.AggregatedIssue; uncaughtError: UncaughtError; } @@ -285,7 +286,7 @@ class PageEventSubscriber { async subscribe() { this.#resetIssueAggregator(); this.#page.on('framenavigated', this.#onFrameNavigated); - this.#session.on('Audits.issueAdded', this.#onIssueAdded); + this.#page.on('issue', this.#onIssueAdded); this.#session.on('Runtime.exceptionThrown', this.#onExceptionThrown); try { await this.#session.send('Audits.enable'); @@ -298,7 +299,7 @@ class PageEventSubscriber { this.#seenKeys.clear(); this.#seenIssues.clear(); this.#page.off('framenavigated', this.#onFrameNavigated); - this.#session.off('Audits.issueAdded', this.#onIssueAdded); + this.#page.off('issue', this.#onIssueAdded); this.#session.off('Runtime.exceptionThrown', this.#onExceptionThrown); if (this.#issueAggregator) { this.#issueAggregator.removeEventListener( @@ -318,7 +319,7 @@ class PageEventSubscriber { return; } this.#seenIssues.add(event.data); - this.#page.emit('issue', event.data); + this.#page.emit('devtoolsAggregatedIssue', event.data); }; #onExceptionThrown = (event: Protocol.Runtime.ExceptionThrownEvent) => { @@ -339,9 +340,8 @@ class PageEventSubscriber { this.#resetIssueAggregator(); }; - #onIssueAdded = (data: Protocol.Audits.IssueAddedEvent) => { + #onIssueAdded = (inspectorIssue: Issue) => { try { - const inspectorIssue = data.issue; const issue = DevTools.createIssuesFromProtocolIssue( null, // @ts-expect-error Protocol types diverge. diff --git a/tests/PageCollector.test.ts b/tests/PageCollector.test.ts index 6814002a5..be5b0b0ef 100644 --- a/tests/PageCollector.test.ts +++ b/tests/PageCollector.test.ts @@ -329,40 +329,13 @@ describe('ConsoleCollector', () => { sinon.restore(); }); - it('emits issues on page', async () => { - const browser = getMockBrowser(); - const page = (await browser.pages())[0]; - // @ts-expect-error internal API. - const cdpSession = page._client(); - const onIssuesListener = sinon.spy(); - - page.on('issue', onIssuesListener); - - const collector = new ConsoleCollector(browser, collect => { - return { - issue: issue => { - collect(issue as DevTools.AggregatedIssue); - }, - } as ListenerMap; - }); - await collector.init([page]); - cdpSession.emit('Audits.issueAdded', {issue}); - sinon.assert.calledOnce(onIssuesListener); - - const issueArgument = onIssuesListener.getCall(0).args[0]; - assert(issueArgument instanceof DevTools.AggregatedIssue); - }); - it('collects issues', async () => { const browser = getMockBrowser(); const page = (await browser.pages())[0]; - // @ts-expect-error internal API. - const cdpSession = page._client(); - const collector = new ConsoleCollector(browser, collect => { return { - issue: issue => { - collect(issue as DevTools.AggregatedIssue); + devtoolsAggregatedIssue: issue => { + collect(issue); }, } as ListenerMap; }); @@ -379,8 +352,8 @@ describe('ConsoleCollector', () => { }, } satisfies Protocol.Audits.InspectorIssue; - cdpSession.emit('Audits.issueAdded', {issue}); - cdpSession.emit('Audits.issueAdded', {issue: issue2}); + page.emit('issue', issue); + page.emit('issue', issue2); const data = collector.getData(page); assert.equal(data.length, 2); }); @@ -388,20 +361,18 @@ describe('ConsoleCollector', () => { it('filters duplicated issues', async () => { const browser = getMockBrowser(); const page = (await browser.pages())[0]; - // @ts-expect-error internal API. - const cdpSession = page._client(); const collector = new ConsoleCollector(browser, collect => { return { - issue: issue => { - collect(issue as DevTools.AggregatedIssue); + devtoolsAggregatedIssue: issue => { + collect(issue); }, } as ListenerMap; }); await collector.init([page]); - cdpSession.emit('Audits.issueAdded', {issue}); - cdpSession.emit('Audits.issueAdded', {issue}); + page.emit('issue', issue); + page.emit('issue', issue); const data = collector.getData(page); assert.equal(data.length, 1); const collectedIssue = data[0];