chrome-devtools-frontend 1.0.995629 → 1.0.996044

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/front_end/core/i18n/locales/af.json +96 -42
  2. package/front_end/core/i18n/locales/am.json +97 -43
  3. package/front_end/core/i18n/locales/ar.json +95 -41
  4. package/front_end/core/i18n/locales/as.json +95 -41
  5. package/front_end/core/i18n/locales/az.json +96 -42
  6. package/front_end/core/i18n/locales/be.json +124 -70
  7. package/front_end/core/i18n/locales/bg.json +96 -42
  8. package/front_end/core/i18n/locales/bn.json +95 -41
  9. package/front_end/core/i18n/locales/bs.json +95 -41
  10. package/front_end/core/i18n/locales/ca.json +96 -42
  11. package/front_end/core/i18n/locales/cs.json +95 -41
  12. package/front_end/core/i18n/locales/cy.json +95 -41
  13. package/front_end/core/i18n/locales/da.json +97 -43
  14. package/front_end/core/i18n/locales/de.json +96 -42
  15. package/front_end/core/i18n/locales/el.json +95 -41
  16. package/front_end/core/i18n/locales/en-GB.json +95 -41
  17. package/front_end/core/i18n/locales/en-US.json +23 -5
  18. package/front_end/core/i18n/locales/en-XL.json +23 -5
  19. package/front_end/core/i18n/locales/es-419.json +95 -41
  20. package/front_end/core/i18n/locales/es.json +101 -47
  21. package/front_end/core/i18n/locales/et.json +95 -41
  22. package/front_end/core/i18n/locales/eu.json +100 -46
  23. package/front_end/core/i18n/locales/fa.json +104 -50
  24. package/front_end/core/i18n/locales/fi.json +95 -41
  25. package/front_end/core/i18n/locales/fil.json +95 -41
  26. package/front_end/core/i18n/locales/fr-CA.json +96 -42
  27. package/front_end/core/i18n/locales/fr.json +95 -41
  28. package/front_end/core/i18n/locales/gl.json +104 -50
  29. package/front_end/core/i18n/locales/gu.json +95 -41
  30. package/front_end/core/i18n/locales/he.json +95 -41
  31. package/front_end/core/i18n/locales/hi.json +98 -44
  32. package/front_end/core/i18n/locales/hr.json +96 -42
  33. package/front_end/core/i18n/locales/hu.json +96 -42
  34. package/front_end/core/i18n/locales/hy.json +95 -41
  35. package/front_end/core/i18n/locales/id.json +97 -43
  36. package/front_end/core/i18n/locales/is.json +95 -41
  37. package/front_end/core/i18n/locales/it.json +96 -42
  38. package/front_end/core/i18n/locales/ja.json +95 -41
  39. package/front_end/core/i18n/locales/ka.json +95 -41
  40. package/front_end/core/i18n/locales/kk.json +98 -44
  41. package/front_end/core/i18n/locales/km.json +95 -41
  42. package/front_end/core/i18n/locales/kn.json +96 -42
  43. package/front_end/core/i18n/locales/ko.json +96 -42
  44. package/front_end/core/i18n/locales/ky.json +97 -43
  45. package/front_end/core/i18n/locales/lo.json +96 -42
  46. package/front_end/core/i18n/locales/lt.json +95 -41
  47. package/front_end/core/i18n/locales/lv.json +95 -41
  48. package/front_end/core/i18n/locales/mk.json +98 -44
  49. package/front_end/core/i18n/locales/ml.json +96 -42
  50. package/front_end/core/i18n/locales/mn.json +96 -42
  51. package/front_end/core/i18n/locales/mr.json +95 -41
  52. package/front_end/core/i18n/locales/ms.json +95 -41
  53. package/front_end/core/i18n/locales/my.json +95 -41
  54. package/front_end/core/i18n/locales/ne.json +100 -46
  55. package/front_end/core/i18n/locales/nl.json +99 -45
  56. package/front_end/core/i18n/locales/no.json +95 -41
  57. package/front_end/core/i18n/locales/or.json +98 -44
  58. package/front_end/core/i18n/locales/pa.json +95 -41
  59. package/front_end/core/i18n/locales/pl.json +95 -41
  60. package/front_end/core/i18n/locales/pt-PT.json +95 -41
  61. package/front_end/core/i18n/locales/pt.json +98 -44
  62. package/front_end/core/i18n/locales/ro.json +96 -42
  63. package/front_end/core/i18n/locales/ru.json +115 -61
  64. package/front_end/core/i18n/locales/si.json +96 -42
  65. package/front_end/core/i18n/locales/sk.json +95 -41
  66. package/front_end/core/i18n/locales/sl.json +95 -41
  67. package/front_end/core/i18n/locales/sq.json +96 -42
  68. package/front_end/core/i18n/locales/sr-Latn.json +96 -42
  69. package/front_end/core/i18n/locales/sr.json +96 -42
  70. package/front_end/core/i18n/locales/sv.json +96 -42
  71. package/front_end/core/i18n/locales/sw.json +97 -43
  72. package/front_end/core/i18n/locales/ta.json +96 -42
  73. package/front_end/core/i18n/locales/te.json +108 -54
  74. package/front_end/core/i18n/locales/th.json +95 -41
  75. package/front_end/core/i18n/locales/tr.json +95 -41
  76. package/front_end/core/i18n/locales/uk.json +95 -41
  77. package/front_end/core/i18n/locales/ur.json +95 -41
  78. package/front_end/core/i18n/locales/uz.json +95 -41
  79. package/front_end/core/i18n/locales/vi.json +104 -50
  80. package/front_end/core/i18n/locales/zh-HK.json +96 -42
  81. package/front_end/core/i18n/locales/zh-TW.json +97 -43
  82. package/front_end/core/i18n/locales/zh.json +99 -45
  83. package/front_end/core/i18n/locales/zu.json +95 -41
  84. package/front_end/models/issues_manager/DeprecationIssue.ts +1 -1
  85. package/front_end/panels/lighthouse/LighthouseController.ts +38 -7
  86. package/front_end/panels/lighthouse/LighthousePanel.ts +1 -1
  87. package/front_end/panels/lighthouse/LighthouseStartView.ts +15 -7
  88. package/front_end/panels/lighthouse/LighthouseStartViewFR.ts +77 -21
  89. package/front_end/panels/lighthouse/RadioSetting.ts +12 -6
  90. package/front_end/panels/lighthouse/lighthouseStartView.css +49 -2
  91. package/front_end/panels/security/SecurityPanel.ts +2 -2
  92. package/package.json +2 -1
