Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 1 | // Copyright 2018 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 | |
Tim van der Lippe | 7696157 | 2021-04-06 10:48:07 | [diff] [blame] | 5 | import * as Common from '../../core/common/common.js'; |
Tim van der Lippe | bb352e6 | 2021-04-01 17:57:28 | [diff] [blame] | 6 | import * as i18n from '../../core/i18n/i18n.js'; |
Tim van der Lippe | aa61faf | 2021-04-07 15:32:07 | [diff] [blame] | 7 | import * as UI from '../../ui/legacy/legacy.js'; |
Paul Lewis | daac106 | 2020-03-05 14:37:10 | [diff] [blame] | 8 | |
Tim van der Lippe | 5f62c6f | 2021-02-25 16:39:26 | [diff] [blame] | 9 | import type * as ReportRenderer from './LighthouseReporterTypes.js'; |
Tim van der Lippe | 1e10f85 | 2020-10-30 14:35:01 | [diff] [blame] | 10 | |
Simon Zünd | 6f95e84 | 2021-03-01 07:41:55 | [diff] [blame] | 11 | const UIStrings = { |
vidorteg | 0684002 | 2020-11-21 05:18:03 | [diff] [blame] | 12 | /** |
Jack Franklin | fd72c07 | 2022-12-21 11:45:01 | [diff] [blame] | 13 | *@description Title of combo box in audits report selector |
| 14 | */ |
vidorteg | 0684002 | 2020-11-21 05:18:03 | [diff] [blame] | 15 | reports: 'Reports', |
| 16 | /** |
Jack Franklin | fd72c07 | 2022-12-21 11:45:01 | [diff] [blame] | 17 | *@description New report item label in Lighthouse Report Selector |
| 18 | */ |
vidorteg | 0684002 | 2020-11-21 05:18:03 | [diff] [blame] | 19 | newReport: '(new report)', |
Ergun Erdogmus | 5efc7e9 | 2025-02-21 11:36:50 | [diff] [blame] | 20 | } as const; |
Tim van der Lippe | 7a077eb | 2021-03-23 18:02:11 | [diff] [blame] | 21 | const str_ = i18n.i18n.registerUIStrings('panels/lighthouse/LighthouseReportSelector.ts', UIStrings); |
vidorteg | 0684002 | 2020-11-21 05:18:03 | [diff] [blame] | 22 | const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_); |
Paul Lewis | 5147419 | 2020-01-09 16:02:22 | [diff] [blame] | 23 | export class ReportSelector { |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 24 | private readonly renderNewLighthouseView: () => void; |
| 25 | private newLighthouseItem: HTMLOptionElement; |
| 26 | private readonly comboBoxInternal: UI.Toolbar.ToolbarComboBox; |
| 27 | private readonly itemByOptionElement: Map<Element, Item>; |
Jan Scheffler | c5a400f | 2021-01-22 16:41:47 | [diff] [blame] | 28 | |
| 29 | constructor(renderNewLighthouseView: () => void) { |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 30 | this.renderNewLighthouseView = renderNewLighthouseView; |
| 31 | this.newLighthouseItem = document.createElement('option'); |
| 32 | this.comboBoxInternal = new UI.Toolbar.ToolbarComboBox( |
| 33 | this.handleChange.bind(this), i18nString(UIStrings.reports), 'lighthouse-report'); |
| 34 | this.comboBoxInternal.setMaxWidth(180); |
| 35 | this.comboBoxInternal.setMinWidth(140); |
| 36 | this.itemByOptionElement = new Map(); |
| 37 | this.setEmptyState(); |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 38 | } |
| 39 | |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 40 | private setEmptyState(): void { |
Benedikt Meurer | 56e8db4 | 2025-01-17 13:27:54 | [diff] [blame] | 41 | this.comboBoxInternal.removeOptions(); |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 42 | |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 43 | this.comboBoxInternal.setEnabled(false); |
| 44 | this.newLighthouseItem = document.createElement('option'); |
| 45 | this.newLighthouseItem.label = i18nString(UIStrings.newReport); |
Benedikt Meurer | 56e8db4 | 2025-01-17 13:27:54 | [diff] [blame] | 46 | this.comboBoxInternal.addOption(this.newLighthouseItem); |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 47 | this.comboBoxInternal.select(this.newLighthouseItem); |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 48 | } |
| 49 | |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 50 | private handleChange(_event: Event): void { |
| 51 | const item = this.selectedItem(); |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 52 | if (item) { |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 53 | item.select(); |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 54 | } else { |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 55 | this.renderNewLighthouseView(); |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 56 | } |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 57 | } |
| 58 | |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 59 | private selectedItem(): Item { |
| 60 | const option = this.comboBoxInternal.selectedOption(); |
| 61 | return this.itemByOptionElement.get(option as Element) as Item; |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 62 | } |
| 63 | |
Jan Scheffler | c5a400f | 2021-01-22 16:41:47 | [diff] [blame] | 64 | hasItems(): boolean { |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 65 | return this.itemByOptionElement.size > 0; |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 66 | } |
| 67 | |
Jan Scheffler | c5a400f | 2021-01-22 16:41:47 | [diff] [blame] | 68 | comboBox(): UI.Toolbar.ToolbarComboBox { |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 69 | return this.comboBoxInternal; |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 70 | } |
| 71 | |
Jan Scheffler | c5a400f | 2021-01-22 16:41:47 | [diff] [blame] | 72 | prepend(item: Item): void { |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 73 | const optionEl = item.optionElement(); |
Benedikt Meurer | 56e8db4 | 2025-01-17 13:27:54 | [diff] [blame] | 74 | const selectEl = this.comboBoxInternal.element; |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 75 | |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 76 | this.itemByOptionElement.set(optionEl, item); |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 77 | selectEl.insertBefore(optionEl, selectEl.firstElementChild); |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 78 | this.comboBoxInternal.setEnabled(true); |
| 79 | this.comboBoxInternal.select(optionEl); |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 80 | item.select(); |
| 81 | } |
| 82 | |
Jan Scheffler | c5a400f | 2021-01-22 16:41:47 | [diff] [blame] | 83 | clearAll(): void { |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 84 | for (const elem of this.comboBoxInternal.options()) { |
| 85 | if (elem === this.newLighthouseItem) { |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 86 | continue; |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 87 | } |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 88 | |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 89 | this.itemByOptionElement.get(elem)?.delete(); |
| 90 | this.itemByOptionElement.delete(elem); |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 91 | } |
| 92 | |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 93 | this.setEmptyState(); |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 94 | } |
| 95 | |
Jan Scheffler | c5a400f | 2021-01-22 16:41:47 | [diff] [blame] | 96 | selectNewReport(): void { |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 97 | this.comboBoxInternal.select(this.newLighthouseItem); |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 98 | } |
Paul Lewis | cf2ef22 | 2019-11-22 14:55:35 | [diff] [blame] | 99 | } |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 100 | |
Paul Lewis | cf2ef22 | 2019-11-22 14:55:35 | [diff] [blame] | 101 | export class Item { |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 102 | private readonly renderReport: () => void; |
| 103 | private readonly showLandingCallback: () => void; |
| 104 | private readonly element: HTMLOptionElement; |
Jan Scheffler | c5a400f | 2021-01-22 16:41:47 | [diff] [blame] | 105 | |
| 106 | constructor(lighthouseResult: ReportRenderer.ReportJSON, renderReport: () => void, showLandingCallback: () => void) { |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 107 | this.renderReport = renderReport; |
| 108 | this.showLandingCallback = showLandingCallback; |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 109 | |
Adam Raine | 393209c | 2022-09-21 23:38:50 | [diff] [blame] | 110 | // In Lighthouse 10.0, `finalUrl` is not provided on snapshot or timespan reports. |
| 111 | // `finalDisplayedUrl` is the new preferred URL to use for cosmetic identification. |
| 112 | // TODO: Remove the `finalUrl` backport once Lighthouse 10.0 is rolled into DevTools. |
| 113 | const finalDisplayedUrl = lighthouseResult.finalDisplayedUrl || lighthouseResult.finalUrl || ''; |
| 114 | |
| 115 | const url = new Common.ParsedURL.ParsedURL(finalDisplayedUrl); |
Paul Irish | 8f1e33d | 2018-05-31 02:29:50 | [diff] [blame] | 116 | const timestamp = lighthouseResult.fetchTime; |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 117 | this.element = document.createElement('option'); |
| 118 | this.element.label = `${new Date(timestamp).toLocaleTimeString()} - ${url.domain()}`; |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 119 | } |
| 120 | |
Jan Scheffler | c5a400f | 2021-01-22 16:41:47 | [diff] [blame] | 121 | select(): void { |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 122 | this.renderReport(); |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 123 | } |
| 124 | |
Jan Scheffler | c5a400f | 2021-01-22 16:41:47 | [diff] [blame] | 125 | optionElement(): Element { |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 126 | return this.element; |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 127 | } |
| 128 | |
Jan Scheffler | c5a400f | 2021-01-22 16:41:47 | [diff] [blame] | 129 | delete(): void { |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 130 | if (this.element) { |
| 131 | this.element.remove(); |
Tim van der Lippe | 1d6e57a | 2019-09-30 11:55:34 | [diff] [blame] | 132 | } |
Jan Scheffler | 9d4136d | 2021-08-10 10:55:04 | [diff] [blame] | 133 | this.showLandingCallback(); |
Patrick Hulce | a087f62 | 2018-05-18 00:37:53 | [diff] [blame] | 134 | } |
Paul Lewis | cf2ef22 | 2019-11-22 14:55:35 | [diff] [blame] | 135 | } |