Skip to content

Commit b610bfa

Browse files
ktranDevtools-frontend LUCI CQ
authored andcommitted
Make DOM breakpoints empty state only show a one-liner
With https://crrev.com/c/6152575 we updated the empty states for the DOM breakpoints view. However, DOM breakpoints are shown both in sources and in the elements panel. For the sources panel, we only want to show a one liner. Drive-by: Slightly changing the header text to fit in with the remaining sidebar empty state one-liners Screenshot: https://imgur.com/a/dbRtGdN Fixed: 397254690 Change-Id: I5bb70e7462c9e0b1f0863b3ecaf8cfc73e2e4fd8 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6277065 Reviewed-by: Kateryna Prokopenko <[email protected]> Commit-Queue: Kim-Anh Tran <[email protected]>
1 parent 914a8ad commit b610bfa

File tree

4 files changed

+86
-9
lines changed

4 files changed

+86
-9
lines changed

front_end/panels/browser_debugger/BUILD.gn

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ devtools_entrypoint("meta") {
7070
ts_library("unittests") {
7171
testonly = true
7272

73-
sources = [ "browser_debugger.test.ts" ]
73+
sources = [
74+
"DOMBreakpointsSidebarPane.test.ts",
75+
"browser_debugger.test.ts",
76+
]
7477

7578
deps = [
7679
":bundle",
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Copyright 2025 The Chromium Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import {describeWithLocale} from '../../testing/EnvironmentHelpers.js';
6+
7+
import * as BrowserDebugger from './browser_debugger.js';
8+
9+
describeWithLocale('DOMBreakpointsSidebarPane placeholder', () => {
10+
function assertElementDisplayStyle(selector: string, style: string) {
11+
const element =
12+
BrowserDebugger.DOMBreakpointsSidebarPane.DOMBreakpointsSidebarPane.instance().contentElement.querySelector(
13+
selector);
14+
assert.exists(element);
15+
assert.deepEqual(window.getComputedStyle(element).display, style);
16+
}
17+
18+
it('shows one-liner if in sources', () => {
19+
const domBreakpointsSidebarPane = BrowserDebugger.DOMBreakpointsSidebarPane.DOMBreakpointsSidebarPane.instance();
20+
const container = document.createElement('div');
21+
container.classList.add('sources', 'panel');
22+
domBreakpointsSidebarPane.markAsRoot();
23+
domBreakpointsSidebarPane.show(container);
24+
25+
document.body.appendChild(container);
26+
assertElementDisplayStyle('.empty-view-scroller', 'none');
27+
assertElementDisplayStyle('.placeholder .gray-info-message', 'block');
28+
29+
assert.deepEqual(
30+
domBreakpointsSidebarPane.contentElement.querySelector('.placeholder .gray-info-message')?.textContent,
31+
'No DOM breakpoints');
32+
33+
domBreakpointsSidebarPane.detach();
34+
container.remove();
35+
});
36+
37+
it('shows empty widget if in elements panel', () => {
38+
const domBreakpointsSidebarPane = BrowserDebugger.DOMBreakpointsSidebarPane.DOMBreakpointsSidebarPane.instance();
39+
const container = document.createElement('div');
40+
container.classList.add('elements', 'panel');
41+
domBreakpointsSidebarPane.markAsRoot();
42+
domBreakpointsSidebarPane.show(container);
43+
44+
document.body.appendChild(container);
45+
assertElementDisplayStyle('.empty-view-scroller', 'flex');
46+
assertElementDisplayStyle('.placeholder .gray-info-message', 'none');
47+
48+
assert.deepEqual(
49+
domBreakpointsSidebarPane.contentElement.querySelector('.empty-state-header')?.textContent,
50+
'No DOM breakpoints');
51+
assert.deepEqual(
52+
domBreakpointsSidebarPane.contentElement.querySelector('.empty-state-description > span')?.textContent,
53+
'DOM breakpoints pause on the code that changes a DOM node or its children.');
54+
55+
domBreakpointsSidebarPane.detach();
56+
container.remove();
57+
});
58+
});

front_end/panels/browser_debugger/DOMBreakpointsSidebarPane.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ const UIStrings = {
4343
/**
4444
*@description Header text to indicate there are no breakpoints
4545
*/
46-
noBreakpoints: 'No DOM breakpoints set',
46+
noBreakpoints: 'No DOM breakpoints',
4747
/**
4848
*@description DOM breakpoints description that shows if no DOM breakpoints are set
4949
*/
@@ -135,7 +135,7 @@ let domBreakpointsSidebarPaneInstance: DOMBreakpointsSidebarPane;
135135
export class DOMBreakpointsSidebarPane extends UI.Widget.VBox implements
136136
UI.ContextFlavorListener.ContextFlavorListener, UI.ListControl.ListDelegate<SDK.DOMDebuggerModel.DOMBreakpoint> {
137137
elementToCheckboxes: WeakMap<Element, HTMLInputElement>;
138-
readonly #emptyElement: UI.EmptyWidget.EmptyWidget;
138+
readonly #emptyElement: HTMLElement;
139139
readonly #breakpoints: UI.ListModel.ListModel<SDK.DOMDebuggerModel.DOMBreakpoint>;
140140
#list: UI.ListControl.ListControl<SDK.DOMDebuggerModel.DOMBreakpoint>;
141141
#highlightedBreakpoint: SDK.DOMDebuggerModel.DOMBreakpoint|null;
@@ -149,10 +149,12 @@ export class DOMBreakpointsSidebarPane extends UI.Widget.VBox implements
149149
this.contentElement.setAttribute(
150150
'jslog', `${VisualLogging.section('sources.dom-breakpoints').track({resize: true})}`);
151151
this.contentElement.classList.add('dom-breakpoints-container');
152-
this.#emptyElement =
152+
this.#emptyElement = this.contentElement.createChild('div', 'placeholder');
153+
this.#emptyElement.createChild('div', 'gray-info-message').textContent = i18nString(UIStrings.noBreakpoints);
154+
const emptyWidget =
153155
new UI.EmptyWidget.EmptyWidget(UIStrings.noBreakpoints, i18nString(UIStrings.domBreakpointsDescription));
154-
this.#emptyElement.appendLink(DOM_BREAKPOINT_DOCUMENTATION_URL);
155-
this.#emptyElement.show(this.contentElement);
156+
emptyWidget.appendLink(DOM_BREAKPOINT_DOCUMENTATION_URL);
157+
emptyWidget.show(this.#emptyElement);
156158

157159
this.#breakpoints = new UI.ListModel.ListModel();
158160
this.#list = new UI.ListControl.ListControl(this.#breakpoints, this, UI.ListControl.ListMode.NonViewport);
@@ -250,7 +252,7 @@ export class DOMBreakpointsSidebarPane extends UI.Widget.VBox implements
250252
UI.ARIAUtils.setDescription(element, checkedStateText);
251253
}
252254

253-
this.#emptyElement.hideWidget();
255+
this.#emptyElement.classList.add('hidden');
254256
this.#list.element.classList.remove('hidden');
255257

256258
return element;
@@ -309,8 +311,8 @@ export class DOMBreakpointsSidebarPane extends UI.Widget.VBox implements
309311
}
310312
}
311313
if (this.#breakpoints.length === 0) {
312-
this.#emptyElement.showWidget();
313-
this.setDefaultFocusedElement(this.#emptyElement.element);
314+
this.#emptyElement.classList.remove('hidden');
315+
this.setDefaultFocusedElement(this.#emptyElement);
314316
this.#list.element.classList.add('hidden');
315317
} else if (lastIndex >= 0) {
316318
const breakpointToSelect = this.#breakpoints.at(lastIndex);

front_end/panels/browser_debugger/domBreakpointsSidebarPane.css

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,20 @@
3434
color: var(--sys-color-on-surface);
3535
}
3636

37+
.placeholder {
38+
display: flex;
39+
height: 100%;
40+
justify-content: center;
41+
}
42+
43+
:host-context(.sources.panel) .empty-view-scroller {
44+
display: none;
45+
}
46+
47+
:host-context(.elements.panel) .placeholder .gray-info-message {
48+
display: none;
49+
}
50+
3751
@media (forced-colors: active) {
3852
.breakpoint-entry:focus-visible,
3953
.breakpoint-list .breakpoint-entry:hover {

0 commit comments

Comments
 (0)