@@ -1352,6 +1352,12 @@
1352
1352
  "models/issues_manager/CrossOriginEmbedderPolicyIssue.ts | samesiteAndSameorigin": {
1353
1353
  "message": "Indawo efanayo kanye Nomthombo ofanayo"
1354
1354
  },
1355
+ "models/issues_manager/DeprecationIssue.ts | deprecationExample": {
1356
+ "message": "Lesi yisibonelo somlayezo ohunyushiwe wenkinga yokuhoxisa."
1357
+ },
1358
+ "models/issues_manager/DeprecationIssue.ts | title": {
1359
+ "message": "Isici Esihoxisiwe Esisetshenzisiwe"
1360
+ },
1355
1361
  "models/issues_manager/FederatedAuthRequestIssue.ts | fedCm": {
1356
1362
  "message": "I-Federated Credential Management API"
1357
1363
  },
@@ -3032,6 +3038,12 @@
3032
3038
  "panels/application/components/BackForwardCacheStrings.ts | enteredBackForwardCacheBeforeServiceWorkerHostAdded": {
3033
3039
  "message": "Isisebenzi sesevisi senziwe sasebenza ngenkathi ikhasi likwinqolobane yasemuva/phambili."
3034
3040
  },
3041
+ "panels/application/components/BackForwardCacheStrings.ts | errorDocument": {
3042
+ "message": "Inqolobane yasemuva/phambili ivaliwe ngenxa yephutha ledokhumenti."
3043
+ },
3044
+ "panels/application/components/BackForwardCacheStrings.ts | fencedFramesEmbedder": {
3045
+ "message": "Amakhasi asebenzisa i-FencedFrames awakwazi ukugcinwa ku-bfcache."
3046
+ },
3035
3047
  "panels/application/components/BackForwardCacheStrings.ts | foregroundCacheLimit": {
3036
3048
  "message": "Ikhasi likhishiwe kunqolobane ukuze kuvunyelwe elinye ikhasi ukuthi libe kwinqolobane."
3037
3049
  },
@@ -3245,6 +3257,15 @@
3245
3257
  "panels/application/components/BackForwardCacheView.ts | circumstantialExplanation": {
3246
3258
  "message": "Lezi zizathu azikwazi ukusebenza okungukuthi ukugcinwa enqolobaneni kwesikhashana kuvinjwe okuthile okungaphandle kokulawula okuqondile kwekhasi."
3247
3259
  },
3260
+ "panels/application/components/BackForwardCacheView.ts | framesPerIssue": {
3261
+ "message": "{n,plural, =1{Uhlaka olu-#}one{Izinhlaka ezingu-#}other{Izinhlaka ezingu-#}}"
3262
+ },
3263
+ "panels/application/components/BackForwardCacheView.ts | framesTitle": {
3264
+ "message": "Izinhlaka"
3265
+ },
3266
+ "panels/application/components/BackForwardCacheView.ts | issuesInFrames": {
3267
+ "message": "{x,plural, =1{inkinga #}one{izinkinga #}other{izinkinga #}} zitholwe ku-{y,plural, =1{uhlaka #}one{izinhlaka #}other{izinhlaka #}}."
3268
+ },
3248
3269
  "panels/application/components/BackForwardCacheView.ts | learnMore": {
3249
3270
  "message": "Funda kabanzi: ukufaneleka kwenqolobane yokuya emuva/phambili"
3250
3271
  },
