Skip to content
This repository was archived by the owner on Jan 11, 2023. It is now read-only.

Commit 4549bb8

Browse files
darkwingjasonLaster
authored andcommitted
[Breakpoints] Group Breakpoints (#5845)
1 parent 2d2e50a commit 4549bb8

File tree

6 files changed

+101
-54
lines changed

6 files changed

+101
-54
lines changed

src/components/SecondaryPanes/Breakpoints.css

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,32 @@
1010
user-select: none;
1111
}
1212

13+
.breakpoints-list .breakpoint-heading {
14+
text-overflow: ellipsis;
15+
overflow: hidden;
16+
}
17+
18+
.breakpoints-list .breakpoint-heading,
1319
.breakpoints-list .breakpoint {
1420
font-size: 12px;
1521
color: var(--theme-content-color1);
16-
padding: 0.5em 1em 0.5em 0.5em;
1722
line-height: 1em;
1823
position: relative;
1924
transition: all 0.25s ease;
25+
padding: 0.5em 1em 0.5em 0.5em;
2026
}
2127

22-
html[dir="rtl"] .breakpoints-list .breakpoint {
28+
.breakpoints-list .breakpoint {
29+
display: flex;
30+
}
31+
32+
html[dir="rtl"] .breakpoints-list .breakpoint,
33+
html[dir="rtl"] .breakpoints-list .breakpoint-heading {
2334
border-right: 4px solid transparent;
2435
}
2536

26-
html:not([dir="rtl"]) .breakpoints-list .breakpoint {
37+
html:not([dir="rtl"]) .breakpoints-list .breakpoint,
38+
html:not([dir="rtl"]) .breakpoints-list .breakpoint-heading {
2739
border-left: 4px solid transparent;
2840
}
2941

@@ -53,6 +65,27 @@ html .breakpoints-list .breakpoint.paused {
5365
background-color: var(--search-overlays-semitransparent);
5466
}
5567

68+
.breakpoints-list .breakpoint .breakpoint-line,
69+
.breakpoints-list .breakpoint-label {
70+
font-family: var(--monospace-font-family);
71+
}
72+
73+
.breakpoints-list .breakpoint .breakpoint-line {
74+
font-size: 11px;
75+
color: var(--theme-comment);
76+
padding-top: 3px;
77+
min-width: 14px;
78+
text-align: right;
79+
}
80+
81+
html[dir="rtl"] .breakpoints-list .breakpoint .breakpoint-line {
82+
text-align: left;
83+
}
84+
85+
.breakpoints-list .breakpoint:hover .breakpoint-line {
86+
display: none;
87+
}
88+
5689
.breakpoints-list .breakpoint.paused:hover {
5790
border-color: var(--breakpoint-active-color-hover);
5891
}
@@ -62,6 +95,10 @@ html .breakpoints-list .breakpoint.paused {
6295
display: inline-block;
6396
padding-inline-start: 2px;
6497
cursor: default;
98+
flex-grow: 1;
99+
text-overflow: ellipsis;
100+
overflow: hidden;
101+
padding-top: 3px;
65102
}
66103

67104
.breakpoint-label .breakpoint-checkbox {
@@ -88,6 +125,11 @@ html .breakpoints-list .breakpoint.paused {
88125
offset-inline-end: 13px;
89126
offset-inline-start: auto;
90127
top: 9px;
128+
display: none;
129+
}
130+
131+
.breakpoint:hover .close-btn {
132+
display: flex;
91133
}
92134

93135
.breakpoint .close {

src/components/SecondaryPanes/Breakpoints.js

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@ import { connect } from "react-redux";
99
import * as I from "immutable";
1010
import classnames from "classnames";
1111
import { createSelector } from "reselect";
12-
import { sortBy } from "lodash";
12+
import { groupBy, sortBy } from "lodash";
1313

1414
import actions from "../../actions";
1515
import CloseButton from "../shared/Button/Close";
16-
import { endTruncateStr } from "../../utils/utils";
1716
import { features } from "../../utils/prefs";
1817
import { getFilename } from "../../utils/source";
1918
import {
@@ -68,23 +67,14 @@ function getBreakpointFilename(source) {
6867
return source && source.toJS ? getFilename(source.toJS()) : "";
6968
}
7069

71-
function renderSourceLocation(source, line, column) {
72-
const filename = getBreakpointFilename(source);
70+
function getBreakpointLocation(source, line, column) {
7371
const isWasm = source && source.isWasm;
7472
const columnVal = features.columnBreakpoints && column ? `:${column}` : "";
7573
const bpLocation = isWasm
7674
? `0x${line.toString(16).toUpperCase()}`
7775
: `${line}${columnVal}`;
7876

79-
if (!filename) {
80-
return null;
81-
}
82-
83-
return (
84-
<div className="location">
85-
{`${endTruncateStr(filename, 30)}: ${bpLocation}`}
86-
</div>
87-
);
77+
return bpLocation;
8878
}
8979

9080
class Breakpoints extends Component<Props> {
@@ -149,32 +139,53 @@ class Breakpoints extends Component<Props> {
149139
onClick={ev => ev.stopPropagation()}
150140
/>
151141
<label className="breakpoint-label" title={breakpoint.text}>
152-
{renderSourceLocation(breakpoint.location.source, line, column)}
142+
{breakpoint.text}
153143
</label>
154-
<CloseButton
155-
handleClick={ev => this.removeBreakpoint(ev, breakpoint)}
156-
tooltip={L10N.getStr("breakpoints.removeBreakpointTooltip")}
157-
/>
144+
<div className="breakpoint-line-close">
145+
<div className="breakpoint-line">
146+
{getBreakpointLocation(breakpoint.location.source, line, column)}
147+
</div>
148+
<CloseButton
149+
handleClick={ev => this.removeBreakpoint(ev, breakpoint)}
150+
tooltip={L10N.getStr("breakpoints.removeBreakpointTooltip")}
151+
/>
152+
</div>
158153
</div>
159154
);
160155
}
161156

157+
renderEmpty() {
158+
return <div className="pane-info">{L10N.getStr("breakpoints.none")}</div>;
159+
}
160+
161+
renderBreakpoints() {
162+
const { breakpoints } = this.props;
163+
164+
const groupedBreakpoints = groupBy(
165+
sortBy([...breakpoints.valueSeq()], bp => bp.location.line),
166+
bp => getBreakpointFilename(bp.location.source)
167+
);
168+
169+
return [
170+
...Object.keys(groupedBreakpoints).map(filename => {
171+
return [
172+
<div className="breakpoint-heading" title={filename} key={filename}>
173+
{filename}
174+
</div>,
175+
...groupedBreakpoints[filename].map(bp => this.renderBreakpoint(bp))
176+
];
177+
})
178+
];
179+
}
180+
162181
render() {
163182
const { breakpoints } = this.props;
164-
const children =
165-
breakpoints.size === 0 ? (
166-
<div className="pane-info">{L10N.getStr("breakpoints.none")}</div>
167-
) : (
168-
sortBy(
169-
[...breakpoints.valueSeq()],
170-
[
171-
bp => getBreakpointFilename(bp.location.source),
172-
bp => bp.location.line
173-
]
174-
).map(bp => this.renderBreakpoint(bp))
175-
);
176-
177-
return <div className="pane breakpoints-list">{children}</div>;
183+
184+
return (
185+
<div className="pane breakpoints-list">
186+
{breakpoints.size ? this.renderBreakpoints() : this.renderEmpty()}
187+
</div>
188+
);
178189
}
179190
}
180191

src/test/mochitest/browser_dbg-breakpoints-toggle.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
function toggleBreakpoint(dbg, index) {
2-
const bp = findElement(dbg, "breakpointItem", index);
2+
const bp = findAllElements(dbg, "breakpointItems")[index];
33
const input = bp.querySelector("input");
44
input.click();
55
}
66

77
async function removeBreakpoint(dbg, index) {
88
const removed = waitForDispatch(dbg, "REMOVE_BREAKPOINT");
9-
const bp = findElement(dbg, "breakpointItem", index);
9+
const bp = findAllElements(dbg, "breakpointItems")[index];
1010
bp.querySelector(".close-btn").click();
1111
await removed;
1212
}
@@ -80,8 +80,8 @@ add_task(async function() {
8080
is(bp2.disabled, false, "second breakpoint is enabled");
8181

8282
// Remove the breakpoints
83-
await removeBreakpoint(dbg, 1);
84-
await removeBreakpoint(dbg, 1);
83+
await removeBreakpoint(dbg, 0);
84+
await removeBreakpoint(dbg, 0);
8585

8686
const bps = findBreakpoints(dbg);
8787

src/test/mochitest/browser_dbg-breakpoints.js

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,11 @@
22
* http://creativecommons.org/publicdomain/zero/1.0/ */
33

44
function toggleBreakpoint(dbg, index) {
5-
const bp = findElement(dbg, "breakpointItem", index);
5+
const bp = findAllElements(dbg, "breakpointItems")[index];
66
const input = bp.querySelector("input");
77
input.click();
88
}
99

10-
async function removeBreakpoint(dbg, index) {
11-
const removed = waitForDispatch(dbg, "REMOVE_BREAKPOINT");
12-
const bp = findElement(dbg, "breakpointItem", index);
13-
bp.querySelector(".close-btn").click();
14-
await removed;
15-
}
16-
1710
async function disableBreakpoint(dbg, index) {
1811
const disabled = waitForDispatch(dbg, "DISABLE_BREAKPOINT");
1912
toggleBreakpoint(dbg, index);
@@ -62,15 +55,15 @@ add_task(async function() {
6255
await addBreakpoint(dbg, "simple2", 5);
6356

6457
// Disable the first one
65-
await disableBreakpoint(dbg, 1);
58+
await disableBreakpoint(dbg, 0);
6659
let bp1 = findBreakpoint(dbg, "simple2", 3);
6760
let bp2 = findBreakpoint(dbg, "simple2", 5);
6861
is(bp1.disabled, true, "first breakpoint is disabled");
6962
is(bp2.disabled, false, "second breakpoint is enabled");
7063

7164
// Disable and Re-Enable the second one
72-
await disableBreakpoint(dbg, 2);
73-
await enableBreakpoint(dbg, 2);
65+
await disableBreakpoint(dbg, 1);
66+
await enableBreakpoint(dbg, 1);
7467
bp2 = findBreakpoint(dbg, "simple2", 5);
7568
is(bp2.disabled, false, "second breakpoint is enabled");
7669
});

src/test/mochitest/browser_dbg-browser-content-toolbox.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const {
1414
} = require("devtools/client/framework/devtools-browser");
1515

1616
function toggleBreakpoint(dbg, index) {
17-
const bp = findElement(dbg, "breakpointItem", index);
17+
const bp = findAllElements(dbg, "breakpointItems")[index];
1818
const input = bp.querySelector("input");
1919
input.click();
2020
}
@@ -57,12 +57,12 @@ add_task(async function() {
5757
await addBreakpoint(dbg, "simple2", 3);
5858

5959
info("Disable the breakpoint");
60-
await disableBreakpoint(dbg, 1);
60+
await disableBreakpoint(dbg, 0);
6161
let bp = findBreakpoint(dbg, "simple2", 3);
6262
is(bp.disabled, true, "breakpoint is disabled");
6363

6464
info("Enable the breakpoint");
65-
await enableBreakpoint(dbg, 1);
65+
await enableBreakpoint(dbg, 0);
6666
bp = findBreakpoint(dbg, "simple2", 3);
6767
is(bp.disabled, false, "breakpoint is enabled");
6868

src/test/mochitest/head.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -936,7 +936,8 @@ const selectors = {
936936
`.expressions-list .expression-container:nth-child(${i}) .close`,
937937
expressionNodes: ".expressions-list .tree-node",
938938
scopesHeader: ".scopes-pane ._header",
939-
breakpointItem: i => `.breakpoints-list .breakpoint:nth-child(${i})`,
939+
breakpointItem: i => `.breakpoints-list .breakpoint:nth-of-type(${i})`,
940+
breakpointItems: `.breakpoints-list .breakpoint`,
940941
scopes: ".scopes-list",
941942
scopeNode: i => `.scopes-list .tree-node:nth-child(${i}) .object-label`,
942943
scopeValue: i =>

0 commit comments

Comments
 (0)