chrome-devtools-frontend 1.0.1593518 → 1.0.1595090

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 (111) hide show
  1. package/docs/contributing/settings-experiments-features.md +93 -98
  2. package/front_end/core/common/README.md +126 -0
  3. package/front_end/core/host/UserMetrics.ts +1 -2
  4. package/front_end/core/protocol_client/InspectorBackend.ts +4 -0
  5. package/front_end/core/root/ExperimentNames.ts +0 -1
  6. package/front_end/core/sdk/CSSModel.ts +22 -0
  7. package/front_end/core/sdk/CSSNavigation.ts +33 -0
  8. package/front_end/core/sdk/CSSRule.ts +12 -2
  9. package/front_end/core/sdk/EmulationModel.ts +41 -1
  10. package/front_end/core/sdk/sdk-meta.ts +22 -18
  11. package/front_end/core/sdk/sdk.ts +2 -0
  12. package/front_end/design_system_tokens.css +538 -259
  13. package/front_end/entrypoints/main/MainImpl.ts +0 -6
  14. package/front_end/entrypoints/main/main-meta.ts +2 -2
  15. package/front_end/generated/InspectorBackendCommands.ts +6 -4
  16. package/front_end/generated/SupportedCSSProperties.js +12 -0
  17. package/front_end/generated/protocol-mapping.d.ts +7 -0
  18. package/front_end/generated/protocol-proxy-api.d.ts +5 -0
  19. package/front_end/generated/protocol.ts +47 -0
  20. package/front_end/models/ai_code_completion/AiCodeCompletion.ts +1 -0
  21. package/front_end/models/emulation/DeviceModeModel.ts +47 -0
  22. package/front_end/models/issues_manager/Issue.ts +1 -0
  23. package/front_end/models/issues_manager/IssueAggregator.ts +9 -9
  24. package/front_end/models/issues_manager/IssuesManager.ts +5 -5
  25. package/front_end/models/issues_manager/SelectivePermissionsInterventionIssue.ts +65 -0
  26. package/front_end/models/issues_manager/descriptions/selectivePermissionsIntervention.md +7 -0
  27. package/front_end/models/issues_manager/issues_manager.ts +2 -4
  28. package/front_end/models/javascript_metadata/NativeFunctions.js +48 -9
  29. package/front_end/models/lighthouse/lighthouse.ts +9 -0
  30. package/front_end/models/persistence/persistence-meta.ts +4 -4
  31. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +12 -1
  32. package/front_end/panels/ai_assistance/components/ChatInput.ts +37 -30
  33. package/front_end/panels/ai_assistance/components/ChatView.ts +4 -2
  34. package/front_end/panels/ai_assistance/components/chatInput.css +26 -1
  35. package/front_end/panels/application/StorageView.ts +8 -2
  36. package/front_end/panels/application/preloading/PreloadingView.ts +105 -7
  37. package/front_end/panels/application/preloading/preloadingView.css +4 -0
  38. package/front_end/panels/common/AiCodeCompletionDisclaimer.ts +3 -0
  39. package/front_end/panels/common/AiCodeGenerationTeaser.ts +3 -0
  40. package/front_end/panels/console/ConsoleView.ts +2 -2
  41. package/front_end/panels/console/console-meta.ts +18 -14
  42. package/front_end/panels/elements/ComputedStyleWidget.ts +12 -7
  43. package/front_end/panels/elements/ElementsPanel.ts +1 -1
  44. package/front_end/panels/elements/ElementsTreeOutline.ts +4 -6
  45. package/front_end/panels/elements/ImagePreviewPopover.ts +6 -9
  46. package/front_end/panels/elements/StylePropertiesSection.ts +30 -0
  47. package/front_end/panels/elements/StylesAiCodeCompletionProvider.ts +1 -6
  48. package/front_end/panels/elements/StylesSidebarPane.ts +92 -7
  49. package/front_end/panels/elements/elements-meta.ts +12 -8
  50. package/front_end/panels/emulation/DeviceModeToolbar.ts +206 -66
  51. package/front_end/panels/issues/AffectedSelectivePermissionsInterventionView.ts +120 -0
  52. package/front_end/panels/issues/HiddenIssuesRow.ts +1 -1
  53. package/front_end/panels/issues/IssueKindView.ts +2 -1
  54. package/front_end/panels/issues/IssueView.ts +4 -4
  55. package/front_end/panels/issues/IssuesPane.ts +8 -2
  56. package/front_end/panels/issues/issues.ts +2 -0
  57. package/front_end/panels/lighthouse/LighthouseController.ts +3 -3
  58. package/front_end/panels/lighthouse/LighthousePanel.ts +9 -5
  59. package/front_end/panels/lighthouse/LighthouseProtocolService.ts +5 -5
  60. package/front_end/panels/lighthouse/LighthouseReportRenderer.ts +6 -7
  61. package/front_end/panels/lighthouse/LighthouseReportSelector.ts +4 -3
  62. package/front_end/panels/lighthouse/LighthouseStartView.ts +99 -38
  63. package/front_end/panels/lighthouse/LighthouseTimespanView.ts +53 -14
  64. package/front_end/panels/lighthouse/RadioSetting.ts +33 -19
  65. package/front_end/panels/lighthouse/lighthouse.ts +2 -2
  66. package/front_end/panels/media/PlayerMessagesView.ts +62 -49
  67. package/front_end/panels/media/media.ts +2 -0
  68. package/front_end/panels/media/playerMessagesView.css +1 -1
  69. package/front_end/panels/profiler/HeapSnapshotGridNodes.ts +49 -24
  70. package/front_end/panels/settings/FrameworkIgnoreListSettingsTab.ts +2 -2
  71. package/front_end/panels/sources/sources-meta.ts +8 -4
  72. package/front_end/panels/utils/utils.ts +11 -5
  73. package/front_end/third_party/chromium/README.chromium +1 -1
  74. package/front_end/third_party/lit/lib/async-directive.d.ts +465 -0
  75. package/front_end/third_party/lit/lib/async-directive.js +23 -0
  76. package/front_end/third_party/lit/lib/async-directive.js.map +1 -0
  77. package/front_end/third_party/lit/lib/decorators.d.ts +7 -1
  78. package/front_end/third_party/lit/lib/decorators.js +2 -2
  79. package/front_end/third_party/lit/lib/decorators.js.map +1 -1
  80. package/front_end/third_party/lit/lib/directive.js.map +1 -1
  81. package/front_end/third_party/lit/lib/directives.d.ts +27 -8
  82. package/front_end/third_party/lit/lib/directives.js +8 -8
  83. package/front_end/third_party/lit/lib/directives.js.map +1 -1
  84. package/front_end/third_party/lit/lib/lit.d.ts +15 -5
  85. package/front_end/third_party/lit/lib/lit.js +4 -4
  86. package/front_end/third_party/lit/lib/lit.js.map +1 -1
  87. package/front_end/third_party/lit/lib/static-html.js +2 -2
  88. package/front_end/third_party/lit/lib/static-html.js.map +1 -1
  89. package/front_end/third_party/lit/lit.ts +2 -1
  90. package/front_end/third_party/lit/rollup.config.mjs +1 -1
  91. package/front_end/third_party/source-map-scopes-codec/package/deno.json +1 -1
  92. package/front_end/third_party/source-map-scopes-codec/package/package.json +1 -1
  93. package/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js +1 -1
  94. package/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js.map +1 -1
  95. package/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.ts +1 -1
  96. package/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js +1 -1
  97. package/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js.map +1 -1
  98. package/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.ts +2 -2
  99. package/front_end/ui/components/markdown_view/MarkdownLinksMap.ts +5 -0
  100. package/front_end/ui/legacy/SuggestBox.ts +4 -0
  101. package/front_end/ui/legacy/TextPrompt.ts +1 -1
  102. package/front_end/ui/legacy/components/utils/ImagePreview.ts +27 -23
  103. package/front_end/ui/lit/lit.ts +1 -0
  104. package/front_end/ui/visual_logging/Debugging.ts +1 -1
  105. package/front_end/ui/visual_logging/KnownContextValues.ts +19 -0
  106. package/inspector_overlay/highlight_grid_common.ts +11 -8
  107. package/package.json +1 -1
  108. package/front_end/models/issues_manager/ContrastCheckTrigger.ts +0 -78
  109. package/front_end/models/issues_manager/LowTextContrastIssue.ts +0 -63
  110. package/front_end/panels/issues/AffectedElementsWithLowContrastView.ts +0 -91
  111. /package/front_end/{panels → models}/lighthouse/LighthouseReporterTypes.ts +0 -0