@@ -3677,6 +3698,12 @@
3677
3698
  "panels/changes/ChangesView.ts | binaryData": {
3678
3699
  "message": "Idatha yenambambili"
3679
3700
  },
3701
+ "panels/changes/ChangesView.ts | copy": {
3702
+ "message": "Kopisha"
3703
+ },
3704
+ "panels/changes/ChangesView.ts | copyAllChangesFromCurrentFile": {
3705
+ "message": "Kopisha zonke izinguquko kwifayela lamanje"
3706
+ },
3680
3707
  "panels/changes/ChangesView.ts | noChanges": {
3681
3708
  "message": "Azikho izinguquko"
3682
3709
  },
@@ -3755,6 +3782,9 @@
3755
3782
  "panels/console/ConsoleView.ts | allLevels": {
3756
3783
  "message": "Wonke amaleveli"
3757
3784
  },
3785
+ "panels/console/ConsoleView.ts | autocompleteFromHistory": {
3786
+ "message": "Qedela ngokuzenzakalela kusukela kumlando"
3787
+ },
3758
3788
  "panels/console/ConsoleView.ts | consoleCleared": {
3759
3789
  "message": "I-console isuliwe"
3760
3790
  },
@@ -3836,6 +3866,9 @@
3836
3866
  "panels/console/ConsoleView.ts | logLevels": {
3837
3867
  "message": "Amaleveli elogu"
3838
3868
  },
3869
+ "panels/console/ConsoleView.ts | logXMLHttpRequests": {
3870
+ "message": "Ilogu ye-XMLHttpRequests"
3871
+ },
3839
3872
  "panels/console/ConsoleView.ts | onlyShowMessagesFromTheCurrentContext": {
3840
3873
  "message": "Bonisa kuphela imilayezo evela kungqikithi yamanje (top, iframe, worker, isandiso)"
3841
3874
  },
@@ -3869,6 +3902,9 @@
3869
3902
  "panels/console/ConsoleView.ts | showCorsErrorsInConsole": {
3870
3903
  "message": "Bonisa amaphutha e-CORS ku-console"
3871
3904
  },
3905
+ "panels/console/ConsoleView.ts | treatEvaluationAsUserActivation": {
3906
+ "message": "Thatha ukuhlolwa njengokwenziwe kwasebenza umsebenzisi"
3907
+ },
3872
3908
  "panels/console/ConsoleView.ts | verbose": {
3873
3909
  "message": "I-Verbose"
3874
3910
  },
@@ -4667,6 +4703,48 @@
4667
4703
  "panels/elements/PropertiesWidget.ts | showAllTooltip": {
4668
4704
  "message": "Uma kususwe ukumaka, izakhiwo kuphela inani lazo okuyiqada noma ezingachaziwe ezizoboniswa"
4669
4705
  },
4706
+ "panels/elements/StylePropertiesSection.ts | constructedStylesheet": {
4707
+ "message": "i-stylesheet eyakhiwe"
4708
+ },
4709
+ "panels/elements/StylePropertiesSection.ts | copyAllCSSChanges": {
4710
+ "message": "Kopisha zonke izinguquko ze-CSS"
4711
+ },
4712
+ "panels/elements/StylePropertiesSection.ts | copyAllDeclarations": {
4713
+ "message": "Kopisha zonke izimemezelo"
4714
+ },
4715
+ "panels/elements/StylePropertiesSection.ts | copyRule": {
4716
+ "message": "Kopisha umthetho"
4717
+ },
4718
+ "panels/elements/StylePropertiesSection.ts | copySelector": {
4719
+ "message": "Kopisha selector"
4720
+ },
4721
+ "panels/elements/StylePropertiesSection.ts | cssSelector": {
4722
+ "message": "Isikhethi se-CSS"
4723
+ },
4724
+ "panels/elements/StylePropertiesSection.ts | injectedStylesheet": {
4725
+ "message": "ijove isitayela seshidi"
4726
+ },
4727
+ "panels/elements/StylePropertiesSection.ts | insertStyleRuleBelow": {
4728
+ "message": "Faka Umthetho Wesitayela Ngezansi"
4729
+ },
4730
+ "panels/elements/StylePropertiesSection.ts | sattributesStyle": {
4731
+ "message": "{PH1}[Isitayela Sezibaluli]"
4732
+ },
4733
+ "panels/elements/StylePropertiesSection.ts | showAllPropertiesSMore": {
4734
+ "message": "Bonisa Zonke Izakhiwo ({PH1} okuningi)"
4735
+ },
4736
+ "panels/elements/StylePropertiesSection.ts | styleAttribute": {
4737
+ "message": "Isibaluli se-style"
4738
+ },
4739
+ "panels/elements/StylePropertiesSection.ts | userAgentStylesheet": {
4740
+ "message": "isitayela seshidi lethuluzi lomsebenzisi"
4741
+ },
4742
+ "panels/elements/StylePropertiesSection.ts | viaInspector": {
4743
+ "message": "ngesihloli"
4744
+ },
4745
+ "panels/elements/StylePropertyTreeElement.ts | copyAllCSSChanges": {
4746
+ "message": "Kopisha zonke izinguquko ze-CSS"
4747
+ },
4670
4748
  "panels/elements/StylePropertyTreeElement.ts | copyAllCssDeclarationsAsJs": {
4671
4749
  "message": "Kopisha zonke izimemezelo njenge-JS"
4672
4750
  },
