Skip to content

Commit 49c32cb

Browse files
masnobleDevtools-frontend LUCI CQ
authored andcommitted
Allow NamedBitSetFilterUI instantiation from lit-html template
Similar to the split widget changes: https://crrev.com/c/5898679 Bug: 301364727 Change-Id: I68e8972170333d7fdb731fe22676f0996b58e024 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/5979110 Reviewed-by: Philip Pfaffe <[email protected]> Commit-Queue: Joshua Thomas <[email protected]> Reviewed-by: Shuran Huang <[email protected]>
1 parent c31402c commit 49c32cb

File tree

3 files changed

+98
-0
lines changed

3 files changed

+98
-0
lines changed

front_end/ui/legacy/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ ts_library("unittests") {
196196
"Context.test.ts",
197197
"ContextMenu.test.ts",
198198
"DockController.test.ts",
199+
"FilterBar.test.ts",
199200
"Fragment.test.ts",
200201
"Geometry.test.ts",
201202
"Infobar.test.ts",
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// Copyright 2024 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 {renderElementIntoDOM} from '../../testing/DOMHelpers.js';
6+
import {describeWithEnvironment} from '../../testing/EnvironmentHelpers.js';
7+
import * as LitHtml from '../../ui/lit-html/lit-html.js';
8+
9+
import * as UI from './legacy.js';
10+
11+
const {render, html} = LitHtml;
12+
13+
describeWithEnvironment('NamedBitSetFilterUI', () => {
14+
it('is functional from template', async () => {
15+
const container = document.createElement('div');
16+
renderElementIntoDOM(container);
17+
18+
let namedBitSetFilterUI!: UI.FilterBar.NamedBitSetFilterUI;
19+
20+
const filterItems: UI.FilterBar.Item[] = [
21+
{
22+
name: 'filter',
23+
label: () => 'filter',
24+
title: 'filter',
25+
jslogContext: 'filter',
26+
},
27+
];
28+
29+
// clang-format off
30+
render(
31+
html`
32+
<devtools-named-bit-set-filter
33+
.options=${{items: filterItems}}
34+
${LitHtml.Directives.ref((el: Element|undefined) => {
35+
if(!el || !(el instanceof UI.FilterBar.NamedBitSetFilterUIElement)){
36+
return;
37+
}
38+
namedBitSetFilterUI = el.getOrCreateNamedBitSetFilterUI();
39+
})}
40+
></devtools-named-bit-set-filter>
41+
`,
42+
container, {host: this});
43+
// clang-format on
44+
45+
assert.isTrue(namedBitSetFilterUI.accept('test'));
46+
47+
const filter = namedBitSetFilterUI.element().querySelector('.filter') as HTMLElement;
48+
filter.click();
49+
50+
assert.isFalse(namedBitSetFilterUI.accept('test'));
51+
});
52+
});

front_end/ui/legacy/FilterBar.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import filterStyles from './filter.css.legacy.js';
3939
import {KeyboardShortcut, Modifiers} from './KeyboardShortcut.js';
4040
import {bindCheckbox} from './SettingsUI.js';
4141
import type {Suggestions} from './SuggestBox.js';
42+
import * as ThemeSupport from './theme_support/theme_support.js';
4243
import {Toolbar, type ToolbarButton, ToolbarFilter, ToolbarInput, ToolbarSettingToggle} from './Toolbar.js';
4344
import {Tooltip} from './Tooltip.js';
4445
import {CheckboxLabel, createTextChild} from './UIUtils.js';
@@ -267,6 +268,50 @@ export class TextFilterUI extends Common.ObjectWrapper.ObjectWrapper<FilterUIEve
267268
}
268269
}
269270

271+
interface NamedBitSetFilterUIOptions {
272+
items: Item[];
273+
setting?: Common.Settings.Setting<{[key: string]: boolean}>;
274+
}
275+
export class NamedBitSetFilterUIElement extends HTMLElement {
276+
#options: NamedBitSetFilterUIOptions = {items: []};
277+
readonly #shadow = this.attachShadow({mode: 'open'});
278+
#namedBitSetFilterUI?: NamedBitSetFilterUI;
279+
280+
set options(options: NamedBitSetFilterUIOptions) {
281+
this.#options = options;
282+
}
283+
284+
getOrCreateNamedBitSetFilterUI(): NamedBitSetFilterUI {
285+
if (this.#namedBitSetFilterUI) {
286+
return this.#namedBitSetFilterUI;
287+
}
288+
289+
const namedBitSetFilterUI = new NamedBitSetFilterUI(this.#options.items, this.#options.setting);
290+
namedBitSetFilterUI.element().classList.add('named-bitset-filter');
291+
292+
const disclosureElement = this.#shadow.createChild('div', 'named-bit-set-filter-disclosure');
293+
disclosureElement.appendChild(namedBitSetFilterUI.element());
294+
295+
// Translate existing filter ("ObjectWrapper") events to DOM CustomEvents so clients can
296+
// use lit templates to bind listeners.
297+
namedBitSetFilterUI.addEventListener(FilterUIEvents.FILTER_CHANGED, this.#filterChanged.bind(this));
298+
299+
this.#namedBitSetFilterUI = namedBitSetFilterUI;
300+
return this.#namedBitSetFilterUI;
301+
}
302+
303+
connectedCallback(): void {
304+
ThemeSupport.ThemeSupport.instance().appendStyle(this.#shadow, filterStyles);
305+
}
306+
307+
#filterChanged(): void {
308+
const domEvent = new CustomEvent('filterChanged');
309+
this.dispatchEvent(domEvent);
310+
}
311+
}
312+
313+
customElements.define('devtools-named-bit-set-filter', NamedBitSetFilterUIElement);
314+
270315
export class NamedBitSetFilterUI extends Common.ObjectWrapper.ObjectWrapper<FilterUIEventTypes> implements FilterUI {
271316
private readonly filtersElement: HTMLDivElement;
272317
private readonly typeFilterElementTypeNames: WeakMap<HTMLElement, string>;

0 commit comments

Comments
 (0)