chrome-devtools-frontend 1.0.995491 → 1.0.996595

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 (110) hide show
  1. package/AUTHORS +1 -0
  2. package/front_end/core/i18n/locales/af.json +96 -42
  3. package/front_end/core/i18n/locales/am.json +97 -43
  4. package/front_end/core/i18n/locales/ar.json +95 -41
  5. package/front_end/core/i18n/locales/as.json +95 -41
  6. package/front_end/core/i18n/locales/az.json +96 -42
  7. package/front_end/core/i18n/locales/be.json +124 -70
  8. package/front_end/core/i18n/locales/bg.json +96 -42
  9. package/front_end/core/i18n/locales/bn.json +95 -41
  10. package/front_end/core/i18n/locales/bs.json +95 -41
  11. package/front_end/core/i18n/locales/ca.json +96 -42
  12. package/front_end/core/i18n/locales/cs.json +95 -41
  13. package/front_end/core/i18n/locales/cy.json +95 -41
  14. package/front_end/core/i18n/locales/da.json +97 -43
  15. package/front_end/core/i18n/locales/de.json +96 -42
  16. package/front_end/core/i18n/locales/el.json +95 -41
  17. package/front_end/core/i18n/locales/en-GB.json +95 -41
  18. package/front_end/core/i18n/locales/en-US.json +26 -5
  19. package/front_end/core/i18n/locales/en-XL.json +26 -5
  20. package/front_end/core/i18n/locales/es-419.json +95 -41
  21. package/front_end/core/i18n/locales/es.json +101 -47
  22. package/front_end/core/i18n/locales/et.json +95 -41
  23. package/front_end/core/i18n/locales/eu.json +100 -46
  24. package/front_end/core/i18n/locales/fa.json +104 -50
  25. package/front_end/core/i18n/locales/fi.json +95 -41
  26. package/front_end/core/i18n/locales/fil.json +95 -41
  27. package/front_end/core/i18n/locales/fr-CA.json +96 -42
  28. package/front_end/core/i18n/locales/fr.json +95 -41
  29. package/front_end/core/i18n/locales/gl.json +104 -50
  30. package/front_end/core/i18n/locales/gu.json +95 -41
  31. package/front_end/core/i18n/locales/he.json +95 -41
  32. package/front_end/core/i18n/locales/hi.json +98 -44
  33. package/front_end/core/i18n/locales/hr.json +96 -42
  34. package/front_end/core/i18n/locales/hu.json +96 -42
  35. package/front_end/core/i18n/locales/hy.json +95 -41
  36. package/front_end/core/i18n/locales/id.json +97 -43
  37. package/front_end/core/i18n/locales/is.json +95 -41
  38. package/front_end/core/i18n/locales/it.json +96 -42
  39. package/front_end/core/i18n/locales/ja.json +95 -41
  40. package/front_end/core/i18n/locales/ka.json +95 -41
  41. package/front_end/core/i18n/locales/kk.json +98 -44
  42. package/front_end/core/i18n/locales/km.json +95 -41
  43. package/front_end/core/i18n/locales/kn.json +96 -42
  44. package/front_end/core/i18n/locales/ko.json +96 -42
  45. package/front_end/core/i18n/locales/ky.json +97 -43
  46. package/front_end/core/i18n/locales/lo.json +96 -42
  47. package/front_end/core/i18n/locales/lt.json +95 -41
  48. package/front_end/core/i18n/locales/lv.json +95 -41
  49. package/front_end/core/i18n/locales/mk.json +98 -44
  50. package/front_end/core/i18n/locales/ml.json +96 -42
  51. package/front_end/core/i18n/locales/mn.json +96 -42
  52. package/front_end/core/i18n/locales/mr.json +95 -41
  53. package/front_end/core/i18n/locales/ms.json +95 -41
  54. package/front_end/core/i18n/locales/my.json +95 -41
  55. package/front_end/core/i18n/locales/ne.json +100 -46
  56. package/front_end/core/i18n/locales/nl.json +99 -45
  57. package/front_end/core/i18n/locales/no.json +95 -41
  58. package/front_end/core/i18n/locales/or.json +98 -44
  59. package/front_end/core/i18n/locales/pa.json +95 -41
  60. package/front_end/core/i18n/locales/pl.json +95 -41
  61. package/front_end/core/i18n/locales/pt-PT.json +95 -41
  62. package/front_end/core/i18n/locales/pt.json +98 -44
  63. package/front_end/core/i18n/locales/ro.json +96 -42
  64. package/front_end/core/i18n/locales/ru.json +115 -61
  65. package/front_end/core/i18n/locales/si.json +96 -42
  66. package/front_end/core/i18n/locales/sk.json +95 -41
  67. package/front_end/core/i18n/locales/sl.json +95 -41
  68. package/front_end/core/i18n/locales/sq.json +96 -42
  69. package/front_end/core/i18n/locales/sr-Latn.json +96 -42
  70. package/front_end/core/i18n/locales/sr.json +96 -42
  71. package/front_end/core/i18n/locales/sv.json +96 -42
  72. package/front_end/core/i18n/locales/sw.json +97 -43
  73. package/front_end/core/i18n/locales/ta.json +96 -42
  74. package/front_end/core/i18n/locales/te.json +108 -54
  75. package/front_end/core/i18n/locales/th.json +95 -41
  76. package/front_end/core/i18n/locales/tr.json +95 -41
  77. package/front_end/core/i18n/locales/uk.json +95 -41
  78. package/front_end/core/i18n/locales/ur.json +95 -41
  79. package/front_end/core/i18n/locales/uz.json +95 -41
  80. package/front_end/core/i18n/locales/vi.json +104 -50
  81. package/front_end/core/i18n/locales/zh-HK.json +96 -42
  82. package/front_end/core/i18n/locales/zh-TW.json +97 -43
  83. package/front_end/core/i18n/locales/zh.json +99 -45
  84. package/front_end/core/i18n/locales/zu.json +95 -41
  85. package/front_end/core/sdk/CSSMatchedStyles.ts +158 -33
  86. package/front_end/core/sdk/CSSMetadata.ts +1 -8
  87. package/front_end/generated/InspectorBackendCommands.js +33 -2
  88. package/front_end/generated/protocol.ts +42 -7
  89. package/front_end/models/issues_manager/DeprecationIssue.ts +3 -3
  90. package/front_end/panels/changes/ChangesView.ts +25 -10
  91. package/front_end/panels/elements/ElementsPanel.ts +7 -6
  92. package/front_end/panels/elements/StylesSidebarPane.ts +39 -15
  93. package/front_end/panels/elements/stylesSectionTree.css +1 -0
  94. package/front_end/panels/elements/stylesSidebarPane.css +1 -1
  95. package/front_end/panels/lighthouse/LighthouseController.ts +38 -7
  96. package/front_end/panels/lighthouse/LighthousePanel.ts +1 -1
  97. package/front_end/panels/lighthouse/LighthouseStartView.ts +15 -7
  98. package/front_end/panels/lighthouse/LighthouseStartViewFR.ts +77 -21
  99. package/front_end/panels/lighthouse/RadioSetting.ts +12 -6
  100. package/front_end/panels/lighthouse/lighthouseStartView.css +49 -2
  101. package/front_end/panels/profiler/HeapSnapshotGridNodes.ts +1 -0
  102. package/front_end/panels/security/SecurityPanel.ts +2 -2
  103. package/front_end/ui/components/diff_view/diffView.css +2 -0
  104. package/front_end/ui/components/tree_outline/TreeOutline.ts +18 -7
  105. package/front_end/ui/legacy/Toolbar.ts +5 -0
  106. package/front_end/ui/legacy/softDropDownButton.css +4 -0
  107. package/package.json +2 -1
  108. package/scripts/eslint_rules/lib/inline_type_imports.js +158 -0
  109. package/scripts/eslint_rules/tests/inline_type_imports_test.js +106 -0
  110. package/scripts/javascript_natives/index.js +1 -2