@@ -4712,36 +4790,18 @@
4712
4790
  "panels/elements/StylePropertyTreeElement.ts | viewComputedValue": {
4713
4791
  "message": "Buka inani lekhompyutha"
4714
4792
  },
4793
+ "panels/elements/StylesSidebarPane.ts | automaticDarkMode": {
4794
+ "message": "Imodi emnyama ngokuzenzekelayo"
4795
+ },
4715
4796
  "panels/elements/StylesSidebarPane.ts | clickToRevealLayer": {
4716
4797
  "message": "Chofoza ukuze wembule isendlalelo esihlahleni sesendlalelo"
4717
4798
  },
4718
- "panels/elements/StylesSidebarPane.ts | constructedStylesheet": {
4719
- "message": "i-stylesheet eyakhiwe"
4720
- },
4721
- "panels/elements/StylesSidebarPane.ts | copiedToClipboard": {
4722
- "message": "Kukopishelwe kubhodi lokunamathisela"
4723
- },
4724
- "panels/elements/StylesSidebarPane.ts | copyAllCSSChanges": {
4725
- "message": "Kopisha zonke izinguquko ze-CSS"
4726
- },
4727
- "panels/elements/StylesSidebarPane.ts | copyAllDeclarations": {
4728
- "message": "Kopisha zonke izimemezelo"
4729
- },
4730
- "panels/elements/StylesSidebarPane.ts | copyRule": {
4731
- "message": "Kopisha umthetho"
4732
- },
4733
- "panels/elements/StylesSidebarPane.ts | copySelector": {
4734
- "message": "Kopisha selector"
4735
- },
4736
4799
  "panels/elements/StylesSidebarPane.ts | cssPropertyName": {
4737
4800
  "message": "CSS igama lempahla: {PH1}"
4738
4801
  },
4739
4802
  "panels/elements/StylesSidebarPane.ts | cssPropertyValue": {
4740
4803
  "message": "CSS inani lempahla: {PH1}"
4741
4804
  },
4742
- "panels/elements/StylesSidebarPane.ts | cssSelector": {
4743
- "message": "Isikhethi se-CSS"
4744
- },
4745
4805
  "panels/elements/StylesSidebarPane.ts | filter": {
4746
4806
  "message": "Hlunga"
4747
4807
  },
@@ -4754,15 +4814,12 @@
4754
4814
  "panels/elements/StylesSidebarPane.ts | incrementdecrementWithMousewheelOne": {
4755
4815
  "message": "Ukunyuka/ukwehla ngesondo legudwane noma ngokhiye waphezulu/waphansi. {PH1}: R ±1, Shift: G ±1, Alt: B ±1"
4756
4816
  },
4817
+ "panels/elements/StylesSidebarPane.ts | inheritedFromSPseudoOf": {
4818
+ "message": "Kuzuzwe kusukela ::{PH1} i-pseudo ye "
4819
+ },
4757
4820
  "panels/elements/StylesSidebarPane.ts | inheritedFroms": {
4758
4821
  "message": "Kuzuzwe njengefa lokuthi "
4759
4822
  },
4760
- "panels/elements/StylesSidebarPane.ts | injectedStylesheet": {
4761
- "message": "ijove isitayela seshidi"
4762
- },
4763
- "panels/elements/StylesSidebarPane.ts | insertStyleRuleBelow": {
4764
- "message": "Faka Umthetho Wesitayela Ngezansi"
4765
- },
4766
4823
  "panels/elements/StylesSidebarPane.ts | invalidPropertyValue": {
4767
4824
  "message": "Inani lesakhiwo elingavumelekile"
4768
4825
  },
@@ -4781,24 +4838,12 @@
4781
4838
  "panels/elements/StylesSidebarPane.ts | pseudoSElement": {
4782
4839
  "message": "I-Pseudo ::{PH1} i-element"
4783
4840
  },
