Skip to content

Commit 92752ac

Browse files
danilsomsikovDevtools-frontend LUCI CQ
authored andcommitted
Expose checked and disabled properties on the CheckboxLabel and remove the usage of checkboxElement in the Elements panel
Bug: 410500405 Change-Id: I841cad2d6e3a086cc569ae07626a6447f6aae78c Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6450130 Reviewed-by: Kim-Anh Tran <[email protected]> Auto-Submit: Danil Somsikov <[email protected]> Commit-Queue: Kim-Anh Tran <[email protected]>
1 parent ca540d8 commit 92752ac

File tree

4 files changed

+54
-37
lines changed

4 files changed

+54
-37
lines changed

front_end/panels/accessibility/SourceOrderView.ts

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ export class SourceOrderPane extends AccessibilitySubPane {
4040
private readonly noNodeInfo: Element;
4141
private readonly warning: Element;
4242
private checked: boolean;
43-
private checkboxLabel: UI.UIUtils.CheckboxLabel;
44-
private checkboxElement: HTMLInputElement;
43+
private checkbox: UI.UIUtils.CheckboxLabel;
4544
private overlayModel: SDK.OverlayModel.OverlayModel|null;
4645
constructor() {
4746
super(i18nString(UIStrings.sourceOrderViewer));
@@ -51,24 +50,23 @@ export class SourceOrderPane extends AccessibilitySubPane {
5150
this.warning = this.createInfo(i18nString(UIStrings.thereMayBeADelayInDisplaying));
5251
this.warning.id = 'source-order-warning';
5352
this.checked = false;
54-
this.checkboxLabel = UI.UIUtils.CheckboxLabel.create(
53+
this.checkbox = UI.UIUtils.CheckboxLabel.create(
5554
/* title */ i18nString(UIStrings.showSourceOrder), /* checked */ false);
56-
this.checkboxElement = this.checkboxLabel.checkboxElement;
5755

58-
this.checkboxLabel.classList.add('source-order-checkbox');
59-
this.checkboxLabel.setAttribute('jslog', `${VisualLogging.toggle().track({click: true})}`);
60-
this.checkboxElement.addEventListener('click', this.checkboxClicked.bind(this), false);
61-
this.element.appendChild(this.checkboxLabel);
56+
this.checkbox.classList.add('source-order-checkbox');
57+
this.checkbox.setAttribute('jslog', `${VisualLogging.toggle().track({click: true})}`);
58+
this.checkbox.addEventListener('click', this.checkboxClicked.bind(this), false);
59+
this.element.appendChild(this.checkbox);
6260

6361
this.nodeInternal = null;
6462
this.overlayModel = null;
6563
}
6664

6765
async setNodeAsync(node: SDK.DOMModel.DOMNode|null): Promise<void> {
68-
if (!this.checkboxLabel.classList.contains('hidden')) {
69-
this.checked = this.checkboxElement.checked;
66+
if (!this.checkbox.classList.contains('hidden')) {
67+
this.checked = this.checkbox.checked;
7068
}
71-
this.checkboxElement.checked = false;
69+
this.checkbox.checked = false;
7270
this.checkboxClicked();
7371
super.setNode(node);
7472
if (!this.nodeInternal) {
@@ -88,10 +86,10 @@ export class SourceOrderPane extends AccessibilitySubPane {
8886

8987
this.noNodeInfo.classList.toggle('hidden', foundSourceOrder);
9088
this.warning.classList.toggle('hidden', childCount < MAX_CHILD_ELEMENTS_THRESHOLD);
91-
this.checkboxLabel.classList.toggle('hidden', !foundSourceOrder);
89+
this.checkbox.classList.toggle('hidden', !foundSourceOrder);
9290
if (foundSourceOrder) {
9391
this.overlayModel = this.nodeInternal.domModel().overlayModel();
94-
this.checkboxElement.checked = this.checked;
92+
this.checkbox.checked = this.checked;
9593
this.checkboxClicked();
9694
} else {
9795
this.overlayModel = null;
@@ -103,7 +101,7 @@ export class SourceOrderPane extends AccessibilitySubPane {
103101
return;
104102
}
105103

106-
if (this.checkboxElement.checked) {
104+
if (this.checkbox.checked) {
107105
Host.userMetrics.actionTaken(Host.UserMetrics.Action.SourceOrderViewActivated);
108106
this.overlayModel.highlightSourceOrderInOverlay(this.nodeInternal);
109107
} else {

front_end/panels/elements/ClassesPaneWidget.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,11 +180,11 @@ export class ClassesPaneWidget extends UI.Widget.Widget {
180180
const keys = [...classes.keys()];
181181
keys.sort(Platform.StringUtilities.caseInsensetiveComparator);
182182
for (const className of keys) {
183-
const label =
183+
const checkbox =
184184
UI.UIUtils.CheckboxLabel.createWithStringLiteral(className, classes.get(className), 'element-class', true);
185-
label.classList.add('monospace');
186-
label.checkboxElement.addEventListener('click', this.onClick.bind(this, className), false);
187-
this.classesContainer.appendChild(label);
185+
checkbox.classList.add('monospace');
186+
checkbox.addEventListener('click', this.onClick.bind(this, className), false);
187+
this.classesContainer.appendChild(checkbox);
188188
}
189189
}
190190

front_end/panels/elements/ElementStatePaneWidget.ts

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ enum SpecificPseudoStates {
6969
}
7070

7171
export class ElementStatePaneWidget extends UI.Widget.Widget {
72-
private readonly inputs: HTMLInputElement[];
73-
private readonly inputStates: WeakMap<HTMLInputElement, string>;
72+
private readonly inputs: UI.UIUtils.CheckboxLabel[];
73+
private readonly inputStates: WeakMap<UI.UIUtils.CheckboxLabel, string>;
7474
private readonly duals: Map<SpecificPseudoStates, SpecificPseudoStates>;
7575
private cssModel?: SDK.CSSModel.CSSModel|null;
7676
private specificPseudoStateDivs: Map<SpecificPseudoStates, HTMLDivElement>;
@@ -82,7 +82,7 @@ export class ElementStatePaneWidget extends UI.Widget.Widget {
8282
this.registerRequiredCSS(elementStatePaneWidgetStyles);
8383
this.contentElement.className = 'styles-element-state-pane';
8484
this.contentElement.setAttribute('jslog', `${VisualLogging.pane('element-states')}`);
85-
const inputs: HTMLInputElement[] = [];
85+
const inputs: UI.UIUtils.CheckboxLabel[] = [];
8686
this.inputs = inputs;
8787
this.inputStates = new WeakMap();
8888
this.duals = new Map();
@@ -95,7 +95,7 @@ export class ElementStatePaneWidget extends UI.Widget.Widget {
9595
};
9696
const clickListener = (event: MouseEvent): void => {
9797
const node = UI.Context.Context.instance().flavor(SDK.DOMModel.DOMNode);
98-
if (!node || !(event.target instanceof HTMLInputElement)) {
98+
if (!node || !(event.target instanceof UI.UIUtils.CheckboxLabel)) {
9999
return;
100100
}
101101
const state = this.inputStates.get(event.target);
@@ -112,13 +112,11 @@ export class ElementStatePaneWidget extends UI.Widget.Widget {
112112
const createElementStateCheckbox = (state: string): HTMLDivElement => {
113113
const div = document.createElement('div');
114114
div.id = state;
115-
const label = UI.UIUtils.CheckboxLabel.createWithStringLiteral(':' + state, undefined, undefined, true);
116-
const input = label.checkboxElement;
117-
this.inputStates.set(input, state);
118-
input.addEventListener('click', (clickListener as EventListener), false);
119-
input.setAttribute('jslog', `${VisualLogging.toggle().track({change: true}).context(state)}`);
120-
inputs.push(input);
121-
div.appendChild(label);
115+
const checkbox = UI.UIUtils.CheckboxLabel.createWithStringLiteral(':' + state, undefined, state, true);
116+
this.inputStates.set(checkbox, state);
117+
checkbox.addEventListener('click', (clickListener as EventListener), false);
118+
inputs.push(checkbox);
119+
div.appendChild(checkbox);
122120
return div;
123121
};
124122
const setDualStateCheckboxes = (first: SpecificPseudoStates, second: SpecificPseudoStates): void => {
@@ -128,14 +126,13 @@ export class ElementStatePaneWidget extends UI.Widget.Widget {
128126
const createEmulateFocusedPageCheckbox = (): Element => {
129127
const div = document.createElement('div');
130128
div.classList.add('page-state-checkbox');
131-
const label = UI.UIUtils.CheckboxLabel.create(
129+
const checkbox = UI.UIUtils.CheckboxLabel.create(
132130
i18nString(UIStrings.emulateFocusedPage), undefined, undefined, 'emulate-page-focus', true);
133-
UI.SettingsUI.bindCheckbox(
134-
label.checkboxElement, Common.Settings.Settings.instance().moduleSetting('emulate-page-focus'), {
135-
enable: Host.UserMetrics.Action.ToggleEmulateFocusedPageFromStylesPaneOn,
136-
disable: Host.UserMetrics.Action.ToggleEmulateFocusedPageFromStylesPaneOff,
137-
});
138-
UI.Tooltip.Tooltip.install(label, i18nString(UIStrings.emulatesAFocusedPage));
131+
UI.SettingsUI.bindCheckbox(checkbox, Common.Settings.Settings.instance().moduleSetting('emulate-page-focus'), {
132+
enable: Host.UserMetrics.Action.ToggleEmulateFocusedPageFromStylesPaneOn,
133+
disable: Host.UserMetrics.Action.ToggleEmulateFocusedPageFromStylesPaneOff,
134+
});
135+
UI.Tooltip.Tooltip.install(checkbox, i18nString(UIStrings.emulatesAFocusedPage));
139136

140137
const learnMoreButton = new Buttons.Button.Button();
141138
learnMoreButton.data = {
@@ -150,7 +147,7 @@ export class ElementStatePaneWidget extends UI.Widget.Widget {
150147
() => UI.UIUtils.openInNewTab(
151148
'https://developer.chrome.com/docs/devtools/rendering/apply-effects#emulate_a_focused_page'));
152149

153-
div.appendChild(label);
150+
div.appendChild(checkbox);
154151
div.appendChild(learnMoreButton);
155152
return div;
156153
};

front_end/ui/legacy/UIUtils.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,8 +1317,14 @@ export class CheckboxLabel extends HTMLElement {
13171317
this.checkboxElement = this.#shadowRoot.createChild('input');
13181318
this.checkboxElement.type = 'checkbox';
13191319
this.checkboxElement.setAttribute('id', id);
1320+
// Change event is not composable, so it doesn't bubble up through the shadow root.
1321+
this.checkboxElement.addEventListener('change', () => this.dispatchEvent(new Event('change')));
13201322
this.#textElement = this.#shadowRoot.createChild('label', 'dt-checkbox-text');
13211323
this.#textElement.setAttribute('for', id);
1324+
// Click events are composable, so both label and checkbox bubble up through the shadow root.
1325+
// However, clicking the label, also triggers the checkbox click, so we stop the label event
1326+
// propagation here to avoid duplicate events.
1327+
this.#textElement.addEventListener('click', e => e.stopPropagation());
13221328
this.#shadowRoot.createChild('slot');
13231329
}
13241330

@@ -1342,6 +1348,22 @@ export class CheckboxLabel extends HTMLElement {
13421348
return element;
13431349
}
13441350

1351+
get checked(): boolean {
1352+
return this.checkboxElement.checked;
1353+
}
1354+
1355+
set checked(checked: boolean) {
1356+
this.checkboxElement.checked = checked;
1357+
}
1358+
1359+
set disabled(disabled: boolean) {
1360+
this.checkboxElement.disabled = disabled;
1361+
}
1362+
1363+
get disabled(): boolean {
1364+
return this.checkboxElement.disabled;
1365+
}
1366+
13451367
/** Only to be used when the checkbox label is 'generated' (a regex, a className, etc). Most checkboxes should be create()'d with UIStrings */
13461368
static createWithStringLiteral(title?: string, checked?: boolean, jslogContext?: string, small?: boolean):
13471369
CheckboxLabel {

0 commit comments

Comments
 (0)