Files
react-native-devtools-frontend/test/e2e/console/console-stack-trace_test.ts
T
Wolfgang Beyer 681ae6ae81 Hide ignore-listed sources in stack traces
We do not want source locations which are on the ignore-list to show up
in stack traces. Ignore-listed stack frames should only be shown after
clicking a 'show more' link.

This behaviour was broken, most likely since the introduction of async
live source locations.

This CL fixes the behaviour by updating the stack traces after the
LiveLocations have been updated.

Screenshots:
(before clicking 'show more') https://i.imgur.com/Gzrv5uw.png
(after clicking 'show more') https://i.imgur.com/DVj7EJ2.png

Bug: 1183325
Change-Id: I2fea963acbed6c6f18ea2426fd3a60960158b18d
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2727495
Commit-Queue: Wolfgang Beyer <wolfi@chromium.org>
Reviewed-by: Sigurd Schneider <sigurds@chromium.org>
2021-03-09 13:04:55 +00:00

98 lines
4.4 KiB
TypeScript

// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {assert} from 'chai';
import {$, click, getBrowserAndPages, goToResource, typeText, waitForFunction} from '../../shared/helper.js';
import {describe, it} from '../../shared/mocha-extensions.js';
import {CONSOLE_TAB_SELECTOR, focusConsolePrompt, STACK_PREVIEW_CONTAINER} from '../helpers/console-helpers.js';
import {openSettingsTab} from '../helpers/settings-helpers.js';
const CONSOLE_MESSAGE_WRAPPER = '.console-message-stack-trace-wrapper';
const ADD_FILENAME_PATTERN_BUTTON = 'button[aria-label="Add filename pattern"]';
const ADD_BUTTON = '.editor-buttons .primary-button';
const CLOSE_SETTINGS_BUTTON = '.close-button[aria-label="Close"]';
const SHOW_MORE_LINK = '.show-all-link .link';
describe('The Console Tab', async () => {
it('shows messages with stack traces', async () => {
const {frontend} = getBrowserAndPages();
await click(CONSOLE_TAB_SELECTOR);
await focusConsolePrompt();
await goToResource('console/stack-trace.html');
await frontend.waitForSelector(CONSOLE_MESSAGE_WRAPPER);
await click(CONSOLE_MESSAGE_WRAPPER);
const stack = await $(STACK_PREVIEW_CONTAINER);
const expected = [
{text: '\nshown3 @ showMe.js:10', classes: {}},
{text: '\nshown2 @ showMe.js:6', classes: {}},
{text: '\nshown1 @ showMe.js:2', classes: {}},
{text: '\n(anonymous) @ ignoreMe.js:21', classes: {}},
{text: '\nPromise.then (async)', classes: {}},
{text: '\nignoreListed4 @ ignoreMe.js:20', classes: {}},
{text: '\nignoreListed3 @ ignoreMe.js:16', classes: {}},
{text: '\nignoreListed2 @ ignoreMe.js:12', classes: {}},
{text: '\nignoreListed1 @ ignoreMe.js:8', classes: {}},
{text: '\n(anonymous) @ ignoreMe.js:5', classes: {}},
];
await waitForFunction(async () => {
const stackTraceRows = await frontend.evaluate((stack: Element) => {
return Array.from(stack.querySelectorAll('tr'))
.map(node => ({text: node.textContent, classes: node.classList}));
}, stack);
return JSON.stringify(stackTraceRows) === JSON.stringify(expected);
});
});
it('shows messages with stack traces containing ignore-listed frames', async () => {
const {frontend} = getBrowserAndPages();
await openSettingsTab('Ignore List');
await click(ADD_FILENAME_PATTERN_BUTTON);
await typeText('ignoreMe.js');
await click(ADD_BUTTON);
await click(CLOSE_SETTINGS_BUTTON);
await goToResource('console/stack-trace.html');
await click(CONSOLE_TAB_SELECTOR);
await frontend.waitForSelector(CONSOLE_MESSAGE_WRAPPER);
await click(CONSOLE_MESSAGE_WRAPPER);
const stack = await $(STACK_PREVIEW_CONTAINER);
const expected = [
{text: '\nshown3 @ showMe.js:10', classes: {}},
{text: '\nshown2 @ showMe.js:6', classes: {}},
{text: '\nshown1 @ showMe.js:2', classes: {}},
{text: '\n(anonymous) @ ignoreMe.js:21', classes: {'0': 'hidden-row'}},
{text: '\nPromise.then (async)', classes: {'0': 'hidden-row'}},
{text: '\nignoreListed4 @ ignoreMe.js:20', classes: {'0': 'hidden-row'}},
{text: '\nignoreListed3 @ ignoreMe.js:16', classes: {'0': 'hidden-row'}},
{text: '\nignoreListed2 @ ignoreMe.js:12', classes: {'0': 'hidden-row'}},
{text: '\nignoreListed1 @ ignoreMe.js:8', classes: {'0': 'hidden-row'}},
{text: '\n(anonymous) @ ignoreMe.js:5', classes: {'0': 'hidden-row'}},
{text: '\nShow 6 more frames', classes: {'0': 'show-all-link'}},
];
await waitForFunction(async () => {
const stackTraceRows = await frontend.evaluate((stack: Element) => {
return Array.from(stack.querySelectorAll('tr'))
.map(node => ({text: node.textContent, classes: node.classList}));
}, stack);
return JSON.stringify(stackTraceRows) === JSON.stringify(expected);
});
// assert that hidden rows are not shown initially
let showHidden = stack ? await stack.evaluate(x => x.classList.contains('show-hidden-rows')) : null;
assert.strictEqual(showHidden, false);
// assert that after clicking 'show all'-button, hidden rows are shown
await click(SHOW_MORE_LINK);
showHidden = stack ? await stack.evaluate(x => x.classList.contains('show-hidden-rows')) : null;
assert.strictEqual(showHidden, true);
});
});