4784
- "panels/elements/StylesSidebarPane.ts | sattributesStyle": {
4785
- "message": "{PH1}[Isitayela Sezibaluli]"
4786
- },
4787
- "panels/elements/StylesSidebarPane.ts | showAllPropertiesSMore": {
4788
- "message": "Bonisa Zonke Izakhiwo ({PH1} okuningi)"
4789
- },
4790
- "panels/elements/StylesSidebarPane.ts | styleAttribute": {
4791
- "message": "Isibaluli se-style"
4841
+ "panels/elements/StylesSidebarPane.ts | toggleRenderingEmulations": {
4842
+ "message": "Guqula ama-emulation afanayo okunikezela"
4792
4843
  },
4793
4844
  "panels/elements/StylesSidebarPane.ts | unknownPropertyName": {
4794
4845
  "message": "Igama lempahla engaziwa"
4795
4846
  },
4796
- "panels/elements/StylesSidebarPane.ts | userAgentStylesheet": {
4797
- "message": "isitayela seshidi lethuluzi lomsebenzisi"
4798
- },
4799
- "panels/elements/StylesSidebarPane.ts | viaInspector": {
4800
- "message": "ngesihloli"
4801
- },
4802
4847
  "panels/elements/components/AccessibilityTreeNode.ts | ignored": {
4803
4848
  "message": "Izitshiwe"
4804
4849
  },
@@ -5345,6 +5390,9 @@
5345
5390
  "panels/issues/CSPViolationsView.ts | filter": {
5346
5391
  "message": "Hlunga"
5347
5392
  },
5393
+ "panels/issues/ComboBoxOfCheckBoxes.ts | genericMenuLabel": {
5394
+ "message": "Imenyu"
5395
+ },
5348
5396
  "panels/issues/CorsIssueDetailsView.ts | allowCredentialsValueFromHeader": {
5349
5397
  "message": "Access-Control-Allow-Credentials Inani lonhlokwana"
5350
5398
  },
@@ -6425,6 +6473,9 @@
6425
6473
  "panels/network/NetworkConfigView.ts | enterACustomUserAgent": {
6426
6474
  "message": "Faka umenzeli womsebenzisi"
6427
6475
  },
6476
+ "panels/network/NetworkConfigView.ts | networkConditionsPanelShown": {
6477
+ "message": "Izimo zenethiwekhi zibonisiwe"
6478
+ },
6428
6479
  "panels/network/NetworkConfigView.ts | networkThrottling": {
6429
6480
  "message": "I-throttling yenethiwekhi"
6430
6481
  },
@@ -7040,6 +7091,9 @@
7040
7091
  "panels/network/RequestHeadersView.ts | general": {
7041
7092
  "message": "Okuvamile"
7042
7093
  },
7094
+ "panels/network/RequestHeadersView.ts | headerOverrides": {
7095
+ "message": "Ukukhipha unhlokweni"
7096
+ },
7043
7097
  "panels/network/RequestHeadersView.ts | learnMore": {
7044
7098
  "message": "Funda kabanzi"
7045
7099
  },
@@ -110,7 +110,7 @@ const UIStrings = {
110
110
  obsoleteWebRtcCipherSuite:
111
111
  'Your partner is negotiating an obsolete (D)TLS version. Please check with your partner to have this fixed.',
112
112
  /**
113
- *@description TODO(crbug.com/1318868): Description needed for translation
113
+ *@description This issue indicates that a `<source>` element with a `<picture>` parent was using an `src` attribute, which is not valid and is ignored by the browser. The `srcset` attribute should be used instead.
114
114
  */
115
115
  pictureSourceSrc:
116
116
  '`<source src>` with a `<picture>` parent is invalid and therefore ignored. Please use `<source srcset>` instead.',
@@ -113,17 +113,29 @@ const UIStrings = {
113
113
  */
114
114
  runLighthouseInMode: 'Run Lighthouse in navigation, timespan, or snapshot mode',
115
115
  /**
116
- * @description Label of a radio option for a Lighthouse mode that audits a page navigation.
116
+ * @description Label of a radio option for a Lighthouse mode that audits a page navigation. This should be marked as the default radio option.
117
117
  */
118
- navigation: 'Navigation',
118
+ navigation: 'Navigation (Default)',
119
+ /**
120
+ * @description Tooltip description of a radio option for a Lighthouse mode that audits a page navigation.
121
+ */
122
+ navigationTooltip: 'Navigation mode analyzes a page load, exactly like the original Lighthouse reports.',
119
123
  /**
120
124
  * @description Label of a radio option for a Lighthouse mode that audits user interactions over a period of time.
121
125
  */
122
126
  timespan: 'Timespan',
127
+ /**
128
+ * @description Tooltip description of a radio option for a Lighthouse mode that audits user interactions over a period of time.
129
+ */
130
+ timespanTooltip: 'Timespan mode analyzes an arbitrary period of time, typically containing user interactions.',
123
131
  /**
124
132
  * @description Label of a radio option for a Lighthouse mode that audits the current page state.
125
133
  */
126
134
  snapshot: 'Snapshot',
135
+ /**
136
+ * @description Tooltip description of a radio option for a Lighthouse mode that audits the current page state.
137
+ */
138
+ snapshotTooltip: 'Snapshot mode analyzes the page in a particular state, typically after user interactions.',
127
139
  /**
128
140
  *@description Text for the mobile platform, as opposed to desktop
129
141
  */
@@ -364,6 +376,9 @@ export class LighthouseController extends Common.ObjectWrapper.ObjectWrapper<Eve
364
376
  this.dispatchEventToListeners(Events.PageAuditabilityChanged, {helpText});
365
377
 
366
378
  void this.hasImportantResourcesNotCleared().then(warning => {
379
+ if (this.getFlags().mode !== 'navigation') {
380
+ warning = '';
381
+ }
367
382
  this.dispatchEventToListeners(Events.PageWarningsChanged, {warning});
368
383
  });
369
384
  }
@@ -456,11 +471,23 @@ export const RuntimeSettings: RuntimeSetting[] = [
456
471
  flags.mode = value;
457
472
  },
458
473
  options: [
459
- {label: i18nLazyString(UIStrings.navigation), value: 'navigation'},
460
- {label: i18nLazyString(UIStrings.timespan), value: 'timespan'},
461
- {label: i18nLazyString(UIStrings.snapshot), value: 'snapshot'},
474
+ {
475
+ label: i18nLazyString(UIStrings.navigation),
476
+ tooltip: i18nLazyString(UIStrings.navigationTooltip),
477
+ value: 'navigation',
478
+ },
479
+ {
480
+ label: i18nLazyString(UIStrings.timespan),
481
+ tooltip: i18nLazyString(UIStrings.timespanTooltip),
482
+ value: 'timespan',
483
+ },
484
+ {
485
+ label: i18nLazyString(UIStrings.snapshot),
486
+ tooltip: i18nLazyString(UIStrings.snapshotTooltip),
487
+ value: 'snapshot',
488
+ },
462
489
  ],
463
- learnMore: undefined,
490
+ learnMore: 'https://web.dev/lighthouse-user-flows/',
464
491
  },
465
492
  {
466
493
  // This setting is disabled, but we keep it around to show in the UI.
@@ -545,7 +572,11 @@ export interface RuntimeSetting {
545
572
  setting: Common.Settings.Setting<string|boolean>;
546
573
  description: () => Common.UIString.LocalizedString;
547
574
  setFlags: (flags: Flags, value: string|boolean) => void;
548
- options?: {label: () => Common.UIString.LocalizedString, value: string}[];
575
+ options?: {
576
+ label: () => Common.UIString.LocalizedString,
577
+ value: string,
578
+ tooltip?: () => Common.UIString.LocalizedString,
579
+ }[];
549
580
  title?: () => Common.UIString.LocalizedString;
550
581
  learnMore?: string;
551
582
  }
@@ -174,7 +174,7 @@ export class LighthousePanel extends UI.Panel.Panel {
174
174
  return;
175
175
  }
176
176
 
177
- this.startView.updateStartButton();
177
+ this.startView.updateMode();
178
178
 
179
179
  this.unauditableExplanation = evt.data.helpText;
180
180
  this.startView.setUnauditableExplanation(evt.data.helpText);
@@ -44,8 +44,8 @@ export class StartView extends UI.Widget.Widget {
44
44
  protected controller: LighthouseController;
45
45
  private readonly settingsToolbarInternal: UI.Toolbar.Toolbar;
46
46
  protected startButton!: HTMLButtonElement;
47
- private helpText?: Element;
48
- private warningText?: Element;
47
+ protected helpText?: Element;
48
+ protected warningText?: Element;
49
49
  private shouldConfirm?: boolean;
50
50
 
51
51
  constructor(controller: LighthouseController) {
@@ -66,6 +66,17 @@ export class StartView extends UI.Widget.Widget {
66
66
  throw new Error(`${settingName} is not a setting with options`);
67
67
  }
68
68
 
69
+ const labelEl = document.createElement('div');
70
+ labelEl.classList.add('lighthouse-form-section-label');
71
+ labelEl.textContent = label;
72
+
73
+ if (runtimeSetting.learnMore) {
74
+ const link =
75
+ UI.XLink.XLink.create(runtimeSetting.learnMore, i18nString(UIStrings.learnMore), 'lighthouse-learn-more');
76
+ labelEl.append(link);
77
+ }
78
+ parentElement.appendChild(labelEl);
79
+
69
80
  const control = new RadioSetting(
70
81
  runtimeSetting.options, runtimeSetting.setting as Common.Settings.Setting<string>,
71
82
  runtimeSetting.description());
@@ -91,7 +102,7 @@ export class StartView extends UI.Widget.Widget {
91
102
  }
92
103
  }
93
104
 
94
- private populateFormControls(fragment: UI.Fragment.Fragment): void {
105
+ protected populateFormControls(fragment: UI.Fragment.Fragment): void {
95
106
  // Populate the device type
96
107
  const deviceTypeFormElements = fragment.$('device-type-form-elements');
97
108
  this.populateRuntimeSettingAsRadio('lighthouse.device_type', i18nString(UIStrings.device), deviceTypeFormElements);
@@ -157,9 +168,6 @@ export class StartView extends UI.Widget.Widget {
157
168
  </div>
158
169
  </div>
159
170
  <div class="lighthouse-form-section">
160
- <div class="lighthouse-form-section-label">
161
- ${i18nString(UIStrings.device)}
162
- </div>
163
171
  <div class="lighthouse-form-elements" $="device-type-form-elements"></div>
164
172
  </div>
165
173
  </form>
@@ -173,7 +181,7 @@ export class StartView extends UI.Widget.Widget {
173
181
  this.contentElement.style.overflow = 'auto';
174
182
  }
175
183
 
176
- updateStartButton(): void {
184
+ updateMode(): void {
177
185
  // Do nothing in default case.
178
186
  }
179
187
 
@@ -10,20 +10,32 @@ import {StartView} from './LighthouseStartView.js';
10
10
  import {Events} from './LighthouseController.js';
11
11
 
12
12
  const UIStrings = {
13
+ /**
14
+ * @description Text displayed as the title of a panel that can be used to audit a web page with Lighthouse.
15
+ */
16
+ generateLighthouseReport: 'Generate a Lighthouse report',
13
17
  /**
14
18
  * @description Text that refers to the Lighthouse mode
15
19
  */
16
20
  mode: 'Mode',
21
+ /**
22
+ * @description Title in the Lighthouse Start View for list of categories to run during audit
23
+ */
24
+ categories: 'Categories',
25
+ /**
26
+ * @description Title in the Lighthouse Start View for list of available start plugins
27
+ */
28
+ plugins: 'Plugins',
17
29
  /**
18
30
  * @description Label for a button to start analyzing a page navigation with Lighthouse
19
31
  */
20
- analyzeNavigation: 'Analyze navigation',
32
+ analyzeNavigation: 'Analyze page load',
21
33
  /**
22
34
  * @description Label for a button to start analyzing the current page state with Lighthouse
23
35
  */
24
- analyzeSnapshot: 'Analyze snapshot',
36
+ analyzeSnapshot: 'Analyze page state',
25
37
  /**
26
- * @description Label for a button that ends a Lighthouse timespan
38
+ * @description Label for a button that starts a Lighthouse mode that analyzes user interactions over a period of time.
27
39
  */
28
40
  startTimespan: 'Start timespan',
29
41
  };
@@ -35,31 +47,75 @@ export class StartViewFR extends StartView {
35
47
  protected render(): void {
36
48
  super.render();
37
49
  const fragment = UI.Fragment.Fragment.build`
38
- <div class="lighthouse-form-section">
39
- <div class="lighthouse-form-section-label">
40
- ${i18nString(UIStrings.mode)}
41
- </div>
42
- <div class="lighthouse-form-elements" $="mode-form-elements"></div>
50
+ <form class="lighthouse-start-view-fr">
51
+ <header class="hbox">
52
+ <div class="lighthouse-logo"></div>
53
+ <div class="lighthouse-title">${i18nString(UIStrings.generateLighthouseReport)}</div>
54
+ <div class="lighthouse-start-button-container">${this.startButton}</div>
55
+ </header>
56
+ <div $="help-text" class="lighthouse-help-text hidden"></div>
57
+ <div class="lighthouse-options hbox">
58
+ <div class="lighthouse-form-section">
59
+ <div class="lighthouse-form-elements" $="mode-form-elements"></div>
60
+ </div>
61
+ <div class="lighthouse-form-section">
62
+ <div class="lighthouse-form-elements" $="device-type-form-elements"></div>
63
+ </div>
64
+ <div class="lighthouse-form-categories">
65
+ <div class="lighthouse-form-section">
66
+ <div class="lighthouse-form-section-label">${i18nString(UIStrings.categories)}</div>
67
+ <div class="lighthouse-form-elements" $="categories-form-elements"></div>
68
+ </div>
69
+ <div class="lighthouse-form-section">
70
+ <div class="lighthouse-form-section-label">
71
+ <div class="lighthouse-icon-label">${i18nString(UIStrings.plugins)}</div>
72
+ </div>
73
+ <div class="lighthouse-form-elements" $="plugins-form-elements"></div>
74
+ </div>
75
+ </div>
43
76
  </div>
77
+ <div $="warning-text" class="lighthouse-warning-text hidden"></div>
78
+ </form>
44
79
  `;
45
80
 
81
+ this.helpText = fragment.$('help-text');
82
+ this.warningText = fragment.$('warning-text');
83
+
84
+ // The previous radios are removed later and don't exist on the new fragment yet.
85
+ this.populateFormControls(fragment);
86
+
46
87
  // Populate the Lighthouse mode
47
88
  const modeFormElements = fragment.$('mode-form-elements');
48
89
  this.populateRuntimeSettingAsRadio('lighthouse.mode', i18nString(UIStrings.mode), modeFormElements);
49
90
 
50
- const form = this.contentElement.querySelector('form');
51
- form?.appendChild(fragment.element());
52
- this.updateStartButton();
91
+ this.contentElement.textContent = '';
92
+ this.contentElement.append(fragment.element());
93
+ this.updateMode();
94
+ }
95
+
96
+ onResize(): void {
97
+ const useNarrowLayout = this.contentElement.offsetWidth < 500;
98
+ const useWideLayout = this.contentElement.offsetWidth > 800;
99
+ const headerEl = this.contentElement.querySelector('.lighthouse-start-view-fr header');
100
+ const optionsEl = this.contentElement.querySelector('.lighthouse-options');
101
+ if (headerEl) {
102
+ headerEl.classList.toggle('hbox', !useNarrowLayout);
103
+ headerEl.classList.toggle('vbox', useNarrowLayout);
104
+ }
105
+ if (optionsEl) {
106
+ optionsEl.classList.toggle('wide', useWideLayout);
107
+ optionsEl.classList.toggle('narrow', useNarrowLayout);
108
+ }
53
109
  }
54
110
 
55
- updateStartButton(): void {
111
+ updateMode(): void {
56
112
  const {mode} = this.controller.getFlags();
57
113
 
58
- let label: Platform.UIString.LocalizedString;
114
+ let buttonLabel: Platform.UIString.LocalizedString;
59
115
  let callback: () => void;
60
116
 
61
117
  if (mode === 'timespan') {
62
- label = i18nString(UIStrings.startTimespan);
118
+ buttonLabel = i18nString(UIStrings.startTimespan);
63
119
  callback = (): void => {
64
120
  this.controller.dispatchEventToListeners(
65
121
  Events.RequestLighthouseTimespanStart,
@@ -67,7 +123,7 @@ export class StartViewFR extends StartView {
67
123
  );
68
124
  };
69
125
  } else if (mode === 'snapshot') {
70
- label = i18nString(UIStrings.analyzeSnapshot);
126
+ buttonLabel = i18nString(UIStrings.analyzeSnapshot);
71
127
  callback = (): void => {
72
128
  this.controller.dispatchEventToListeners(
73
129
  Events.RequestLighthouseStart,
@@ -75,7 +131,7 @@ export class StartViewFR extends StartView {
75
131
  );
76
132
  };
77
133
  } else {
78
- label = i18nString(UIStrings.analyzeNavigation);
134
+ buttonLabel = i18nString(UIStrings.analyzeNavigation);
79
135
  callback = (): void => {
80
136
  this.controller.dispatchEventToListeners(
81
137
  Events.RequestLighthouseStart,
@@ -85,16 +141,16 @@ export class StartViewFR extends StartView {
85
141
  }
86
142
 
87
143
  this.startButton = UI.UIUtils.createTextButton(
88
- label,
144
+ buttonLabel,
89
145
  callback,
90
146
  /* className */ '',
91
147
  /* primary */ true,
92
148
  );
93
149
 
94
- const startButtonContainer = this.contentElement.querySelector('.lighthouse-start-button-container');
95
- if (startButtonContainer) {
96
- startButtonContainer.textContent = '';
97
- startButtonContainer.appendChild(this.startButton);
150
+ const startButtonContainerEl = this.contentElement.querySelector('.lighthouse-start-button-container');
151
+ if (startButtonContainerEl) {
152
+ startButtonContainerEl.textContent = '';
153
+ startButtonContainerEl.appendChild(this.startButton);
98
154
  }
99
155
  }
100
156
  }
@@ -5,16 +5,20 @@
5
5
  import type * as Common from '../../core/common/common.js';
6
6
  import * as UI from '../../ui/legacy/legacy.js';
7
7
 
8
+ interface RadioOption {
9
+ value: string;
10
+ label: () => Common.UIString.LocalizedString;
11
+ tooltip?: () => Common.UIString.LocalizedString;
12
+ }
13
+
8
14
  export class RadioSetting {
9
15
  private readonly setting: Common.Settings.Setting<string>;
10
- private options: {value: string, label: () => Common.UIString.LocalizedString}[];
16
+ private options: RadioOption[];
11
17
  element: HTMLDivElement;
12
18
  private radioElements: HTMLInputElement[];
13
19
  private ignoreChangeEvents: boolean;
14
20
  private selectedIndex: number;
15
- constructor(
16
- options: {value: string, label: () => Common.UIString.LocalizedString}[],
17
- setting: Common.Settings.Setting<string>, description: string) {
21
+ constructor(options: RadioOption[], setting: Common.Settings.Setting<string>, description: string) {
18
22
  this.setting = setting;
19
23
  this.options = options;
20
24
 
@@ -32,9 +36,11 @@ export class RadioSetting {
32
36
  `;
33
37
 
34
38
  this.element.appendChild(fragment.element());
39
+
40
+ const tooltip = option.tooltip?.() || description;
35
41
  if (description) {
36
- UI.Tooltip.Tooltip.install(fragment.$('input') as HTMLElement, description);
37
- UI.Tooltip.Tooltip.install(fragment.$('span') as HTMLElement, description);
42
+ UI.Tooltip.Tooltip.install(fragment.$('input') as HTMLElement, tooltip);
43
+ UI.Tooltip.Tooltip.install(fragment.$('span') as HTMLElement, tooltip);
38
44
  }
39
45
  const radioElement = fragment.$('input') as HTMLInputElement;
40
46
  radioElement.addEventListener('change', this.valueChanged.bind(this));