mirror of
https://github.com/react/react-native-devtools-frontend.git
synced 2026-10-06 20:11:38 +08:00
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>
98 lines
4.4 KiB
TypeScript
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);
|
|
});
|
|
});
|