Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(page): exposed additional info for ConsoleMessage object #3365

Merged
merged 2 commits into from
Jan 11, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 7 additions & 0 deletions docs/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@
* [dialog.type()](#dialogtype)
- [class: ConsoleMessage](#class-consolemessage)
* [consoleMessage.args()](#consolemessageargs)
* [consoleMessage.location()](#consolemessagelocation)
* [consoleMessage.text()](#consolemessagetext)
* [consoleMessage.type()](#consolemessagetype)
- [class: Frame](#class-frame)
Expand Down Expand Up @@ -2171,6 +2172,12 @@ puppeteer.launch().then(async browser => {
#### consoleMessage.args()
- returns: <[Array]<[JSHandle]>>

#### consoleMessage.location()
- returns: <[Object]>
- `url` <[string]> URL of the resource if known
- `lineNumber` <[number]> line number in the resource
- `columnNumber` <[number]> line number in the resource

#### consoleMessage.text()
- returns: <[string]>

Expand Down
36 changes: 30 additions & 6 deletions lib/Page.js
Original file line number Diff line number Diff line change
Expand Up @@ -179,11 +179,11 @@ class Page extends EventEmitter {
* @param {!Protocol.Log.entryAddedPayload} event
*/
_onLogEntryAdded(event) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not the only entry point for console messages. There is also Runtime.consoleAPICalled. It has line number and url contained in the stack trace.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you please elaborate?
I'm looking into Runtime.consoleAPICalled and I don't see such details, nor a reference to ExceptionDetails

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is contained in the callframes of the stacktrace: https://chromedevtools.github.io/devtools-protocol/tot/Runtime#type-CallFrame

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

const {level, text, args, source} = event.entry;
const {level, text, args, source, url, lineNumber} = event.entry;
if (args)
args.map(arg => helper.releaseObject(this._client, arg));
if (source !== 'worker')
this.emit(Page.Events.Console, new ConsoleMessage(level, text));
this.emit(Page.Events.Console, new ConsoleMessage(level, text, undefined, { url, lineNumber }));
}

/**
Expand Down Expand Up @@ -495,7 +495,14 @@ class Page extends EventEmitter {
async _onConsoleAPI(event) {
const context = this._frameManager.executionContextById(event.executionContextId);
const values = event.args.map(arg => createJSHandle(context, arg));
this._addConsoleMessage(event.type, values);
const location = {};
if (event.stackTrace && event.stackTrace.callFrames) {
const {url, lineNumber, columnNumber} = event.stackTrace.callFrames[0];
if (url) location.url = url;
if (lineNumber) location.lineNumber = lineNumber;
if (columnNumber) location.columnNumber = columnNumber;
}
this._addConsoleMessage(event.type, values, location);
}

/**
Expand All @@ -516,8 +523,9 @@ class Page extends EventEmitter {
/**
* @param {string} type
* @param {!Array<!Puppeteer.JSHandle>} args
* @param {ConsoleMessage.Location} location
*/
_addConsoleMessage(type, args) {
_addConsoleMessage(type, args, location) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jsdoc

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

if (!this.listenerCount(Page.Events.Console)) {
args.forEach(arg => arg.dispose());
return;
Expand All @@ -530,7 +538,7 @@ class Page extends EventEmitter {
else
textTokens.push(helper.valueFromRemoteObject(remoteObject));
}
const message = new ConsoleMessage(type, textTokens.join(' '), args);
const message = new ConsoleMessage(type, textTokens.join(' '), args, location);
this.emit(Page.Events.Console, message);
}

Expand Down Expand Up @@ -1124,16 +1132,25 @@ Page.Events = {
* @property {("Strict"|"Lax")=} sameSite
*/

/**
* @typedef {Object} ConsoleMessage.Location
* @property {string=} url
* @property {number=} lineNumber
* @property {number=} columnNumber
*/

class ConsoleMessage {
/**
* @param {string} type
* @param {string} text
* @param {!Array<!Puppeteer.JSHandle>} args
* @param {ConsoleMessage.Location} location
*/
constructor(type, text, args = []) {
constructor(type, text, args = [], location = {}) {
this._type = type;
this._text = text;
this._args = args;
this._location = location;
}

/**
Expand All @@ -1156,6 +1173,13 @@ class ConsoleMessage {
args() {
return this._args;
}

/**
* @return {Object}
*/
location() {
return this._location;
}
}


Expand Down
11 changes: 11 additions & 0 deletions test/assets/console-message-1.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>Log Entry Test</title>
</head>
<body>
<script>
fetch('http://wat')
</script>
</body>
</html>
11 changes: 11 additions & 0 deletions test/assets/console-message-2.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>Log Entry Test</title>
</head>
<body>
<script>
console.warn('wat')
</script>
</body>
</html>
35 changes: 35 additions & 0 deletions test/page.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,41 @@ module.exports.addTests = function({testRunner, expect, headless}) {
expect(message.text()).toContain('No \'Access-Control-Allow-Origin\'');
expect(message.type()).toEqual('error');
});
it('should show correct additional info when console event emitted for logEntry', async({page, server}) => {
let message = null;
page.on('console', msg => {
message = msg;
});
await Promise.all([
page.goto(server.PREFIX + '/console-message-1.html'),
waitEvent(page, 'console'),
]);
await new Promise(resolve => setTimeout(resolve, 5000));
expect(message.text()).toContain(`ERR_NAME_NOT_RESOLVED`);
expect(message.type()).toEqual('error');
expect(message.location()).toEqual({
url: 'http://wat/',
lineNumber: undefined
});
});
it('should show correct additional info when console event emitted for consoleAPI', async({page, server}) => {
let message = null;
page.on('console', msg => {
message = msg;
});
await Promise.all([
page.goto(server.PREFIX + '/console-message-2.html'),
waitEvent(page, 'console'),
]);
await new Promise(resolve => setTimeout(resolve, 5000));
expect(message.text()).toContain(`wat`);
expect(message.type()).toEqual('warning');
expect(message.location()).toEqual({
url: `http://localhost:${server.PORT}/console-message-2.html`,
lineNumber: 7,
columnNumber: 16
});
});
});

describe('Page.Events.DOMContentLoaded', function() {
Expand Down