@@ -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
  },
@@ -2,10 +2,11 @@
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
4
 
5
+ import * as Protocol from '../../generated/protocol.js';
5
6
  import * as TextUtils from '../../models/text_utils/text_utils.js';
6
- import type * as Protocol from '../../generated/protocol.js';
7
7
 
8
8
  import {cssMetadata, CustomVariableRegex, VariableRegex} from './CSSMetadata.js';
9
+
9
10
  import type {CSSModel} from './CSSModel.js';
10
11
  import type {CSSProperty} from './CSSProperty.js';
11
12
  import {CSSKeyframesRule, CSSStyleRule} from './CSSRule.js';
@@ -22,6 +23,7 @@ export class CSSMatchedStyles {
22
23
  readonly #inheritedStyles: Set<CSSStyleDeclaration>;
23
24
  readonly #mainDOMCascade: DOMInheritanceCascade;
24
25
  readonly #pseudoDOMCascades: Map<Protocol.DOM.PseudoType, DOMInheritanceCascade>;
26
+ readonly #customHighlightPseudoDOMCascades: Map<string, DOMInheritanceCascade>;
25
27
  readonly #styleToDOMCascade: Map<CSSStyleDeclaration, DOMInheritanceCascade>;
26
28
 
27
29
  constructor(
@@ -48,10 +50,13 @@ export class CSSMatchedStyles {
48
50
  }
49
51
 
50
52
  this.#mainDOMCascade = this.buildMainCascade(inlinePayload, attributesPayload, matchedPayload, inheritedPayload);
51
- this.#pseudoDOMCascades = this.buildPseudoCascades(pseudoPayload, inheritedPseudoPayload);
53
+ [this.#pseudoDOMCascades, this.#customHighlightPseudoDOMCascades] =
54
+ this.buildPseudoCascades(pseudoPayload, inheritedPseudoPayload);
52
55
 
53
56
  this.#styleToDOMCascade = new Map();
54
- for (const domCascade of Array.from(this.#pseudoDOMCascades.values()).concat(this.#mainDOMCascade)) {
57
+ for (const domCascade of Array.from(this.#customHighlightPseudoDOMCascades.values())
58
+ .concat(Array.from(this.#pseudoDOMCascades.values()))
59
+ .concat(this.#mainDOMCascade)) {
55
60
  for (const style of domCascade.styles()) {
56
61
  this.#styleToDOMCascade.set(style, domCascade);
57
62
  }
@@ -206,36 +211,133 @@ export class CSSMatchedStyles {
206
211
  }
207
212
  }
208
213
 
214
+ /**
215
+ * Pseudo rule matches received via the inspector protocol are grouped by pseudo type.
216
+ * For custom highlight pseudos, we need to instead group the rule matches by highlight
217
+ * name in order to produce separate cascades for each highlight name. This is necessary
218
+ * so that styles of ::highlight(foo) are not shown as overriding styles of ::highlight(bar).
219
+ *
220
+ * This helper function takes a list of rule matches and generates separate NodeCascades
221
+ * for each custom highlight name that was matched.
222
+ */
223
+ private buildSplitCustomHighlightCascades(
224
+ rules: Protocol.CSS.RuleMatch[], node: DOMNode, isInherited: boolean,
225
+ pseudoCascades: Map<string, NodeCascade[]>): void {
226
+ const splitHighlightRules = new Map<string, CSSStyleDeclaration[]>();
227
+
228
+ for (let j = rules.length - 1; j >= 0; --j) {
229
+ const highlightNamesToMatchingSelectorIndices = this.customHighlightNamesToMatchingSelectorIndices(rules[j]);
230
+
231
+ for (const [highlightName, matchingSelectors] of highlightNamesToMatchingSelectorIndices) {
232
+ const pseudoRule = new CSSStyleRule(this.#cssModelInternal, rules[j].rule);
233
+ this.#nodeForStyleInternal.set(pseudoRule.style, node);
234
+ if (isInherited) {
235
+ this.#inheritedStyles.add(pseudoRule.style);
236
+ }
237
+ this.addMatchingSelectors(node, pseudoRule, matchingSelectors);
238
+
239
+ const ruleListForHighlightName = splitHighlightRules.get(highlightName);
240
+ if (ruleListForHighlightName) {
241
+ ruleListForHighlightName.push(pseudoRule.style);
242
+ } else {
243
+ splitHighlightRules.set(highlightName, [pseudoRule.style]);
244
+ }
245
+ }
246
+ }
247
+
248
+ for (const [highlightName, highlightStyles] of splitHighlightRules) {
249
+ const nodeCascade = new NodeCascade(this, highlightStyles, isInherited, true /* #isHighlightPseudoCascade*/);
250
+ const cascadeListForHighlightName = pseudoCascades.get(highlightName);
251
+ if (cascadeListForHighlightName) {
252
+ cascadeListForHighlightName.push(nodeCascade);
253
+ } else {
254
+ pseudoCascades.set(highlightName, [nodeCascade]);
255
+ }
256
+ }
257
+ }
258
+
259
+ /**
260
+ * Return a mapping of the highlight names in the specified RuleMatch to
261
+ * the indices of selectors in that selector list with that highlight name.
262
+ *
263
+ * For example, consider the following ruleset:
264
+ * span::highlight(foo), div, #mySpan::highlight(bar), .highlighted::highlight(foo) {
265
+ * color: blue;
266
+ * }
267
+ *
268
+ * For a <span id="mySpan" class="highlighted"></span>, a RuleMatch for that span
269
+ * would have matchingSelectors [0, 2, 3] indicating that the span
270
+ * matches all of the highlight selectors.
271
+ *
272
+ * For that RuleMatch, this function would produce the following map:
273
+ * {
274
+ * "foo": [0, 3],
275
+ * "bar": [2]
276
+ * }
277
+ *
278
+ * @param ruleMatch
279
+ * @returns A mapping of highlight names to lists of indices into the selector
280
+ * list associated with ruleMatch. The indices correspond to the selectors in the rule
281
+ * associated with the key's highlight name.
282
+ */
283
+ private customHighlightNamesToMatchingSelectorIndices(ruleMatch: Protocol.CSS.RuleMatch): Map<string, number[]> {
284
+ const highlightNamesToMatchingSelectors = new Map<string, number[]>();
285
+
286
+ for (let i = 0; i < ruleMatch.matchingSelectors.length; i++) {
287
+ const matchingSelectorIndex = ruleMatch.matchingSelectors[i];
288
+ const selectorText = ruleMatch.rule.selectorList.selectors[matchingSelectorIndex].text;
289
+ const highlightNameMatch = selectorText.match(/::highlight\((.*)\)/);
290
+ if (highlightNameMatch) {
291
+ const highlightName = highlightNameMatch[1];
292
+ const selectorsForName = highlightNamesToMatchingSelectors.get(highlightName);
293
+ if (selectorsForName) {
294
+ selectorsForName.push(matchingSelectorIndex);
295
+ } else {
296
+ highlightNamesToMatchingSelectors.set(highlightName, [matchingSelectorIndex]);
297
+ }
298
+ }
299
+ }
300
+ return highlightNamesToMatchingSelectors;
301
+ }
302
+
209
303
  private buildPseudoCascades(
210
304
  pseudoPayload: Protocol.CSS.PseudoElementMatches[],
211
305
  inheritedPseudoPayload: Protocol.CSS.InheritedPseudoElementMatches[]):
212
- Map<Protocol.DOM.PseudoType, DOMInheritanceCascade> {
306
+ [Map<Protocol.DOM.PseudoType, DOMInheritanceCascade>, Map<string, DOMInheritanceCascade>] {
213
307
  const pseudoInheritanceCascades = new Map<Protocol.DOM.PseudoType, DOMInheritanceCascade>();
308
+ const customHighlightPseudoInheritanceCascades = new Map<string, DOMInheritanceCascade>();
214
309
  if (!pseudoPayload) {
215
- return pseudoInheritanceCascades;
310
+ return [pseudoInheritanceCascades, customHighlightPseudoInheritanceCascades];
216
311
  }
217
312
 
218
313
  const pseudoCascades = new Map<Protocol.DOM.PseudoType, NodeCascade[]>();
314
+ const customHighlightPseudoCascades = new Map<string, NodeCascade[]>();
219
315
  for (let i = 0; i < pseudoPayload.length; ++i) {
220
316
  const entryPayload = pseudoPayload[i];
221
317
  // PseudoElement nodes are not created unless "content" css property is set.
222
318
  const pseudoElement = this.#nodeInternal.pseudoElements().get(entryPayload.pseudoType) || null;
223
319
  const pseudoStyles = [];
224
320
  const rules = entryPayload.matches || [];
225
- for (let j = rules.length - 1; j >= 0; --j) {
226
- const pseudoRule = new CSSStyleRule(this.#cssModelInternal, rules[j].rule);
227
- pseudoStyles.push(pseudoRule.style);
228
- const nodeForStyle =
229
- cssMetadata().isHighlightPseudoType(entryPayload.pseudoType) ? this.#nodeInternal : pseudoElement;
230
- this.#nodeForStyleInternal.set(pseudoRule.style, nodeForStyle);
231
- if (nodeForStyle) {
232
- this.addMatchingSelectors(nodeForStyle, pseudoRule, rules[j].matchingSelectors);
321
+
322
+ if (entryPayload.pseudoType === Protocol.DOM.PseudoType.Highlight) {
323
+ this.buildSplitCustomHighlightCascades(
324
+ rules, this.#nodeInternal, false /* #isInherited */, customHighlightPseudoCascades);
325
+ } else {
326
+ for (let j = rules.length - 1; j >= 0; --j) {
327
+ const pseudoRule = new CSSStyleRule(this.#cssModelInternal, rules[j].rule);
328
+ pseudoStyles.push(pseudoRule.style);
329
+ const nodeForStyle =
330
+ cssMetadata().isHighlightPseudoType(entryPayload.pseudoType) ? this.#nodeInternal : pseudoElement;
331
+ this.#nodeForStyleInternal.set(pseudoRule.style, nodeForStyle);
332
+ if (nodeForStyle) {
333
+ this.addMatchingSelectors(nodeForStyle, pseudoRule, rules[j].matchingSelectors);
334
+ }
233
335
  }
336
+ const isHighlightPseudoCascade = cssMetadata().isHighlightPseudoType(entryPayload.pseudoType);
337
+ const nodeCascade = new NodeCascade(
338
+ this, pseudoStyles, false /* #isInherited */, isHighlightPseudoCascade /* #isHighlightPseudoCascade*/);
339
+ pseudoCascades.set(entryPayload.pseudoType, [nodeCascade]);
234
340
  }
235
- const isHighlightPseudoCascade = cssMetadata().isHighlightPseudoType(entryPayload.pseudoType);
236
- const nodeCascade = new NodeCascade(
237
- this, pseudoStyles, false /* #isInherited */, isHighlightPseudoCascade /* #isHighlightPseudoCascade*/);
238
- pseudoCascades.set(entryPayload.pseudoType, [nodeCascade]);
239
341
  }
240
342
 
241
343
  if (inheritedPseudoPayload) {
@@ -244,24 +346,30 @@ export class CSSMatchedStyles {
244
346
  const inheritedPseudoMatches = inheritedPseudoPayload[i].pseudoElements;
245
347
  for (let j = 0; j < inheritedPseudoMatches.length; ++j) {
246
348
  const inheritedEntryPayload = inheritedPseudoMatches[j];
247
- const pseudoStyles = [];
248
349
  const rules = inheritedEntryPayload.matches || [];
249
- for (let k = rules.length - 1; k >= 0; --k) {
250
- const pseudoRule = new CSSStyleRule(this.#cssModelInternal, rules[k].rule);
251
- pseudoStyles.push(pseudoRule.style);
252
- this.#nodeForStyleInternal.set(pseudoRule.style, parentNode);
253
- this.#inheritedStyles.add(pseudoRule.style);
254
- this.addMatchingSelectors(parentNode, pseudoRule, rules[k].matchingSelectors);
255
- }
256
350
 
257
- const isHighlightPseudoCascade = cssMetadata().isHighlightPseudoType(inheritedEntryPayload.pseudoType);
258
- const nodeCascade = new NodeCascade(
259
- this, pseudoStyles, true /* #isInherited */, isHighlightPseudoCascade /* #isHighlightPseudoCascade*/);
260
- const cascadeListForPseudoType = pseudoCascades.get(inheritedEntryPayload.pseudoType);
261
- if (cascadeListForPseudoType) {
262
- cascadeListForPseudoType.push(nodeCascade);
351
+ if (inheritedEntryPayload.pseudoType === Protocol.DOM.PseudoType.Highlight) {
352
+ this.buildSplitCustomHighlightCascades(
353
+ rules, parentNode, true /* #isInherited */, customHighlightPseudoCascades);
263
354
  } else {
264
- pseudoCascades.set(inheritedEntryPayload.pseudoType, [nodeCascade]);
355
+ const pseudoStyles = [];
356
+ for (let k = rules.length - 1; k >= 0; --k) {
357
+ const pseudoRule = new CSSStyleRule(this.#cssModelInternal, rules[k].rule);
358
+ pseudoStyles.push(pseudoRule.style);
359
+ this.#nodeForStyleInternal.set(pseudoRule.style, parentNode);
360
+ this.#inheritedStyles.add(pseudoRule.style);
361
+ this.addMatchingSelectors(parentNode, pseudoRule, rules[k].matchingSelectors);
362
+ }
363
+
364
+ const isHighlightPseudoCascade = cssMetadata().isHighlightPseudoType(inheritedEntryPayload.pseudoType);
365
+ const nodeCascade = new NodeCascade(
366
+ this, pseudoStyles, true /* #isInherited */, isHighlightPseudoCascade /* #isHighlightPseudoCascade*/);
367
+ const cascadeListForPseudoType = pseudoCascades.get(inheritedEntryPayload.pseudoType);
368
+ if (cascadeListForPseudoType) {
369
+ cascadeListForPseudoType.push(nodeCascade);
370
+ } else {
371
+ pseudoCascades.set(inheritedEntryPayload.pseudoType, [nodeCascade]);
372
+ }
265
373
  }
266
374
  }
267
375
 
@@ -275,7 +383,11 @@ export class CSSMatchedStyles {
275
383
  pseudoInheritanceCascades.set(pseudoType, new DOMInheritanceCascade(nodeCascade));
276
384
  }
277
385
 
278
- return pseudoInheritanceCascades;
386
+ for (const [highlightName, nodeCascade] of customHighlightPseudoCascades.entries()) {
387
+ customHighlightPseudoInheritanceCascades.set(highlightName, new DOMInheritanceCascade(nodeCascade));
388
+ }
389
+
390
+ return [pseudoInheritanceCascades, customHighlightPseudoInheritanceCascades];
279
391
  }
280
392
 
281
393
  private addMatchingSelectors(
@@ -405,6 +517,15 @@ export class CSSMatchedStyles {
405
517
  return new Set(this.#pseudoDOMCascades.keys());
406
518
  }
407
519
 
520
+ customHighlightPseudoStyles(highlightName: string): CSSStyleDeclaration[] {
521
+ const domCascade = this.#customHighlightPseudoDOMCascades.get(highlightName);
522
+ return domCascade ? domCascade.styles() : [];
523
+ }
524
+
525
+ customHighlightPseudoNames(): Set<string> {
526
+ return new Set(this.#customHighlightPseudoDOMCascades.keys());
527
+ }
528
+
408
529
  private containsInherited(style: CSSStyleDeclaration): boolean {
409
530
  const properties = style.allProperties();
410
531
  for (let i = 0; i < properties.length; ++i) {
@@ -462,6 +583,10 @@ export class CSSMatchedStyles {
462
583
  for (const domCascade of this.#pseudoDOMCascades.values()) {
463
584
  domCascade.reset();
464
585
  }
586
+
587
+ for (const domCascade of this.#customHighlightPseudoDOMCascades.values()) {
588
+ domCascade.reset();
589
+ }
465
590
  }
466
591
  }
467
592
 
@@ -313,15 +313,8 @@ export class CSSMetadata {
313
313
  }
314
314
 
315
315
  isHighlightPseudoType(pseudoType: Protocol.DOM.PseudoType): boolean {
316
- // TODO(crbug.com/1164461) Currently devtools-frontend groups all custom highlight
317
- // pseudos together in the same pseudo cascade, regardless of highlight name. This means that
318
- // the result of displaying "overloaded" highlight styles as crossed-out can produce
319
- // misleading results, because properties from highlights with one name can be shown as overloaded by
320
- // properties from highlights with another name.
321
- // So until that is fixed, don't include custom highlights among the highlight pseudos
322
- // for which we apply overloaded property annotations.
323
316
  return (
324
- /* pseudoType === Protocol.DOM.PseudoType.Highlight || */ pseudoType === Protocol.DOM.PseudoType.Selection ||
317
+ pseudoType === Protocol.DOM.PseudoType.Highlight || pseudoType === Protocol.DOM.PseudoType.Selection ||
325
318
  pseudoType === Protocol.DOM.PseudoType.TargetText || pseudoType === Protocol.DOM.PseudoType.GrammarError ||
326
319
  pseudoType === Protocol.DOM.PseudoType.SpellingError);
327
320
  }
@@ -273,38 +273,69 @@ export function registerCommands(inspectorBackend) {
273
273
  'Audits.GenericIssueErrorType', {CrossOriginPortalPostMessageError: 'CrossOriginPortalPostMessageError'});
274
274
  inspectorBackend.registerEnum('Audits.DeprecationIssueType', {
275
275
  AuthorizationCoveredByWildcard: 'AuthorizationCoveredByWildcard',
276
+ BatteryStatusInsecureOrigin: 'BatteryStatusInsecureOrigin',
277
+ CanRequestURLHTTPContainingNewline: 'CanRequestURLHTTPContainingNewline',
278
+ ChromeLoadTimesConnectionInfo: 'ChromeLoadTimesConnectionInfo',
279
+ ChromeLoadTimesFirstPaintAfterLoadTime: 'ChromeLoadTimesFirstPaintAfterLoadTime',
280
+ ChromeLoadTimesWasAlternateProtocolAvailable: 'ChromeLoadTimesWasAlternateProtocolAvailable',
276
281
  CookieWithTruncatingChar: 'CookieWithTruncatingChar',
277
282
  CrossOriginAccessBasedOnDocumentDomain: 'CrossOriginAccessBasedOnDocumentDomain',
278
283
  CrossOriginWindowAlert: 'CrossOriginWindowAlert',
279
284
  CrossOriginWindowConfirm: 'CrossOriginWindowConfirm',
285
+ CSSSelectorInternalMediaControlsOverlayCastButton: 'CSSSelectorInternalMediaControlsOverlayCastButton',
286
+ CustomCursorIntersectsViewport: 'CustomCursorIntersectsViewport',
280
287
  DeprecationExample: 'DeprecationExample',
281
288
  DocumentDomainSettingWithoutOriginAgentClusterHeader: 'DocumentDomainSettingWithoutOriginAgentClusterHeader',
289
+ EventPath: 'EventPath',
282
290
  GeolocationInsecureOrigin: 'GeolocationInsecureOrigin',
283
291
  GeolocationInsecureOriginDeprecatedNotRemoved: 'GeolocationInsecureOriginDeprecatedNotRemoved',
284
292
  GetUserMediaInsecureOrigin: 'GetUserMediaInsecureOrigin',
293
+ HostCandidateAttributeGetter: 'HostCandidateAttributeGetter',
294
+ InsecurePrivateNetworkSubresourceRequest: 'InsecurePrivateNetworkSubresourceRequest',
285
295
  LegacyConstraintGoogCpuOveruseDetection: 'LegacyConstraintGoogCpuOveruseDetection',
286
296
  LegacyConstraintGoogIPv6: 'LegacyConstraintGoogIPv6',
287
297
  LegacyConstraintGoogScreencastMinBitrate: 'LegacyConstraintGoogScreencastMinBitrate',
288
298
  LegacyConstraintGoogSuspendBelowMinBitrate: 'LegacyConstraintGoogSuspendBelowMinBitrate',
289
299
  LocalCSSFileExtensionRejected: 'LocalCSSFileExtensionRejected',
300
+ MediaElementAudioSourceNode: 'MediaElementAudioSourceNode',
301
+ MediaSourceAbortRemove: 'MediaSourceAbortRemove',
302
+ MediaSourceDurationTruncatingBuffered: 'MediaSourceDurationTruncatingBuffered',
303
+ NoSysexWebMIDIWithoutPermission: 'NoSysexWebMIDIWithoutPermission',
290
304
  NotificationInsecureOrigin: 'NotificationInsecureOrigin',
305
+ NotificationPermissionRequestedIframe: 'NotificationPermissionRequestedIframe',
291
306
  ObsoleteWebRtcCipherSuite: 'ObsoleteWebRtcCipherSuite',
307
+ PaymentRequestBasicCard: 'PaymentRequestBasicCard',
308
+ PaymentRequestShowWithoutGesture: 'PaymentRequestShowWithoutGesture',
292
309
  PictureSourceSrc: 'PictureSourceSrc',
293
310
  PrefixedCancelAnimationFrame: 'PrefixedCancelAnimationFrame',
294
311
  PrefixedRequestAnimationFrame: 'PrefixedRequestAnimationFrame',
312
+ PrefixedStorageInfo: 'PrefixedStorageInfo',
313
+ PrefixedVideoDisplayingFullscreen: 'PrefixedVideoDisplayingFullscreen',
314
+ PrefixedVideoEnterFullscreen: 'PrefixedVideoEnterFullscreen',
315
+ PrefixedVideoEnterFullScreen: 'PrefixedVideoEnterFullScreen',
316
+ PrefixedVideoExitFullscreen: 'PrefixedVideoExitFullscreen',
317
+ PrefixedVideoExitFullScreen: 'PrefixedVideoExitFullScreen',
318
+ PrefixedVideoSupportsFullscreen: 'PrefixedVideoSupportsFullscreen',
319
+ RangeExpand: 'RangeExpand',
320
+ RequestedSubresourceWithEmbeddedCredentials: 'RequestedSubresourceWithEmbeddedCredentials',
295
321
  RTCConstraintEnableDtlsSrtpFalse: 'RTCConstraintEnableDtlsSrtpFalse',
296
322
  RTCConstraintEnableDtlsSrtpTrue: 'RTCConstraintEnableDtlsSrtpTrue',
297
323
  RTCPeerConnectionComplexPlanBSdpUsingDefaultSdpSemantics:
298
324
  'RTCPeerConnectionComplexPlanBSdpUsingDefaultSdpSemantics',
299
325
  RTCPeerConnectionLegacyCreateWithMediaConstraints: 'RTCPeerConnectionLegacyCreateWithMediaConstraints',
326
+ RTCPeerConnectionSdpSemanticsPlanB: 'RTCPeerConnectionSdpSemanticsPlanB',
327
+ RtcpMuxPolicyNegotiate: 'RtcpMuxPolicyNegotiate',
300
328
  RTPDataChannel: 'RTPDataChannel',
329
+ SelectionAddRangeIntersect: 'SelectionAddRangeIntersect',
301
330
  SharedArrayBufferConstructedWithoutIsolation: 'SharedArrayBufferConstructedWithoutIsolation',
331
+ TextToSpeech_DisallowedByAutoplay: 'TextToSpeech_DisallowedByAutoplay',
302
332
  Untranslated: 'Untranslated',
303
333
  V8SharedArrayBufferConstructedInExtensionWithoutIsolation:
304
334
  'V8SharedArrayBufferConstructedInExtensionWithoutIsolation',
305
335
  WebCodecsVideoFrameDefaultTimestamp: 'WebCodecsVideoFrameDefaultTimestamp',
306
336
  XHRJSONEncodingDetection: 'XHRJSONEncodingDetection',
307
- XMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload: 'XMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload'
337
+ XMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload: 'XMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload',
338
+ XRSupportsSession: 'XRSupportsSession'
308
339
  });
309
340
  inspectorBackend.registerEnum(
310
341
  'Audits.ClientHintIssueReason',
@@ -2103,6 +2134,7 @@ export function registerCommands(inspectorBackend) {
2103
2134
  InterestCohort: 'interest-cohort',
2104
2135
  JoinAdInterestGroup: 'join-ad-interest-group',
2105
2136
  KeyboardMap: 'keyboard-map',
2137
+ LocalFonts: 'local-fonts',
2106
2138
  Magnetometer: 'magnetometer',
2107
2139
  Microphone: 'microphone',
2108
2140
  Midi: 'midi',
@@ -2450,7 +2482,6 @@ export function registerCommands(inspectorBackend) {
2450
2482
  {'name': 'marginLeft', 'type': 'number', 'optional': true},
2451
2483
  {'name': 'marginRight', 'type': 'number', 'optional': true},
2452
2484
  {'name': 'pageRanges', 'type': 'string', 'optional': true},
2453
- {'name': 'ignoreInvalidPageRanges', 'type': 'boolean', 'optional': true},
2454
2485
  {'name': 'headerTemplate', 'type': 'string', 'optional': true},
2455
2486
  {'name': 'footerTemplate', 'type': 'string', 'optional': true},
2456
2487
  {'name': 'preferCSSPageSize', 'type': 'boolean', 'optional': true},