Skip to content

Commit 5348572

Browse files
authored
fix(console): respect repeat count in webkit (#2032)
1 parent b11d7f1 commit 5348572

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

src/webkit/wkPage.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ import * as jpeg from 'jpeg-js';
3838
import * as png from 'pngjs';
3939
import { NotConnectedError } from '../errors';
4040
import { logError } from '../logger';
41+
import { ConsoleMessageLocation } from '../console';
42+
import { JSHandle } from '../javascript';
4143

4244
const UTILITY_WORLD_NAME = '__playwright_utility_world__';
4345
const BINDING_CALL_MESSAGE = '__playwright_binding_call__';
@@ -64,6 +66,7 @@ export class WKPage implements PageDelegate {
6466
private _firstNonInitialNavigationCommittedPromise: Promise<void>;
6567
private _firstNonInitialNavigationCommittedFulfill = () => {};
6668
private _firstNonInitialNavigationCommittedReject = (e: Error) => {};
69+
private _lastConsoleMessage: { derivedType: string, text: string, handles: JSHandle[]; count: number, location: ConsoleMessageLocation; } | null = null;
6770

6871
constructor(browserContext: WKBrowserContext, pageProxySession: WKSession, opener: WKPage | null) {
6972
this._pageProxySession = pageProxySession;
@@ -320,6 +323,7 @@ export class WKPage implements PageDelegate {
320323
helper.addEventListener(this._session, 'Page.didRequestOpenWindow', event => this._onDidRequestOpenWindow(event)),
321324
helper.addEventListener(this._session, 'Runtime.executionContextCreated', event => this._onExecutionContextCreated(event.context)),
322325
helper.addEventListener(this._session, 'Console.messageAdded', event => this._onConsoleMessage(event)),
326+
helper.addEventListener(this._session, 'Console.messageRepeatCountUpdated', event => this._onConsoleRepeatCountUpdated(event)),
323327
helper.addEventListener(this._pageProxySession, 'Dialog.javascriptDialogOpening', event => this._onDialog(event)),
324328
helper.addEventListener(this._session, 'Page.fileChooserOpened', event => this._onFileChooserOpened(event)),
325329
helper.addEventListener(this._session, 'Network.requestWillBeSent', e => this._onRequestWillBeSent(this._session, e)),
@@ -483,7 +487,33 @@ export class WKPage implements PageDelegate {
483487
}
484488
return context._createHandle(p);
485489
});
486-
this._page._addConsoleMessage(derivedType, handles, { url, lineNumber: (lineNumber || 1) - 1, columnNumber: (columnNumber || 1) - 1 }, handles.length ? undefined : text);
490+
this._lastConsoleMessage = {
491+
derivedType,
492+
text,
493+
handles,
494+
count: 0,
495+
location: {
496+
url,
497+
lineNumber: (lineNumber || 1) - 1,
498+
columnNumber: (columnNumber || 1) - 1,
499+
}
500+
};
501+
this._onConsoleRepeatCountUpdated({ count: 1});
502+
}
503+
504+
_onConsoleRepeatCountUpdated(event: Protocol.Console.messageRepeatCountUpdatedPayload) {
505+
if (this._lastConsoleMessage) {
506+
const {
507+
derivedType,
508+
text,
509+
handles,
510+
count,
511+
location
512+
} = this._lastConsoleMessage;
513+
for (let i = count; i < event.count; ++i)
514+
this._page._addConsoleMessage(derivedType, handles, location, handles.length ? undefined : text);
515+
this._lastConsoleMessage.count = event.count;
516+
}
487517
}
488518

489519
_onDialog(event: Protocol.Dialog.javascriptDialogOpeningPayload) {

test/page.spec.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,12 @@ describe('Page.Events.Console', function() {
163163
expect(await message.args()[1].jsonValue()).toEqual(5);
164164
expect(await message.args()[2].jsonValue()).toEqual({foo: 'bar'});
165165
});
166+
it('should emit same log twice', async({page, server}) => {
167+
const messages = [];
168+
page.on('console', m => messages.push(m.text()));
169+
await page.evaluate(() => { for (let i = 0; i < 2; ++i ) console.log('hello'); } );
170+
expect(messages).toEqual(['hello', 'hello']);
171+
});
166172
it('should work for different console API calls', async({page, server}) => {
167173
const messages = [];
168174
page.on('console', msg => messages.push(msg));

0 commit comments

Comments
 (0)