@@ -399,11 +399,6 @@ export class MainImpl {
399
399
  Root.ExperimentNames.ExperimentName.FONT_EDITOR, 'New font editor in the Styles tab',
400
400
  'https://developer.chrome.com/blog/new-in-devtools-89/#font');
401
401
 
402
- // Contrast issues reported via the Issues panel.
403
- Root.Runtime.experiments.register(
404
- Root.ExperimentNames.ExperimentName.CONTRAST_ISSUES, 'Automatic contrast issue reporting via the Issues panel',
405
- 'https://developer.chrome.com/blog/new-in-devtools-90/#low-contrast');
406
-
407
402
  // New cookie features.
408
403
  Root.Runtime.experiments.register(
409
404
  Root.ExperimentNames.ExperimentName.EXPERIMENTAL_COOKIE_FEATURES, 'Experimental cookie features');
@@ -506,7 +501,6 @@ export class MainImpl {
506
501
  showThirdPartyIssuesSetting: IssuesManager.Issue.getShowThirdPartyIssuesSetting(),
507
502
  hideIssueSetting: IssuesManager.IssuesManager.getHideIssueByCodeSetting(),
508
503
  });
509
- IssuesManager.ContrastCheckTrigger.ContrastCheckTrigger.instance();
510
504
 
511
505
  UI.DockController.DockController.instance({forceNew: true, canDock});
512
506
  SDK.DOMDebuggerModel.DOMDebuggerManager.instance({forceNew: true});
@@ -135,11 +135,11 @@ const UIStrings = {
135
135
  /**
136
136
  * @description Title of a setting under the Appearance category in Settings
137
137
  */
138
- enableCtrlShortcutToSwitchPanels: 'Enable Ctrl + 1-9 shortcut to switch panels',
138
+ enableCtrlShortcutToSwitchPanels: 'Use Ctrl + 1-9 to switch panels',
139
139
  /**
140
140
  * @description (Mac only) Title of a setting under the Appearance category in Settings
141
141
  */
142
- enableShortcutToSwitchPanels: 'Enable ⌘ + 1-9 shortcut to switch panels',
142
+ enableShortcutToSwitchPanels: 'Use ⌘ + 1-9 to switch panels',
143
143
  /**
144
144
  * @description A drop-down menu option to dock to right
145
145
  */
@@ -83,7 +83,7 @@ inspectorBackend.registerEnum("Audits.SharedDictionaryError", {UseErrorCrossOrig
83
83
  inspectorBackend.registerEnum("Audits.SRIMessageSignatureError", {MissingSignatureHeader: "MissingSignatureHeader", MissingSignatureInputHeader: "MissingSignatureInputHeader", InvalidSignatureHeader: "InvalidSignatureHeader", InvalidSignatureInputHeader: "InvalidSignatureInputHeader", SignatureHeaderValueIsNotByteSequence: "SignatureHeaderValueIsNotByteSequence", SignatureHeaderValueIsParameterized: "SignatureHeaderValueIsParameterized", SignatureHeaderValueIsIncorrectLength: "SignatureHeaderValueIsIncorrectLength", SignatureInputHeaderMissingLabel: "SignatureInputHeaderMissingLabel", SignatureInputHeaderValueNotInnerList: "SignatureInputHeaderValueNotInnerList", SignatureInputHeaderValueMissingComponents: "SignatureInputHeaderValueMissingComponents", SignatureInputHeaderInvalidComponentType: "SignatureInputHeaderInvalidComponentType", SignatureInputHeaderInvalidComponentName: "SignatureInputHeaderInvalidComponentName", SignatureInputHeaderInvalidHeaderComponentParameter: "SignatureInputHeaderInvalidHeaderComponentParameter", SignatureInputHeaderInvalidDerivedComponentParameter: "SignatureInputHeaderInvalidDerivedComponentParameter", SignatureInputHeaderKeyIdLength: "SignatureInputHeaderKeyIdLength", SignatureInputHeaderInvalidParameter: "SignatureInputHeaderInvalidParameter", SignatureInputHeaderMissingRequiredParameters: "SignatureInputHeaderMissingRequiredParameters", ValidationFailedSignatureExpired: "ValidationFailedSignatureExpired", ValidationFailedInvalidLength: "ValidationFailedInvalidLength", ValidationFailedSignatureMismatch: "ValidationFailedSignatureMismatch", ValidationFailedIntegrityMismatch: "ValidationFailedIntegrityMismatch"});
84
84
  inspectorBackend.registerEnum("Audits.UnencodedDigestError", {MalformedDictionary: "MalformedDictionary", UnknownAlgorithm: "UnknownAlgorithm", IncorrectDigestType: "IncorrectDigestType", IncorrectDigestLength: "IncorrectDigestLength"});
85
85
  inspectorBackend.registerEnum("Audits.ConnectionAllowlistError", {InvalidHeader: "InvalidHeader", MoreThanOneList: "MoreThanOneList", ItemNotInnerList: "ItemNotInnerList", InvalidAllowlistItemType: "InvalidAllowlistItemType", ReportingEndpointNotToken: "ReportingEndpointNotToken", InvalidUrlPattern: "InvalidUrlPattern"});
86
- inspectorBackend.registerEnum("Audits.GenericIssueErrorType", {FormLabelForNameError: "FormLabelForNameError", FormDuplicateIdForInputError: "FormDuplicateIdForInputError", FormInputWithNoLabelError: "FormInputWithNoLabelError", FormAutocompleteAttributeEmptyError: "FormAutocompleteAttributeEmptyError", FormEmptyIdAndNameAttributesForInputError: "FormEmptyIdAndNameAttributesForInputError", FormAriaLabelledByToNonExistingIdError: "FormAriaLabelledByToNonExistingIdError", FormInputAssignedAutocompleteValueToIdOrNameAttributeError: "FormInputAssignedAutocompleteValueToIdOrNameAttributeError", FormLabelHasNeitherForNorNestedInputError: "FormLabelHasNeitherForNorNestedInputError", FormLabelForMatchesNonExistingIdError: "FormLabelForMatchesNonExistingIdError", FormInputHasWrongButWellIntendedAutocompleteValueError: "FormInputHasWrongButWellIntendedAutocompleteValueError", ResponseWasBlockedByORB: "ResponseWasBlockedByORB", NavigationEntryMarkedSkippable: "NavigationEntryMarkedSkippable", AutofillAndManualTextPolicyControlledFeaturesInfo: "AutofillAndManualTextPolicyControlledFeaturesInfo", AutofillPolicyControlledFeatureInfo: "AutofillPolicyControlledFeatureInfo", ManualTextPolicyControlledFeatureInfo: "ManualTextPolicyControlledFeatureInfo"});
86
+ inspectorBackend.registerEnum("Audits.GenericIssueErrorType", {FormLabelForNameError: "FormLabelForNameError", FormDuplicateIdForInputError: "FormDuplicateIdForInputError", FormInputWithNoLabelError: "FormInputWithNoLabelError", FormAutocompleteAttributeEmptyError: "FormAutocompleteAttributeEmptyError", FormEmptyIdAndNameAttributesForInputError: "FormEmptyIdAndNameAttributesForInputError", FormAriaLabelledByToNonExistingIdError: "FormAriaLabelledByToNonExistingIdError", FormInputAssignedAutocompleteValueToIdOrNameAttributeError: "FormInputAssignedAutocompleteValueToIdOrNameAttributeError", FormLabelHasNeitherForNorNestedInputError: "FormLabelHasNeitherForNorNestedInputError", FormLabelForMatchesNonExistingIdError: "FormLabelForMatchesNonExistingIdError", FormInputHasWrongButWellIntendedAutocompleteValueError: "FormInputHasWrongButWellIntendedAutocompleteValueError", ResponseWasBlockedByORB: "ResponseWasBlockedByORB", NavigationEntryMarkedSkippable: "NavigationEntryMarkedSkippable", AutofillAndManualTextPolicyControlledFeaturesInfo: "AutofillAndManualTextPolicyControlledFeaturesInfo", AutofillPolicyControlledFeatureInfo: "AutofillPolicyControlledFeatureInfo", ManualTextPolicyControlledFeatureInfo: "ManualTextPolicyControlledFeatureInfo", FormModelContextParameterMissingTitleAndDescription: "FormModelContextParameterMissingTitleAndDescription"});
87
87
  inspectorBackend.registerEnum("Audits.ClientHintIssueReason", {MetaTagAllowListInvalidOrigin: "MetaTagAllowListInvalidOrigin", MetaTagModifiedHTML: "MetaTagModifiedHTML"});
88
88
  inspectorBackend.registerEnum("Audits.FederatedAuthRequestIssueReason", {ShouldEmbargo: "ShouldEmbargo", TooManyRequests: "TooManyRequests", WellKnownHttpNotFound: "WellKnownHttpNotFound", WellKnownNoResponse: "WellKnownNoResponse", WellKnownInvalidResponse: "WellKnownInvalidResponse", WellKnownListEmpty: "WellKnownListEmpty", WellKnownInvalidContentType: "WellKnownInvalidContentType", ConfigNotInWellKnown: "ConfigNotInWellKnown", WellKnownTooBig: "WellKnownTooBig", ConfigHttpNotFound: "ConfigHttpNotFound", ConfigNoResponse: "ConfigNoResponse", ConfigInvalidResponse: "ConfigInvalidResponse", ConfigInvalidContentType: "ConfigInvalidContentType", IdpNotPotentiallyTrustworthy: "IdpNotPotentiallyTrustworthy", DisabledInSettings: "DisabledInSettings", DisabledInFlags: "DisabledInFlags", ErrorFetchingSignin: "ErrorFetchingSignin", InvalidSigninResponse: "InvalidSigninResponse", AccountsHttpNotFound: "AccountsHttpNotFound", AccountsNoResponse: "AccountsNoResponse", AccountsInvalidResponse: "AccountsInvalidResponse", AccountsListEmpty: "AccountsListEmpty", AccountsInvalidContentType: "AccountsInvalidContentType", IdTokenHttpNotFound: "IdTokenHttpNotFound", IdTokenNoResponse: "IdTokenNoResponse", IdTokenInvalidResponse: "IdTokenInvalidResponse", IdTokenIdpErrorResponse: "IdTokenIdpErrorResponse", IdTokenCrossSiteIdpErrorResponse: "IdTokenCrossSiteIdpErrorResponse", IdTokenInvalidRequest: "IdTokenInvalidRequest", IdTokenInvalidContentType: "IdTokenInvalidContentType", ErrorIdToken: "ErrorIdToken", Canceled: "Canceled", RpPageNotVisible: "RpPageNotVisible", SilentMediationFailure: "SilentMediationFailure", NotSignedInWithIdp: "NotSignedInWithIdp", MissingTransientUserActivation: "MissingTransientUserActivation", ReplacedByActiveMode: "ReplacedByActiveMode", RelyingPartyOriginIsOpaque: "RelyingPartyOriginIsOpaque", TypeNotMatching: "TypeNotMatching", UiDismissedNoEmbargo: "UiDismissedNoEmbargo", CorsError: "CorsError", SuppressedBySegmentationPlatform: "SuppressedBySegmentationPlatform"});
89
89
  inspectorBackend.registerEnum("Audits.FederatedAuthUserInfoRequestIssueReason", {NotSameOrigin: "NotSameOrigin", NotIframe: "NotIframe", NotPotentiallyTrustworthy: "NotPotentiallyTrustworthy", NoAPIPermission: "NoApiPermission", NotSignedInWithIdp: "NotSignedInWithIdp", NoAccountSharingPermission: "NoAccountSharingPermission", InvalidConfigOrWellKnown: "InvalidConfigOrWellKnown", InvalidAccountsResponse: "InvalidAccountsResponse", NoReturningUserFromFetchedAccounts: "NoReturningUserFromFetchedAccounts"});
@@ -233,7 +233,7 @@ inspectorBackend.registerType("Browser.Histogram", [{"name": "name", "type": "st
233
233
 
234
234
  // CSS.
235
235
  inspectorBackend.registerEnum("CSS.StyleSheetOrigin", {Injected: "injected", UserAgent: "user-agent", Inspector: "inspector", Regular: "regular"});
236
- inspectorBackend.registerEnum("CSS.CSSRuleType", {MediaRule: "MediaRule", SupportsRule: "SupportsRule", ContainerRule: "ContainerRule", LayerRule: "LayerRule", ScopeRule: "ScopeRule", StyleRule: "StyleRule", StartingStyleRule: "StartingStyleRule"});
236
+ inspectorBackend.registerEnum("CSS.CSSRuleType", {MediaRule: "MediaRule", SupportsRule: "SupportsRule", ContainerRule: "ContainerRule", LayerRule: "LayerRule", ScopeRule: "ScopeRule", StyleRule: "StyleRule", StartingStyleRule: "StartingStyleRule", NavigationRule: "NavigationRule"});
237
237
  inspectorBackend.registerEnum("CSS.CSSMediaSource", {MediaRule: "mediaRule", ImportRule: "importRule", LinkedSheet: "linkedSheet", InlineSheet: "inlineSheet"});
238
238
  inspectorBackend.registerEnum("CSS.CSSAtRuleType", {FontFace: "font-face", FontFeatureValues: "font-feature-values", FontPaletteValues: "font-palette-values"});
239
239
  inspectorBackend.registerEnum("CSS.CSSAtRuleSubsection", {Swash: "swash", Annotation: "annotation", Ornaments: "ornaments", Stylistic: "stylistic", Styleset: "styleset", CharacterVariant: "character-variant"});
@@ -272,6 +272,7 @@ inspectorBackend.registerCommand("CSS.setKeyframeKey", [{"name": "styleSheetId",
272
272
  inspectorBackend.registerCommand("CSS.setMediaText", [{"name": "styleSheetId", "type": "string", "optional": false, "description": "", "typeRef": "DOM.StyleSheetId"}, {"name": "range", "type": "object", "optional": false, "description": "", "typeRef": "CSS.SourceRange"}, {"name": "text", "type": "string", "optional": false, "description": "", "typeRef": null}], ["media"], "Modifies the rule selector.");
273
273
  inspectorBackend.registerCommand("CSS.setContainerQueryText", [{"name": "styleSheetId", "type": "string", "optional": false, "description": "", "typeRef": "DOM.StyleSheetId"}, {"name": "range", "type": "object", "optional": false, "description": "", "typeRef": "CSS.SourceRange"}, {"name": "text", "type": "string", "optional": false, "description": "", "typeRef": null}], ["containerQuery"], "Modifies the expression of a container query.");
274
274
  inspectorBackend.registerCommand("CSS.setSupportsText", [{"name": "styleSheetId", "type": "string", "optional": false, "description": "", "typeRef": "DOM.StyleSheetId"}, {"name": "range", "type": "object", "optional": false, "description": "", "typeRef": "CSS.SourceRange"}, {"name": "text", "type": "string", "optional": false, "description": "", "typeRef": null}], ["supports"], "Modifies the expression of a supports at-rule.");
275
+ inspectorBackend.registerCommand("CSS.setNavigationText", [{"name": "styleSheetId", "type": "string", "optional": false, "description": "", "typeRef": "DOM.StyleSheetId"}, {"name": "range", "type": "object", "optional": false, "description": "", "typeRef": "CSS.SourceRange"}, {"name": "text", "type": "string", "optional": false, "description": "", "typeRef": null}], ["navigation"], "Modifies the expression of a navigation at-rule.");
275
276
  inspectorBackend.registerCommand("CSS.setScopeText", [{"name": "styleSheetId", "type": "string", "optional": false, "description": "", "typeRef": "DOM.StyleSheetId"}, {"name": "range", "type": "object", "optional": false, "description": "", "typeRef": "CSS.SourceRange"}, {"name": "text", "type": "string", "optional": false, "description": "", "typeRef": null}], ["scope"], "Modifies the expression of a scope at-rule.");
276
277
  inspectorBackend.registerCommand("CSS.setRuleSelector", [{"name": "styleSheetId", "type": "string", "optional": false, "description": "", "typeRef": "DOM.StyleSheetId"}, {"name": "range", "type": "object", "optional": false, "description": "", "typeRef": "CSS.SourceRange"}, {"name": "selector", "type": "string", "optional": false, "description": "", "typeRef": null}], ["selectorList"], "Modifies the rule selector.");
277
278
  inspectorBackend.registerCommand("CSS.setStyleSheetText", [{"name": "styleSheetId", "type": "string", "optional": false, "description": "", "typeRef": "DOM.StyleSheetId"}, {"name": "text", "type": "string", "optional": false, "description": "", "typeRef": null}], ["sourceMapURL"], "Sets the new stylesheet text.");
@@ -290,7 +291,7 @@ inspectorBackend.registerType("CSS.Value", [{"name": "text", "type": "string", "
290
291
  inspectorBackend.registerType("CSS.Specificity", [{"name": "a", "type": "number", "optional": false, "description": "The a component, which represents the number of ID selectors.", "typeRef": null}, {"name": "b", "type": "number", "optional": false, "description": "The b component, which represents the number of class selectors, attributes selectors, and pseudo-classes.", "typeRef": null}, {"name": "c", "type": "number", "optional": false, "description": "The c component, which represents the number of type selectors and pseudo-elements.", "typeRef": null}]);
291
292
  inspectorBackend.registerType("CSS.SelectorList", [{"name": "selectors", "type": "array", "optional": false, "description": "Selectors in the list.", "typeRef": "CSS.Value"}, {"name": "text", "type": "string", "optional": false, "description": "Rule selector text.", "typeRef": null}]);
292
293
  inspectorBackend.registerType("CSS.CSSStyleSheetHeader", [{"name": "styleSheetId", "type": "string", "optional": false, "description": "The stylesheet identifier.", "typeRef": "DOM.StyleSheetId"}, {"name": "frameId", "type": "string", "optional": false, "description": "Owner frame identifier.", "typeRef": "Page.FrameId"}, {"name": "sourceURL", "type": "string", "optional": false, "description": "Stylesheet resource URL. Empty if this is a constructed stylesheet created using new CSSStyleSheet() (but non-empty if this is a constructed stylesheet imported as a CSS module script).", "typeRef": null}, {"name": "sourceMapURL", "type": "string", "optional": true, "description": "URL of source map associated with the stylesheet (if any).", "typeRef": null}, {"name": "origin", "type": "string", "optional": false, "description": "Stylesheet origin.", "typeRef": "CSS.StyleSheetOrigin"}, {"name": "title", "type": "string", "optional": false, "description": "Stylesheet title.", "typeRef": null}, {"name": "ownerNode", "type": "number", "optional": true, "description": "The backend id for the owner node of the stylesheet.", "typeRef": "DOM.BackendNodeId"}, {"name": "disabled", "type": "boolean", "optional": false, "description": "Denotes whether the stylesheet is disabled.", "typeRef": null}, {"name": "hasSourceURL", "type": "boolean", "optional": true, "description": "Whether the sourceURL field value comes from the sourceURL comment.", "typeRef": null}, {"name": "isInline", "type": "boolean", "optional": false, "description": "Whether this stylesheet is created for STYLE tag by parser. This flag is not set for document.written STYLE tags.", "typeRef": null}, {"name": "isMutable", "type": "boolean", "optional": false, "description": "Whether this stylesheet is mutable. Inline stylesheets become mutable after they have been modified via CSSOM API. `<link>` element's stylesheets become mutable only if DevTools modifies them. Constructed stylesheets (new CSSStyleSheet()) are mutable immediately after creation.", "typeRef": null}, {"name": "isConstructed", "type": "boolean", "optional": false, "description": "True if this stylesheet is created through new CSSStyleSheet() or imported as a CSS module script.", "typeRef": null}, {"name": "startLine", "type": "number", "optional": false, "description": "Line offset of the stylesheet within the resource (zero based).", "typeRef": null}, {"name": "startColumn", "type": "number", "optional": false, "description": "Column offset of the stylesheet within the resource (zero based).", "typeRef": null}, {"name": "length", "type": "number", "optional": false, "description": "Size of the content (in characters).", "typeRef": null}, {"name": "endLine", "type": "number", "optional": false, "description": "Line offset of the end of the stylesheet within the resource (zero based).", "typeRef": null}, {"name": "endColumn", "type": "number", "optional": false, "description": "Column offset of the end of the stylesheet within the resource (zero based).", "typeRef": null}, {"name": "loadingFailed", "type": "boolean", "optional": true, "description": "If the style sheet was loaded from a network resource, this indicates when the resource failed to load", "typeRef": null}]);
293
- inspectorBackend.registerType("CSS.CSSRule", [{"name": "styleSheetId", "type": "string", "optional": true, "description": "The css style sheet identifier (absent for user agent stylesheet and user-specified stylesheet rules) this rule came from.", "typeRef": "DOM.StyleSheetId"}, {"name": "selectorList", "type": "object", "optional": false, "description": "Rule selector data.", "typeRef": "CSS.SelectorList"}, {"name": "nestingSelectors", "type": "array", "optional": true, "description": "Array of selectors from ancestor style rules, sorted by distance from the current rule.", "typeRef": "string"}, {"name": "origin", "type": "string", "optional": false, "description": "Parent stylesheet's origin.", "typeRef": "CSS.StyleSheetOrigin"}, {"name": "style", "type": "object", "optional": false, "description": "Associated style declaration.", "typeRef": "CSS.CSSStyle"}, {"name": "originTreeScopeNodeId", "type": "number", "optional": true, "description": "The BackendNodeId of the DOM node that constitutes the origin tree scope of this rule.", "typeRef": "DOM.BackendNodeId"}, {"name": "media", "type": "array", "optional": true, "description": "Media list array (for rules involving media queries). The array enumerates media queries starting with the innermost one, going outwards.", "typeRef": "CSS.CSSMedia"}, {"name": "containerQueries", "type": "array", "optional": true, "description": "Container query list array (for rules involving container queries). The array enumerates container queries starting with the innermost one, going outwards.", "typeRef": "CSS.CSSContainerQuery"}, {"name": "supports", "type": "array", "optional": true, "description": "@supports CSS at-rule array. The array enumerates @supports at-rules starting with the innermost one, going outwards.", "typeRef": "CSS.CSSSupports"}, {"name": "layers", "type": "array", "optional": true, "description": "Cascade layer array. Contains the layer hierarchy that this rule belongs to starting with the innermost layer and going outwards.", "typeRef": "CSS.CSSLayer"}, {"name": "scopes", "type": "array", "optional": true, "description": "@scope CSS at-rule array. The array enumerates @scope at-rules starting with the innermost one, going outwards.", "typeRef": "CSS.CSSScope"}, {"name": "ruleTypes", "type": "array", "optional": true, "description": "The array keeps the types of ancestor CSSRules from the innermost going outwards.", "typeRef": "CSS.CSSRuleType"}, {"name": "startingStyles", "type": "array", "optional": true, "description": "@starting-style CSS at-rule array. The array enumerates @starting-style at-rules starting with the innermost one, going outwards.", "typeRef": "CSS.CSSStartingStyle"}]);
294
+ inspectorBackend.registerType("CSS.CSSRule", [{"name": "styleSheetId", "type": "string", "optional": true, "description": "The css style sheet identifier (absent for user agent stylesheet and user-specified stylesheet rules) this rule came from.", "typeRef": "DOM.StyleSheetId"}, {"name": "selectorList", "type": "object", "optional": false, "description": "Rule selector data.", "typeRef": "CSS.SelectorList"}, {"name": "nestingSelectors", "type": "array", "optional": true, "description": "Array of selectors from ancestor style rules, sorted by distance from the current rule.", "typeRef": "string"}, {"name": "origin", "type": "string", "optional": false, "description": "Parent stylesheet's origin.", "typeRef": "CSS.StyleSheetOrigin"}, {"name": "style", "type": "object", "optional": false, "description": "Associated style declaration.", "typeRef": "CSS.CSSStyle"}, {"name": "originTreeScopeNodeId", "type": "number", "optional": true, "description": "The BackendNodeId of the DOM node that constitutes the origin tree scope of this rule.", "typeRef": "DOM.BackendNodeId"}, {"name": "media", "type": "array", "optional": true, "description": "Media list array (for rules involving media queries). The array enumerates media queries starting with the innermost one, going outwards.", "typeRef": "CSS.CSSMedia"}, {"name": "containerQueries", "type": "array", "optional": true, "description": "Container query list array (for rules involving container queries). The array enumerates container queries starting with the innermost one, going outwards.", "typeRef": "CSS.CSSContainerQuery"}, {"name": "supports", "type": "array", "optional": true, "description": "@supports CSS at-rule array. The array enumerates @supports at-rules starting with the innermost one, going outwards.", "typeRef": "CSS.CSSSupports"}, {"name": "layers", "type": "array", "optional": true, "description": "Cascade layer array. Contains the layer hierarchy that this rule belongs to starting with the innermost layer and going outwards.", "typeRef": "CSS.CSSLayer"}, {"name": "scopes", "type": "array", "optional": true, "description": "@scope CSS at-rule array. The array enumerates @scope at-rules starting with the innermost one, going outwards.", "typeRef": "CSS.CSSScope"}, {"name": "ruleTypes", "type": "array", "optional": true, "description": "The array keeps the types of ancestor CSSRules from the innermost going outwards.", "typeRef": "CSS.CSSRuleType"}, {"name": "startingStyles", "type": "array", "optional": true, "description": "@starting-style CSS at-rule array. The array enumerates @starting-style at-rules starting with the innermost one, going outwards.", "typeRef": "CSS.CSSStartingStyle"}, {"name": "navigations", "type": "array", "optional": true, "description": "@navigation CSS at-rule array. The array enumerates @navigation at-rules starting with the innermost one, going outwards.", "typeRef": "CSS.CSSNavigation"}]);
294
295
  inspectorBackend.registerType("CSS.RuleUsage", [{"name": "styleSheetId", "type": "string", "optional": false, "description": "The css style sheet identifier (absent for user agent stylesheet and user-specified stylesheet rules) this rule came from.", "typeRef": "DOM.StyleSheetId"}, {"name": "startOffset", "type": "number", "optional": false, "description": "Offset of the start of the rule (including selector) from the beginning of the stylesheet.", "typeRef": null}, {"name": "endOffset", "type": "number", "optional": false, "description": "Offset of the end of the rule body from the beginning of the stylesheet.", "typeRef": null}, {"name": "used", "type": "boolean", "optional": false, "description": "Indicates whether the rule was actually used by some element in the page.", "typeRef": null}]);
295
296
  inspectorBackend.registerType("CSS.SourceRange", [{"name": "startLine", "type": "number", "optional": false, "description": "Start line of range.", "typeRef": null}, {"name": "startColumn", "type": "number", "optional": false, "description": "Start column of range (inclusive).", "typeRef": null}, {"name": "endLine", "type": "number", "optional": false, "description": "End line of range", "typeRef": null}, {"name": "endColumn", "type": "number", "optional": false, "description": "End column of range (exclusive).", "typeRef": null}]);
296
297
  inspectorBackend.registerType("CSS.ShorthandEntry", [{"name": "name", "type": "string", "optional": false, "description": "Shorthand name.", "typeRef": null}, {"name": "value", "type": "string", "optional": false, "description": "Shorthand value.", "typeRef": null}, {"name": "important", "type": "boolean", "optional": true, "description": "Whether the property has \\\"!important\\\" annotation (implies `false` if absent).", "typeRef": null}]);
@@ -303,6 +304,7 @@ inspectorBackend.registerType("CSS.MediaQuery", [{"name": "expressions", "type":
303
304
  inspectorBackend.registerType("CSS.MediaQueryExpression", [{"name": "value", "type": "number", "optional": false, "description": "Media query expression value.", "typeRef": null}, {"name": "unit", "type": "string", "optional": false, "description": "Media query expression units.", "typeRef": null}, {"name": "feature", "type": "string", "optional": false, "description": "Media query expression feature.", "typeRef": null}, {"name": "valueRange", "type": "object", "optional": true, "description": "The associated range of the value text in the enclosing stylesheet (if available).", "typeRef": "CSS.SourceRange"}, {"name": "computedLength", "type": "number", "optional": true, "description": "Computed length of media query expression (if applicable).", "typeRef": null}]);
304
305
  inspectorBackend.registerType("CSS.CSSContainerQuery", [{"name": "text", "type": "string", "optional": false, "description": "Container query text.", "typeRef": null}, {"name": "range", "type": "object", "optional": true, "description": "The associated rule header range in the enclosing stylesheet (if available).", "typeRef": "CSS.SourceRange"}, {"name": "styleSheetId", "type": "string", "optional": true, "description": "Identifier of the stylesheet containing this object (if exists).", "typeRef": "DOM.StyleSheetId"}, {"name": "name", "type": "string", "optional": true, "description": "Optional name for the container.", "typeRef": null}, {"name": "physicalAxes", "type": "string", "optional": true, "description": "Optional physical axes queried for the container.", "typeRef": "DOM.PhysicalAxes"}, {"name": "logicalAxes", "type": "string", "optional": true, "description": "Optional logical axes queried for the container.", "typeRef": "DOM.LogicalAxes"}, {"name": "queriesScrollState", "type": "boolean", "optional": true, "description": "true if the query contains scroll-state() queries.", "typeRef": null}, {"name": "queriesAnchored", "type": "boolean", "optional": true, "description": "true if the query contains anchored() queries.", "typeRef": null}]);
305
306
  inspectorBackend.registerType("CSS.CSSSupports", [{"name": "text", "type": "string", "optional": false, "description": "Supports rule text.", "typeRef": null}, {"name": "active", "type": "boolean", "optional": false, "description": "Whether the supports condition is satisfied.", "typeRef": null}, {"name": "range", "type": "object", "optional": true, "description": "The associated rule header range in the enclosing stylesheet (if available).", "typeRef": "CSS.SourceRange"}, {"name": "styleSheetId", "type": "string", "optional": true, "description": "Identifier of the stylesheet containing this object (if exists).", "typeRef": "DOM.StyleSheetId"}]);
307
+ inspectorBackend.registerType("CSS.CSSNavigation", [{"name": "text", "type": "string", "optional": false, "description": "Navigation rule text.", "typeRef": null}, {"name": "active", "type": "boolean", "optional": true, "description": "Whether the navigation condition is satisfied.", "typeRef": null}, {"name": "range", "type": "object", "optional": true, "description": "The associated rule header range in the enclosing stylesheet (if available).", "typeRef": "CSS.SourceRange"}, {"name": "styleSheetId", "type": "string", "optional": true, "description": "Identifier of the stylesheet containing this object (if exists).", "typeRef": "DOM.StyleSheetId"}]);
306
308
  inspectorBackend.registerType("CSS.CSSScope", [{"name": "text", "type": "string", "optional": false, "description": "Scope rule text.", "typeRef": null}, {"name": "range", "type": "object", "optional": true, "description": "The associated rule header range in the enclosing stylesheet (if available).", "typeRef": "CSS.SourceRange"}, {"name": "styleSheetId", "type": "string", "optional": true, "description": "Identifier of the stylesheet containing this object (if exists).", "typeRef": "DOM.StyleSheetId"}]);
307
309
  inspectorBackend.registerType("CSS.CSSLayer", [{"name": "text", "type": "string", "optional": false, "description": "Layer name.", "typeRef": null}, {"name": "range", "type": "object", "optional": true, "description": "The associated rule header range in the enclosing stylesheet (if available).", "typeRef": "CSS.SourceRange"}, {"name": "styleSheetId", "type": "string", "optional": true, "description": "Identifier of the stylesheet containing this object (if exists).", "typeRef": "DOM.StyleSheetId"}]);
308
310
  inspectorBackend.registerType("CSS.CSSStartingStyle", [{"name": "range", "type": "object", "optional": true, "description": "The associated rule header range in the enclosing stylesheet (if available).", "typeRef": "CSS.SourceRange"}, {"name": "styleSheetId", "type": "string", "optional": true, "description": "Identifier of the stylesheet containing this object (if exists).", "typeRef": "DOM.StyleSheetId"}]);
@@ -317,7 +319,7 @@ inspectorBackend.registerType("CSS.CSSPropertyRegistration", [{"name": "property
317
319
  inspectorBackend.registerType("CSS.CSSAtRule", [{"name": "type", "type": "string", "optional": false, "description": "Type of at-rule.", "typeRef": null}, {"name": "subsection", "type": "string", "optional": true, "description": "Subsection of font-feature-values, if this is a subsection.", "typeRef": null}, {"name": "name", "type": "object", "optional": true, "description": "LINT_SKIP.ThenChange(//third_party/blink/renderer/core/inspector/inspector_style_sheet.cc:FontVariantAlternatesFeatureType,//third_party/blink/renderer/core/inspector/inspector_css_agent.cc:FontVariantAlternatesFeatureType) Associated name, if applicable.", "typeRef": "CSS.Value"}, {"name": "styleSheetId", "type": "string", "optional": true, "description": "The css style sheet identifier (absent for user agent stylesheet and user-specified stylesheet rules) this rule came from.", "typeRef": "DOM.StyleSheetId"}, {"name": "origin", "type": "string", "optional": false, "description": "Parent stylesheet's origin.", "typeRef": "CSS.StyleSheetOrigin"}, {"name": "style", "type": "object", "optional": false, "description": "Associated style declaration.", "typeRef": "CSS.CSSStyle"}]);
318
320
  inspectorBackend.registerType("CSS.CSSPropertyRule", [{"name": "styleSheetId", "type": "string", "optional": true, "description": "The css style sheet identifier (absent for user agent stylesheet and user-specified stylesheet rules) this rule came from.", "typeRef": "DOM.StyleSheetId"}, {"name": "origin", "type": "string", "optional": false, "description": "Parent stylesheet's origin.", "typeRef": "CSS.StyleSheetOrigin"}, {"name": "propertyName", "type": "object", "optional": false, "description": "Associated property name.", "typeRef": "CSS.Value"}, {"name": "style", "type": "object", "optional": false, "description": "Associated style declaration.", "typeRef": "CSS.CSSStyle"}]);
319
321
  inspectorBackend.registerType("CSS.CSSFunctionParameter", [{"name": "name", "type": "string", "optional": false, "description": "The parameter name.", "typeRef": null}, {"name": "type", "type": "string", "optional": false, "description": "The parameter type.", "typeRef": null}]);
320
- inspectorBackend.registerType("CSS.CSSFunctionConditionNode", [{"name": "media", "type": "object", "optional": true, "description": "Media query for this conditional block. Only one type of condition should be set.", "typeRef": "CSS.CSSMedia"}, {"name": "containerQueries", "type": "object", "optional": true, "description": "Container query for this conditional block. Only one type of condition should be set.", "typeRef": "CSS.CSSContainerQuery"}, {"name": "supports", "type": "object", "optional": true, "description": "@supports CSS at-rule condition. Only one type of condition should be set.", "typeRef": "CSS.CSSSupports"}, {"name": "children", "type": "array", "optional": false, "description": "Block body.", "typeRef": "CSS.CSSFunctionNode"}, {"name": "conditionText", "type": "string", "optional": false, "description": "The condition text.", "typeRef": null}]);
322
+ inspectorBackend.registerType("CSS.CSSFunctionConditionNode", [{"name": "media", "type": "object", "optional": true, "description": "Media query for this conditional block. Only one type of condition should be set.", "typeRef": "CSS.CSSMedia"}, {"name": "containerQueries", "type": "object", "optional": true, "description": "Container query for this conditional block. Only one type of condition should be set.", "typeRef": "CSS.CSSContainerQuery"}, {"name": "supports", "type": "object", "optional": true, "description": "@supports CSS at-rule condition. Only one type of condition should be set.", "typeRef": "CSS.CSSSupports"}, {"name": "navigation", "type": "object", "optional": true, "description": "@navigation condition. Only one type of condition should be set.", "typeRef": "CSS.CSSNavigation"}, {"name": "children", "type": "array", "optional": false, "description": "Block body.", "typeRef": "CSS.CSSFunctionNode"}, {"name": "conditionText", "type": "string", "optional": false, "description": "The condition text.", "typeRef": null}]);
321
323
  inspectorBackend.registerType("CSS.CSSFunctionNode", [{"name": "condition", "type": "object", "optional": true, "description": "A conditional block. If set, style should not be set.", "typeRef": "CSS.CSSFunctionConditionNode"}, {"name": "style", "type": "object", "optional": true, "description": "Values set by this node. If set, condition should not be set.", "typeRef": "CSS.CSSStyle"}]);
322
324
  inspectorBackend.registerType("CSS.CSSFunctionRule", [{"name": "name", "type": "object", "optional": false, "description": "Name of the function.", "typeRef": "CSS.Value"}, {"name": "styleSheetId", "type": "string", "optional": true, "description": "The css style sheet identifier (absent for user agent stylesheet and user-specified stylesheet rules) this rule came from.", "typeRef": "DOM.StyleSheetId"}, {"name": "origin", "type": "string", "optional": false, "description": "Parent stylesheet's origin.", "typeRef": "CSS.StyleSheetOrigin"}, {"name": "parameters", "type": "array", "optional": false, "description": "List of parameters.", "typeRef": "CSS.CSSFunctionParameter"}, {"name": "children", "type": "array", "optional": false, "description": "Function body.", "typeRef": "CSS.CSSFunctionNode"}]);
323
325
  inspectorBackend.registerType("CSS.CSSKeyframeRule", [{"name": "styleSheetId", "type": "string", "optional": true, "description": "The css style sheet identifier (absent for user agent stylesheet and user-specified stylesheet rules) this rule came from.", "typeRef": "DOM.StyleSheetId"}, {"name": "origin", "type": "string", "optional": false, "description": "Parent stylesheet's origin.", "typeRef": "CSS.StyleSheetOrigin"}, {"name": "keyText", "type": "object", "optional": false, "description": "Associated key text.", "typeRef": "CSS.Value"}, {"name": "style", "type": "object", "optional": false, "description": "Associated style declaration.", "typeRef": "CSS.CSSStyle"}]);
@@ -623,6 +623,7 @@ export const generatedProperties = [
623
623
  "page-margin-safety",
624
624
  "page-orientation",
625
625
  "paint-order",
626
+ "path-length",
626
627
  "pathname",
627
628
  "pattern",
628
629
  "perspective",
@@ -3574,6 +3575,12 @@ export const generatedProperties = [
3574
3575
  ],
3575
3576
  "name": "paint-order"
3576
3577
  },
3578
+ {
3579
+ "keywords": [
3580
+ "none"
3581
+ ],
3582
+ "name": "path-length"
3583
+ },
3577
3584
  {
3578
3585
  "name": "pathname"
3579
3586
  },
@@ -6590,6 +6597,11 @@ export const generatedPropertyValues = {
6590
6597
  "markers"
6591
6598
  ]
6592
6599
  },
6600
+ "path-length": {
6601
+ "values": [
6602
+ "none"
6603
+ ]
6604
+ },
6593
6605
  "perspective": {
6594
6606
  "values": [
6595
6607
  "none"
@@ -1737,6 +1737,13 @@ export namespace ProtocolMapping {
1737
1737
  paramsType: [Protocol.CSS.SetSupportsTextRequest];
1738
1738
  returnType: Protocol.CSS.SetSupportsTextResponse;
1739
1739
  };
1740
+ /**
1741
+ * Modifies the expression of a navigation at-rule.
1742
+ */
1743
+ 'CSS.setNavigationText': {
1744
+ paramsType: [Protocol.CSS.SetNavigationTextRequest];
1745
+ returnType: Protocol.CSS.SetNavigationTextResponse;
1746
+ };
1740
1747
  /**
1741
1748
  * Modifies the expression of a scope at-rule.
1742
1749
  */
@@ -886,6 +886,11 @@ declare namespace ProtocolProxyApi {
886
886
  */
887
887
  invoke_setSupportsText(params: Protocol.CSS.SetSupportsTextRequest): Promise<Protocol.CSS.SetSupportsTextResponse>;
888
888
 
889
+ /**
890
+ * Modifies the expression of a navigation at-rule.
891
+ */
892
+ invoke_setNavigationText(params: Protocol.CSS.SetNavigationTextRequest): Promise<Protocol.CSS.SetNavigationTextResponse>;
893
+
889
894
  /**
890
895
  * Modifies the expression of a scope at-rule.
891
896
  */
@@ -1221,6 +1221,7 @@ export namespace Audits {
1221
1221
  AutofillAndManualTextPolicyControlledFeaturesInfo = 'AutofillAndManualTextPolicyControlledFeaturesInfo',
1222
1222
  AutofillPolicyControlledFeatureInfo = 'AutofillPolicyControlledFeatureInfo',
1223
1223
  ManualTextPolicyControlledFeatureInfo = 'ManualTextPolicyControlledFeatureInfo',
1224
+ FormModelContextParameterMissingTitleAndDescription = 'FormModelContextParameterMissingTitleAndDescription',
1224
1225
  }
1225
1226
 
1226
1227
  /**
@@ -3033,6 +3034,11 @@ export namespace CSS {
3033
3034
  * The array enumerates @starting-style at-rules starting with the innermost one, going outwards.
3034
3035
  */
3035
3036
  startingStyles?: CSSStartingStyle[];
3037
+ /**
3038
+ * @navigation CSS at-rule array.
3039
+ * The array enumerates @navigation at-rules starting with the innermost one, going outwards.
3040
+ */
3041
+ navigations?: CSSNavigation[];
3036
3042
  }
3037
3043
 
3038
3044
  /**
@@ -3047,6 +3053,7 @@ export namespace CSS {
3047
3053
  ScopeRule = 'ScopeRule',
3048
3054
  StyleRule = 'StyleRule',
3049
3055
  StartingStyleRule = 'StartingStyleRule',
3056
+ NavigationRule = 'NavigationRule',
3050
3057
  }
3051
3058
 
3052
3059
  /**
@@ -3342,6 +3349,29 @@ export namespace CSS {
3342
3349
  styleSheetId?: DOM.StyleSheetId;
3343
3350
  }
3344
3351
 
3352
+ /**
3353
+ * CSS Navigation at-rule descriptor.
3354
+ */
3355
+ export interface CSSNavigation {
3356
+ /**
3357
+ * Navigation rule text.
3358
+ */
3359
+ text: string;
3360
+ /**
3361
+ * Whether the navigation condition is satisfied.
3362
+ */
3363
+ active?: boolean;
3364
+ /**
3365
+ * The associated rule header range in the enclosing stylesheet (if
3366
+ * available).
3367
+ */
3368
+ range?: SourceRange;
3369
+ /**
3370
+ * Identifier of the stylesheet containing this object (if exists).
3371
+ */
3372
+ styleSheetId?: DOM.StyleSheetId;
3373
+ }
3374
+
3345
3375
  /**
3346
3376
  * CSS Scope at-rule descriptor.
3347
3377
  */
@@ -3676,6 +3706,10 @@ export namespace CSS {
3676
3706
  * @supports CSS at-rule condition. Only one type of condition should be set.
3677
3707
  */
3678
3708
  supports?: CSSSupports;
3709
+ /**
3710
+ * @navigation condition. Only one type of condition should be set.
3711
+ */
3712
+ navigation?: CSSNavigation;
3679
3713
  /**
3680
3714
  * Block body.
3681
3715
  */
@@ -4165,6 +4199,19 @@ export namespace CSS {
4165
4199
  supports: CSSSupports;
4166
4200
  }
4167
4201
 
4202
+ export interface SetNavigationTextRequest {
4203
+ styleSheetId: DOM.StyleSheetId;
4204
+ range: SourceRange;
4205
+ text: string;
4206
+ }
4207
+
4208
+ export interface SetNavigationTextResponse extends ProtocolResponseWithError {
4209
+ /**
4210
+ * The resulting CSS Navigation rule after modification.
4211
+ */
4212
+ navigation: CSSNavigation;
4213
+ }
4214
+
4168
4215
  export interface SetScopeTextRequest {
4169
4216
  styleSheetId: DOM.StyleSheetId;
4170
4217
  range: SourceRange;
@@ -363,4 +363,5 @@ export class AiCodeCompletion {
363
363
  export const enum ContextFlavor {
364
364
  CONSOLE = 'console', // generated code can contain console specific APIs like `$0`.
365
365
  SOURCES = 'sources',
366
+ STYLES = 'styles',
366
367
  }
@@ -113,6 +113,7 @@ export class DeviceModeModel extends Common.ObjectWrapper.ObjectWrapper<EventTyp
113
113
  #emulationModel: SDK.EmulationModel.EmulationModel|null;
114
114
  #onModelAvailable: (() => void)|null;
115
115
  #outlineRect?: Rect;
116
+ #screenOrientationLocked: boolean;
116
117
 
117
118
  private constructor() {
118
119
  super();
@@ -172,6 +173,7 @@ export class DeviceModeModel extends Common.ObjectWrapper.ObjectWrapper<EventTyp
172
173
 
173
174
  this.#emulationModel = null;
174
175
  this.#onModelAvailable = null;
176
+ this.#screenOrientationLocked = false;
175
177
  SDK.TargetManager.TargetManager.instance().observeModels(SDK.EmulationModel.EmulationModel, this);
176
178
  }
177
179
 
@@ -442,6 +444,9 @@ export class DeviceModeModel extends Common.ObjectWrapper.ObjectWrapper<EventTyp
442
444
  this.#onModelAvailable = null;
443
445
  callback();
444
446
  }
447
+ emulationModel.addEventListener(
448
+ SDK.EmulationModel.EmulationModelEvents.SCREEN_ORIENTATION_LOCK_CHANGED, this.onScreenOrientationLockChanged,
449
+ this);
445
450
  const resourceTreeModel = emulationModel.target().model(SDK.ResourceTreeModel.ResourceTreeModel);
446
451
  if (resourceTreeModel) {
447
452
  resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.FrameResized, this.onFrameChange, this);
@@ -454,7 +459,12 @@ export class DeviceModeModel extends Common.ObjectWrapper.ObjectWrapper<EventTyp
454
459
 
455
460
  modelRemoved(emulationModel: SDK.EmulationModel.EmulationModel): void {
456
461
  if (this.#emulationModel === emulationModel) {
462
+ emulationModel.removeEventListener(
463
+ SDK.EmulationModel.EmulationModelEvents.SCREEN_ORIENTATION_LOCK_CHANGED, this.onScreenOrientationLockChanged,
464
+ this);
457
465
  this.#emulationModel = null;
466
+ this.#screenOrientationLocked = false;
467
+ this.dispatchEventToListeners(Events.UPDATED);
458
468
  }
459
469
  }
460
470
 
@@ -471,6 +481,43 @@ export class DeviceModeModel extends Common.ObjectWrapper.ObjectWrapper<EventTyp
471
481
  this.showHingeIfApplicable(overlayModel);
472
482
  }
473
483
 
484
+ private onScreenOrientationLockChanged(
485
+ event: Common.EventTarget.EventTargetEvent<SDK.EmulationModel.ScreenOrientationLockChangedEvent>): void {
486
+ this.#screenOrientationLocked = event.data.locked;
487
+ if (event.data.locked && event.data.orientation) {
488
+ this.applyOrientationLock(event.data.orientation);
489
+ }
490
+ this.dispatchEventToListeners(Events.UPDATED);
491
+ }
492
+
493
+ private applyOrientationLock(orientation: Protocol.Emulation.ScreenOrientation): void {
494
+ const wantsLandscape = orientation.type === Protocol.Emulation.ScreenOrientationType.LandscapePrimary ||
495
+ orientation.type === Protocol.Emulation.ScreenOrientationType.LandscapeSecondary;
496
+
497
+ if (this.#type === Type.Device && this.#device && this.#mode) {
498
+ // For device emulation, switch to the matching orientation mode.
499
+ const isCurrentlyLandscape =
500
+ this.#mode.orientation === Horizontal || this.#mode.orientation === HorizontalSpanned;
501
+ if (wantsLandscape !== isCurrentlyLandscape) {
502
+ const rotationPartner = this.#device.getRotationPartner(this.#mode);
503
+ if (rotationPartner) {
504
+ this.emulate(this.#type, this.#device, rotationPartner);
505
+ }
506
+ }
507
+ } else if (this.#type === Type.Responsive) {
508
+ // For responsive mode, swap width/height if orientation doesn't match.
509
+ const appliedSize = this.appliedDeviceSize();
510
+ const isCurrentlyLandscape = appliedSize.width > appliedSize.height;
511
+ if (wantsLandscape !== isCurrentlyLandscape) {
512
+ this.setSizeAndScaleToFit(appliedSize.height, appliedSize.width);
513
+ }
514
+ }
515
+ }
516
+
517
+ isScreenOrientationLocked(): boolean {
518
+ return this.#screenOrientationLocked;
519
+ }
520
+
474
521
  private scaleSettingChanged(): void {
475
522
  this.calculateAndEmulate(false);
476
523
  }
@@ -52,6 +52,7 @@ export const enum IssueCategory {
52
52
  ATTRIBUTION_REPORTING = 'AttributionReporting',
53
53
  QUIRKS_MODE = 'QuirksMode',
54
54
  PERMISSION_ELEMENT = 'PermissionElement',
55
+ SELECTIVE_PERMISSIONS_INTERVENTION = 'SelectivePermissionsIntervention',
55
56
  OTHER = 'Other',
56
57
  }
57
58
 
@@ -17,12 +17,12 @@ import {HeavyAdIssue} from './HeavyAdIssue.js';
17
17
  import {Issue, IssueCategory, IssueKind, unionIssueKind} from './Issue.js';
18
18
  import type {EventTypes as IssuesManagerEventsTypes, IssueAddedEvent} from './IssuesManager.js';
19
19
  import {Events as IssuesManagerEvents} from './IssuesManagerEvents.js';
20
- import {LowTextContrastIssue} from './LowTextContrastIssue.js';
21
20
  import type {MarkdownIssueDescription} from './MarkdownIssueDescription.js';
22
21
  import {MixedContentIssue} from './MixedContentIssue.js';
23
22
  import {PartitioningBlobURLIssue} from './PartitioningBlobURLIssue.js';
24
23
  import {PermissionElementIssue} from './PermissionElementIssue.js';
25
24
  import {QuirksModeIssue} from './QuirksModeIssue.js';
25
+ import {SelectivePermissionsInterventionIssue} from './SelectivePermissionsInterventionIssue.js';
26
26
  import {SharedArrayBufferIssue} from './SharedArrayBufferIssue.js';
27
27
 
28
28
  export interface IssuesProvider extends Common.EventTarget.EventTarget<IssuesManagerEventsTypes> {
@@ -64,11 +64,11 @@ export class AggregatedIssue extends Issue {
64
64
  #cspIssues = new Set<ContentSecurityPolicyIssue>();
65
65
  #deprecationIssues = new Set<DeprecationIssue>();
66
66
  #issueKind = IssueKind.IMPROVEMENT;
67
- #lowContrastIssues = new Set<LowTextContrastIssue>();
68
67
  #cookieDeprecationMetadataIssues = new Set<CookieDeprecationMetadataIssue>();
69
68
  #mixedContentIssues = new Set<MixedContentIssue>();
70
69
  #partitioningBlobURLIssues = new Set<PartitioningBlobURLIssue>();
71
70
  #permissionElementIssues = new Set<PermissionElementIssue>();
71
+ #selectivePermissionsInterventionIssues = new Set<SelectivePermissionsInterventionIssue>();
72
72
  #sharedArrayBufferIssues = new Set<SharedArrayBufferIssue>();
73
73
  #quirksModeIssues = new Set<QuirksModeIssue>();
74
74
  #attributionReportingIssues = new Set<AttributionReportingIssue>();
@@ -142,14 +142,14 @@ export class AggregatedIssue extends Issue {
142
142
  return this.#deprecationIssues;
143
143
  }
144
144
 
145
- getLowContrastIssues(): Iterable<LowTextContrastIssue> {
146
- return this.#lowContrastIssues;
147
- }
148
-
149
145
  override requests(): Iterable<Protocol.Audits.AffectedRequest> {
150
146
  return this.#affectedRequests.values();
151
147
  }
152
148
 
149
+ getSelectivePermissionsInterventionIssues(): Iterable<SelectivePermissionsInterventionIssue> {
150
+ return this.#selectivePermissionsInterventionIssues;
151
+ }
152
+
153
153
  getSharedArrayBufferIssues(): Iterable<SharedArrayBufferIssue> {
154
154
  return this.#sharedArrayBufferIssues;
155
155
  }
@@ -267,9 +267,6 @@ export class AggregatedIssue extends Issue {
267
267
  if (issue instanceof SharedArrayBufferIssue) {
268
268
  this.#sharedArrayBufferIssues.add(issue);
269
269
  }
270
- if (issue instanceof LowTextContrastIssue) {
271
- this.#lowContrastIssues.add(issue);
272
- }
273
270
  if (issue instanceof CorsIssue) {
274
271
  this.#corsIssues.add(issue);
275
272
  }
@@ -291,6 +288,9 @@ export class AggregatedIssue extends Issue {
291
288
  if (issue instanceof PermissionElementIssue) {
292
289
  this.#permissionElementIssues.add(issue);
293
290
  }
291
+ if (issue instanceof SelectivePermissionsInterventionIssue) {
292
+ this.#selectivePermissionsInterventionIssues.add(issue);
293
+ }
294
294
  }
295
295
 
296
296
  getKind(): IssueKind {
@@ -22,12 +22,12 @@ import {GenericIssue} from './GenericIssue.js';
22
22
  import {HeavyAdIssue} from './HeavyAdIssue.js';
23
23
  import type {Issue, IssueKind} from './Issue.js';
24
24
  import {Events} from './IssuesManagerEvents.js';
25
- import {LowTextContrastIssue} from './LowTextContrastIssue.js';
26
25
  import {MixedContentIssue} from './MixedContentIssue.js';
27
26
  import {PartitioningBlobURLIssue} from './PartitioningBlobURLIssue.js';
28
27
  import {PermissionElementIssue} from './PermissionElementIssue.js';
29
28
  import {PropertyRuleIssue} from './PropertyRuleIssue.js';
30
29
  import {QuirksModeIssue} from './QuirksModeIssue.js';
30
+ import {SelectivePermissionsInterventionIssue} from './SelectivePermissionsInterventionIssue.js';
31
31
  import {SharedArrayBufferIssue} from './SharedArrayBufferIssue.js';
32
32
  import {SharedDictionaryIssue} from './SharedDictionaryIssue.js';
33
33
  import {SourceFrameIssuesManager} from './SourceFrameIssuesManager.js';
@@ -81,10 +81,6 @@ const issueCodeHandlers = new Map<
81
81
  Protocol.Audits.InspectorIssueCode.SharedDictionaryIssue,
82
82
  SharedDictionaryIssue.fromInspectorIssue,
83
83
  ],
84
- [
85
- Protocol.Audits.InspectorIssueCode.LowTextContrastIssue,
86
- LowTextContrastIssue.fromInspectorIssue,
87
- ],
88
84
  [
89
85
  Protocol.Audits.InspectorIssueCode.CorsIssue,
90
86
  CorsIssue.fromInspectorIssue,
@@ -153,6 +149,10 @@ const issueCodeHandlers = new Map<
153
149
  Protocol.Audits.InspectorIssueCode.PermissionElementIssue,
154
150
  PermissionElementIssue.fromInspectorIssue,
155
151
  ],
152
+ [
153
+ Protocol.Audits.InspectorIssueCode.SelectivePermissionsInterventionIssue,
154
+ SelectivePermissionsInterventionIssue.fromInspectorIssue,
155
+ ],
156
156
  ]);
157
157
 
158
158
  /**
@@ -0,0 +1,65 @@
1
+ // Copyright 2026 The Chromium Authors
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 * as i18n from '../../core/i18n/i18n.js';
6
+ import type * as SDK from '../../core/sdk/sdk.js';
7
+ import * as Protocol from '../../generated/protocol.js';
8
+
9
+ import {Issue, IssueCategory, IssueKind} from './Issue.js';
10
+ import type {MarkdownIssueDescription} from './MarkdownIssueDescription.js';
11
+
12
+ const UIStrings = {
13
+ /**
14
+ * @description Title for a learn more link in Selective Permissions Intervention issue description
15
+ */
16
+ selectivePermissionsIntervention: 'Selective Permissions Intervention',
17
+ } as const;
18
+ const str_ = i18n.i18n.registerUIStrings('models/issues_manager/SelectivePermissionsInterventionIssue.ts', UIStrings);
19
+ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
20
+
21
+ export class SelectivePermissionsInterventionIssue extends
22
+ Issue<Protocol.Audits.SelectivePermissionsInterventionIssueDetails> {
23
+ constructor(
24
+ issueDetails: Protocol.Audits.SelectivePermissionsInterventionIssueDetails,
25
+ issuesModel: SDK.IssuesModel.IssuesModel|null) {
26
+ super(Protocol.Audits.InspectorIssueCode.SelectivePermissionsInterventionIssue, issueDetails, issuesModel);
27
+ }
28
+
29
+ primaryKey(): string {
30
+ return `${Protocol.Audits.InspectorIssueCode.SelectivePermissionsInterventionIssue}-${
31
+ JSON.stringify(this.details())}`;
32
+ }
33
+
34
+ getDescription(): MarkdownIssueDescription {
35
+ return {
36
+ file: 'selectivePermissionsIntervention.md',
37
+ links: [
38
+ {
39
+ link: 'https://crbug.com/435223477',
40
+ linkTitle: i18nString(UIStrings.selectivePermissionsIntervention),
41
+ },
42
+ ],
43
+ };
44
+ }
45
+
46
+ getCategory(): IssueCategory {
47
+ return IssueCategory.SELECTIVE_PERMISSIONS_INTERVENTION;
48
+ }
49
+
50
+ getKind(): IssueKind {
51
+ return IssueKind.PAGE_ERROR;
52
+ }
53
+
54
+ static fromInspectorIssue(
55
+ issuesModel: SDK.IssuesModel.IssuesModel|null,
56
+ inspectorIssue: Protocol.Audits.InspectorIssue): SelectivePermissionsInterventionIssue[] {
57
+ const selectivePermissionsInterventionIssueDetails =
58
+ inspectorIssue.details.selectivePermissionsInterventionIssueDetails;
59
+ if (!selectivePermissionsInterventionIssueDetails) {
60
+ console.warn('Selective Permissions Intervention issue without details received.');
61
+ return [];
62
+ }
63
+ return [new SelectivePermissionsInterventionIssue(selectivePermissionsInterventionIssueDetails, issuesModel)];
64
+ }
65
+ }
@@ -0,0 +1,7 @@
1
+ # Selective Permissions Intervention
2
+
3
+ The Selective Permissions Intervention blocks calls to privacy-sensitive APIs when they are called from ad scripts in order to align the permission grant with the user's intent. The particular API that was blocked, the call-stack that triggered the intervention, and why the script that called the API is considered ad-related is shown below.
4
+
5
+ Note that Chrome considers any script with a URL that matches a rule in the [filterlist](ChromeFilterlistRepository) as ad script, and the matching rule is shown in the Ad Ancestry section. In addition, any script loaded while an ad script is in the JavaScript stack will also be considered an ad script by Chrome and is also shown in Ad Ancestry.
6
+
7
+ If you believe this intervention was in error (e.g., this call would occur even when loading the page with an ad blocker enabled), then please [file a bug](SelectivePermissionsInterventionIssue).