chrome-devtools-frontend 1.0.1665921 → 1.0.1667564

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 (312) hide show
  1. package/.agents/skills/devtools-testing-guidance/SKILL.md +4 -0
  2. package/.agents/skills/migrate-chromium-test/SKILL.md +63 -48
  3. package/.agents/skills/ui-eng-vision-local-lit-renderer/SKILL.md +14 -5
  4. package/.agents/skills/ui-eng-vision-logic-consolidator/SKILL.md +11 -2
  5. package/.agents/skills/ui-eng-vision-orchestrator/SKILL.md +46 -9
  6. package/.agents/skills/ui-eng-vision-test-scaffolder/SKILL.md +20 -1
  7. package/.agents/skills/ui-eng-vision-widget-promoter/SKILL.md +9 -0
  8. package/front_end/core/host/AidaClient.ts +115 -64
  9. package/front_end/core/host/GcaClient.ts +3 -3
  10. package/front_end/core/host/InspectorFrontendHostAPI.ts +1 -0
  11. package/front_end/core/host/InspectorFrontendHostStub.ts +3 -3
  12. package/front_end/core/host/UserMetrics.ts +50 -13
  13. package/front_end/core/sdk/CSSMatchedStyles.ts +2 -5
  14. package/front_end/core/sdk/CSSPropertyParserMatchers.ts +12 -0
  15. package/front_end/core/sdk/Connections.ts +1 -1
  16. package/front_end/core/sdk/DOMModel.test.api.ts +104 -0
  17. package/front_end/core/sdk/DOMModel.ts +23 -11
  18. package/front_end/core/sdk/DebuggerModel.ts +9 -9
  19. package/front_end/core/sdk/IsolateManager.ts +1 -1
  20. package/front_end/core/sdk/NetworkManager.ts +105 -4
  21. package/front_end/core/sdk/NetworkRequest.ts +10 -55
  22. package/front_end/core/sdk/OverlayModel.ts +15 -14
  23. package/front_end/core/sdk/RemoteObject.ts +1 -1
  24. package/front_end/devtools_compatibility.js +1 -0
  25. package/front_end/entrypoints/main/MainImpl.ts +5 -12
  26. package/front_end/entrypoints/main/SimpleApp.ts +9 -3
  27. package/front_end/foundation/Universe.ts +22 -0
  28. package/front_end/generated/InspectorBackendCommands.ts +2 -2
  29. package/front_end/generated/protocol.ts +2 -1
  30. package/front_end/models/ai_assistance/agents/AiAgent.ts +22 -13
  31. package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +23 -10
  32. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +21 -5
  33. package/front_end/models/computed_style/ComputedStyleModel.ts +4 -7
  34. package/front_end/models/crux-manager/CrUXManager.ts +4 -0
  35. package/front_end/models/extensions/ExtensionAPI.ts +3 -3
  36. package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +2 -2
  37. package/front_end/models/issues_manager/CookieIssue.ts +6 -127
  38. package/front_end/models/issues_manager/descriptions/CoepCorpNotSameOrigin.md +2 -2
  39. package/front_end/models/issues_manager/descriptions/CoepCorpNotSameOriginAfterDefaultedToSameOriginByCoep.md +3 -3
  40. package/front_end/models/issues_manager/descriptions/CoepCorpNotSameSite.md +2 -2
  41. package/front_end/models/issues_manager/descriptions/CoepFrameResourceNeedsCoepHeader.md +1 -1
  42. package/front_end/models/issues_manager/descriptions/CompatibilityModeQuirks.md +1 -1
  43. package/front_end/models/issues_manager/descriptions/CookieAttributeValueExceedsMaxSize.md +2 -2
  44. package/front_end/models/issues_manager/descriptions/LowTextContrast.md +1 -1
  45. package/front_end/models/issues_manager/descriptions/SameSiteNoneInsecureErrorRead.md +1 -1
  46. package/front_end/models/issues_manager/descriptions/SameSiteNoneInsecureErrorSet.md +1 -1
  47. package/front_end/models/issues_manager/descriptions/SameSiteNoneInsecureWarnRead.md +1 -1
  48. package/front_end/models/issues_manager/descriptions/SameSiteNoneInsecureWarnSet.md +1 -1
  49. package/front_end/models/issues_manager/descriptions/SameSiteUnspecifiedLaxAllowUnsafeRead.md +3 -3
  50. package/front_end/models/issues_manager/descriptions/SameSiteUnspecifiedLaxAllowUnsafeSet.md +3 -3
  51. package/front_end/models/issues_manager/descriptions/bounceTrackingMitigations.md +1 -1
  52. package/front_end/models/issues_manager/descriptions/connectionAllowlistInvalidAllowlistItemType.md +2 -2
  53. package/front_end/models/issues_manager/descriptions/connectionAllowlistInvalidHeader.md +2 -2
  54. package/front_end/models/issues_manager/descriptions/connectionAllowlistInvalidUrlPattern.md +3 -3
  55. package/front_end/models/issues_manager/descriptions/connectionAllowlistItemNotInnerList.md +2 -2
  56. package/front_end/models/issues_manager/descriptions/connectionAllowlistMoreThanOneList.md +2 -2
  57. package/front_end/models/issues_manager/descriptions/connectionAllowlistReportingEndpointNotToken.md +1 -1
  58. package/front_end/models/issues_manager/descriptions/cookieCrossSiteRedirectDowngrade.md +3 -3
  59. package/front_end/models/issues_manager/descriptions/cookieExcludeBlockedWithinRelatedWebsiteSet.md +1 -1
  60. package/front_end/models/issues_manager/descriptions/cookieExcludePortMismatch.md +1 -1
  61. package/front_end/models/issues_manager/descriptions/cookieExcludeSchemeMismatch.md +1 -1
  62. package/front_end/models/issues_manager/descriptions/cookieExcludeThirdPartyPhaseoutSet.md +1 -1
  63. package/front_end/models/issues_manager/descriptions/cookieWarnThirdPartyPhaseoutRead.md +1 -1
  64. package/front_end/models/issues_manager/descriptions/corsAllowCredentialsRequired.md +1 -1
  65. package/front_end/models/issues_manager/descriptions/corsDisabledScheme.md +2 -2
  66. package/front_end/models/issues_manager/descriptions/corsDisallowedByMode.md +2 -2
  67. package/front_end/models/issues_manager/descriptions/corsHeaderDisallowedByPreflightResponse.md +1 -1
  68. package/front_end/models/issues_manager/descriptions/corsInvalidHeaderValues.md +3 -3
  69. package/front_end/models/issues_manager/descriptions/corsLocalNetworkAccessPermissionDenied.md +1 -1
  70. package/front_end/models/issues_manager/descriptions/corsMethodDisallowedByPreflightResponse.md +1 -1
  71. package/front_end/models/issues_manager/descriptions/corsNoCorsRedirectModeNotFollow.md +1 -1
  72. package/front_end/models/issues_manager/descriptions/corsOriginMismatch.md +3 -3
  73. package/front_end/models/issues_manager/descriptions/corsPreflightResponseInvalid.md +2 -2
  74. package/front_end/models/issues_manager/descriptions/corsRedirectContainsCredentials.md +3 -3
  75. package/front_end/models/issues_manager/descriptions/corsWildcardOriginNotAllowed.md +4 -3
  76. package/front_end/models/issues_manager/descriptions/cspEvalViolation.md +4 -4
  77. package/front_end/models/issues_manager/descriptions/cspInlineViolation.md +2 -2
  78. package/front_end/models/issues_manager/descriptions/cspTrustedTypesPolicyViolation.md +2 -2
  79. package/front_end/models/issues_manager/descriptions/cspTrustedTypesSinkViolation.md +4 -4
  80. package/front_end/models/issues_manager/descriptions/cspURLViolation.md +4 -4
  81. package/front_end/models/issues_manager/descriptions/emailVerificationRequestAccountsEmptyList.md +1 -1
  82. package/front_end/models/issues_manager/descriptions/emailVerificationRequestAccountsHttpNotFound.md +1 -1
  83. package/front_end/models/issues_manager/descriptions/emailVerificationRequestAccountsInvalidContentType.md +1 -1
  84. package/front_end/models/issues_manager/descriptions/emailVerificationRequestAccountsInvalidResponse.md +1 -1
  85. package/front_end/models/issues_manager/descriptions/emailVerificationRequestAccountsNoResponse.md +1 -1
  86. package/front_end/models/issues_manager/descriptions/emailVerificationRequestDnsFetchFailed.md +1 -1
  87. package/front_end/models/issues_manager/descriptions/emailVerificationRequestDnsInvalidRecord.md +1 -1
  88. package/front_end/models/issues_manager/descriptions/emailVerificationRequestEmailVerificationWellKnownHttpNotFound.md +1 -1
  89. package/front_end/models/issues_manager/descriptions/emailVerificationRequestEmailVerificationWellKnownInvalidContentType.md +1 -1
  90. package/front_end/models/issues_manager/descriptions/emailVerificationRequestEmailVerificationWellKnownInvalidResponse.md +1 -1
  91. package/front_end/models/issues_manager/descriptions/emailVerificationRequestEmailVerificationWellKnownNoResponse.md +1 -1
  92. package/front_end/models/issues_manager/descriptions/emailVerificationRequestInvalidEmail.md +1 -1
  93. package/front_end/models/issues_manager/descriptions/emailVerificationRequestJwksHttpNotFound.md +1 -1
  94. package/front_end/models/issues_manager/descriptions/emailVerificationRequestJwksInvalidResponse.md +1 -1
  95. package/front_end/models/issues_manager/descriptions/emailVerificationRequestKeyBindingSigningFailed.md +1 -1
  96. package/front_end/models/issues_manager/descriptions/emailVerificationRequestRpOriginIsOpaque.md +1 -1
  97. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenHttpNotFound.md +1 -1
  98. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenInvalidContentType.md +1 -1
  99. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenInvalidResponse.md +1 -1
  100. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenInvalidSdJwt.md +1 -1
  101. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenMalformedSdJwt.md +1 -1
  102. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenNoResponse.md +1 -1
  103. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbInvalidAudience.md +1 -1
  104. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbInvalidIssuedAt.md +1 -1
  105. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbInvalidNonce.md +1 -1
  106. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbInvalidSdHash.md +1 -1
  107. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbInvalidTyp.md +1 -1
  108. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbMissingAud.md +1 -1
  109. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbMissingCnf.md +1 -1
  110. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbMissingIat.md +1 -1
  111. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbMissingNonce.md +1 -1
  112. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbMissingSdHash.md +1 -1
  113. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbSignatureFailed.md +1 -1
  114. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidEmail.md +1 -1
  115. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidEmailVerified.md +1 -1
  116. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidHolderKey.md +1 -1
  117. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidIssuedAt.md +1 -1
  118. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidIssuer.md +1 -1
  119. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtJwksMissingKeys.md +1 -1
  120. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtMissingCnf.md +1 -1
  121. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtMissingEmail.md +1 -1
  122. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtMissingIat.md +1 -1
  123. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtMissingIss.md +1 -1
  124. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtSignatureFailed.md +1 -1
  125. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtUnsupportedHeaderAlg.md +1 -1
  126. package/front_end/models/issues_manager/descriptions/emailVerificationRequestUserLoggedOut.md +1 -1
  127. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownAccountsEndpointCrossOrigin.md +1 -1
  128. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownHttpNotFound.md +1 -1
  129. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownInvalidContentType.md +1 -1
  130. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownInvalidResponse.md +1 -1
  131. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownIssuanceEndpointCrossOrigin.md +1 -1
  132. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownListEmpty.md +1 -1
  133. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownMissingAccountsEndpoint.md +1 -1
  134. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownMissingIssuanceEndpoint.md +1 -1
  135. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownNoResponse.md +1 -1
  136. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownUnsupportedSigningAlgorithm.md +1 -1
  137. package/front_end/models/issues_manager/descriptions/federatedAuthRequestAccountsHttpNotFound.md +1 -1
  138. package/front_end/models/issues_manager/descriptions/federatedAuthRequestAccountsInvalidResponse.md +1 -1
  139. package/front_end/models/issues_manager/descriptions/federatedAuthRequestAccountsNoResponse.md +1 -1
  140. package/front_end/models/issues_manager/descriptions/federatedAuthRequestApprovalDeclined.md +1 -1
  141. package/front_end/models/issues_manager/descriptions/federatedAuthRequestCanceled.md +1 -1
  142. package/front_end/models/issues_manager/descriptions/federatedAuthRequestErrorFetchingSignin.md +1 -1
  143. package/front_end/models/issues_manager/descriptions/federatedAuthRequestErrorIdToken.md +1 -1
  144. package/front_end/models/issues_manager/descriptions/federatedAuthRequestIdTokenHttpNotFound.md +1 -1
  145. package/front_end/models/issues_manager/descriptions/federatedAuthRequestIdTokenInvalidRequest.md +1 -1
  146. package/front_end/models/issues_manager/descriptions/federatedAuthRequestIdTokenInvalidResponse.md +1 -1
  147. package/front_end/models/issues_manager/descriptions/federatedAuthRequestIdTokenNoResponse.md +1 -1
  148. package/front_end/models/issues_manager/descriptions/federatedAuthRequestInvalidSigninResponse.md +1 -1
  149. package/front_end/models/issues_manager/descriptions/federatedAuthRequestManifestHttpNotFound.md +1 -1
  150. package/front_end/models/issues_manager/descriptions/federatedAuthRequestManifestInvalidResponse.md +1 -1
  151. package/front_end/models/issues_manager/descriptions/federatedAuthRequestManifestNoResponse.md +1 -1
  152. package/front_end/models/issues_manager/descriptions/federatedAuthRequestTooManyRequests.md +1 -1
  153. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestInvalidAccountsResponse.md +1 -1
  154. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestInvalidConfigOrWellKnown.md +1 -1
  155. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNoAccountSharingPermission.md +1 -1
  156. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNoApiPermission.md +1 -1
  157. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNoReturningUserFromFetchedAccounts.md +1 -1
  158. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotIframe.md +1 -1
  159. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotPotentiallyTrustworthy.md +1 -1
  160. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotSameOrigin.md +1 -1
  161. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotSignedInWithIdp.md +1 -1
  162. package/front_end/models/issues_manager/descriptions/fetchingPartitionedBlobURL.md +2 -2
  163. package/front_end/models/issues_manager/descriptions/genericFormAriaLabelledByToNonExistingIdError.md +2 -2
  164. package/front_end/models/issues_manager/descriptions/genericFormAutocompleteAttributeEmptyError.md +1 -1
  165. package/front_end/models/issues_manager/descriptions/genericFormDuplicateIdForInputError.md +1 -1
  166. package/front_end/models/issues_manager/descriptions/genericFormEmptyIdAndNameAttributesForInputError.md +2 -2
  167. package/front_end/models/issues_manager/descriptions/genericFormInputAssignedAutocompleteValueToIdOrNameAttributeError.md +2 -2
  168. package/front_end/models/issues_manager/descriptions/genericFormInputHasWrongButWellIntendedAutocompleteValueError.md +1 -1
  169. package/front_end/models/issues_manager/descriptions/genericFormInputWithNoLabelError.md +1 -1
  170. package/front_end/models/issues_manager/descriptions/genericFormLabelForMatchesNonExistingIdError.md +2 -2
  171. package/front_end/models/issues_manager/descriptions/genericFormLabelForNameError.md +1 -1
  172. package/front_end/models/issues_manager/descriptions/genericFormLabelHasNeitherForNorNestedInputError.md +1 -1
  173. package/front_end/models/issues_manager/descriptions/genericFormModelContextMissingToolName.md +1 -1
  174. package/front_end/models/issues_manager/descriptions/genericFormModelContextParameterMissingName.md +1 -1
  175. package/front_end/models/issues_manager/descriptions/genericFormModelContextRequiredParameterMissingName.md +1 -1
  176. package/front_end/models/issues_manager/descriptions/genericNavigationEntryMarkedSkippable.md +2 -2
  177. package/front_end/models/issues_manager/descriptions/heavyAd.md +1 -1
  178. package/front_end/models/issues_manager/descriptions/lazyLoadImageZeroSize.md +1 -1
  179. package/front_end/models/issues_manager/descriptions/navigatingPartitionedBlobURL.md +3 -3
  180. package/front_end/models/issues_manager/descriptions/permissionElementActivationDisabled.md +1 -1
  181. package/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluder.md +1 -1
  182. package/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluderParent.md +1 -1
  183. package/front_end/models/issues_manager/descriptions/permissionElementFencedFrameDisallowed.md +2 -2
  184. package/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooLarge.md +2 -2
  185. package/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooSmall.md +2 -2
  186. package/front_end/models/issues_manager/descriptions/permissionElementInsetBoxShadowUnsupported.md +1 -1
  187. package/front_end/models/issues_manager/descriptions/permissionElementInvalidDisplayStyle.md +2 -2
  188. package/front_end/models/issues_manager/descriptions/permissionElementInvalidSizeValue.md +2 -2
  189. package/front_end/models/issues_manager/descriptions/permissionElementInvalidType.md +2 -2
  190. package/front_end/models/issues_manager/descriptions/permissionElementInvalidTypeActivation.md +2 -2
  191. package/front_end/models/issues_manager/descriptions/permissionElementNonOpaqueColor.md +1 -1
  192. package/front_end/models/issues_manager/descriptions/permissionElementPaddingBottomUnsupported.md +2 -2
  193. package/front_end/models/issues_manager/descriptions/permissionElementPaddingRightUnsupported.md +2 -2
  194. package/front_end/models/issues_manager/descriptions/permissionElementRequestInProgress.md +2 -2
  195. package/front_end/models/issues_manager/descriptions/permissionElementSecurityChecksFailed.md +1 -1
  196. package/front_end/models/issues_manager/descriptions/permissionElementTypeNotSupported.md +2 -2
  197. package/front_end/models/issues_manager/descriptions/permissionElementUntrustedEvent.md +1 -1
  198. package/front_end/models/issues_manager/descriptions/placeholderDescriptionForInvisibleIssues.md +1 -1
  199. package/front_end/models/issues_manager/descriptions/selectElementAccessibilityDisallowedOptGroupChild.md +1 -1
  200. package/front_end/models/issues_manager/descriptions/selectElementAccessibilityDisallowedSelectChild.md +1 -1
  201. package/front_end/models/issues_manager/descriptions/selectElementAccessibilityInteractiveContentAttributesSelectDescendant.md +1 -1
  202. package/front_end/models/issues_manager/descriptions/selectElementAccessibilityInteractiveContentLegendChild.md +1 -1
  203. package/front_end/models/issues_manager/descriptions/selectElementAccessibilityInteractiveContentOptionChild.md +1 -1
  204. package/front_end/models/issues_manager/descriptions/selectElementAccessibilityNonPhrasingContentOptionChild.md +1 -1
  205. package/front_end/models/issues_manager/descriptions/selectivePermissionsIntervention.md +3 -3
  206. package/front_end/models/issues_manager/descriptions/sharedArrayBuffer.md +1 -1
  207. package/front_end/models/issues_manager/descriptions/sharedDictionaryUseErrorCrossOriginNoCorsRequest.md +1 -1
  208. package/front_end/models/issues_manager/descriptions/sharedDictionaryUseErrorMatchingDictionaryNotUsed.md +1 -1
  209. package/front_end/models/issues_manager/descriptions/sharedDictionaryUseErrorUnexpectedContentDictionaryHeader.md +1 -1
  210. package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorCossOriginNoCorsRequest.md +1 -1
  211. package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorDisallowedBySettings.md +1 -1
  212. package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorExpiredResponse.md +1 -1
  213. package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorFeatureDisabled.md +2 -2
  214. package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorInvalidStructuredHeader.md +1 -1
  215. package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorNavigationRequest.md +2 -2
  216. package/front_end/models/issues_manager/descriptions/sriInvalidSignatureHeader.md +4 -4
  217. package/front_end/models/issues_manager/descriptions/sriInvalidSignatureInputHeader.md +4 -4
  218. package/front_end/models/issues_manager/descriptions/sriMissingSignatureHeader.md +1 -1
  219. package/front_end/models/issues_manager/descriptions/sriMissingSignatureInputHeader.md +2 -2
  220. package/front_end/models/issues_manager/descriptions/sriSignatureHeaderValueIsIncorrectLength.md +2 -2
  221. package/front_end/models/issues_manager/descriptions/sriSignatureHeaderValueIsNotByteSequence.md +4 -4
  222. package/front_end/models/issues_manager/descriptions/sriSignatureHeaderValueIsParameterized.md +4 -4
  223. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidComponentName.md +1 -1
  224. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidComponentType.md +2 -2
  225. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidDerivedComponentParameter.md +1 -1
  226. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidHeaderComponentParameter.md +1 -1
  227. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidParameter.md +2 -2
  228. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderKeyIdLength.md +5 -5
  229. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderMissingLabel.md +3 -3
  230. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderMissingRequiredParameters.md +2 -2
  231. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderValueMissingComponents.md +2 -2
  232. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderValueNotInnerList.md +2 -2
  233. package/front_end/models/issues_manager/descriptions/sriValidationFailedIntegrityMismatch.md +4 -4
  234. package/front_end/models/issues_manager/descriptions/sriValidationFailedInvalidLength.md +3 -3
  235. package/front_end/models/issues_manager/descriptions/sriValidationFailedSignatureExpired.md +2 -2
  236. package/front_end/models/issues_manager/descriptions/sriValidationFailedSignatureMismatch.md +2 -2
  237. package/front_end/models/issues_manager/descriptions/stylesheetLateImport.md +1 -1
  238. package/front_end/models/issues_manager/descriptions/summaryElementAccessibilityInteractiveContentSummaryDescendant.md +1 -1
  239. package/front_end/models/issues_manager/descriptions/unencodedDigestIncorrectDigestLength.md +2 -2
  240. package/front_end/models/issues_manager/descriptions/unencodedDigestIncorrectDigestType.md +3 -3
  241. package/front_end/models/issues_manager/descriptions/unencodedDigestMalformedDictionary.md +2 -2
  242. package/front_end/models/issues_manager/descriptions/unencodedDigestUnknownAlgorithm.md +1 -1
  243. package/front_end/models/live-metrics/LiveMetrics.ts +59 -19
  244. package/front_end/models/live-metrics/web-vitals-injected/README.md +1 -1
  245. package/front_end/models/live-metrics/web-vitals-injected/spec/spec.ts +6 -1
  246. package/front_end/models/live-metrics/web-vitals-injected/web-vitals-injected.ts +11 -3
  247. package/front_end/models/logs/LogManager.ts +1 -1
  248. package/front_end/models/persistence/FileSystemWorkspaceBinding.ts +1 -1
  249. package/front_end/models/source_map_scopes/FunctionCodeResolver.ts +6 -7
  250. package/front_end/models/workspace_diff/WorkspaceDiff.ts +13 -14
  251. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +15 -7
  252. package/front_end/panels/application/BackgroundServiceView.ts +18 -20
  253. package/front_end/panels/application/DOMStorageItemsView.ts +1 -2
  254. package/front_end/panels/application/KeyValueStorageItemsView.ts +12 -0
  255. package/front_end/panels/autofill/AutofillView.ts +17 -17
  256. package/front_end/panels/autofill/autofillView.css +7 -8
  257. package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +31 -31
  258. package/front_end/panels/browser_debugger/DOMBreakpointsSidebarPane.ts +15 -15
  259. package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +12 -12
  260. package/front_end/panels/browser_debugger/browser_debugger-meta.ts +27 -27
  261. package/front_end/panels/common/AiCodeCompletionDisclaimer.ts +14 -6
  262. package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +14 -6
  263. package/front_end/panels/common/AiCodeCompletionTeaser.ts +13 -6
  264. package/front_end/panels/common/GeminiRebrandPromoDialog.ts +1 -1
  265. package/front_end/panels/console/ConsoleInsightTeaser.ts +13 -6
  266. package/front_end/panels/console/ConsoleView.ts +6 -6
  267. package/front_end/panels/console_counters/WarningErrorCounter.ts +4 -4
  268. package/front_end/panels/coverage/CoverageModel.ts +11 -1
  269. package/front_end/panels/elements/StylePropertiesSection.ts +59 -10
  270. package/front_end/panels/elements/StylesAiCodeCompletionProvider.ts +18 -7
  271. package/front_end/panels/elements/StylesSidebarPane.ts +48 -0
  272. package/front_end/panels/emulation/AdvancedApp.ts +18 -8
  273. package/front_end/panels/emulation/DeviceModeToolbar.ts +0 -1
  274. package/front_end/panels/emulation/DeviceModeView.ts +289 -164
  275. package/front_end/panels/emulation/MediaQueryInspector.ts +10 -6
  276. package/front_end/panels/emulation/deviceModeView.css +1 -0
  277. package/front_end/panels/event_listeners/EventListenersView.ts +8 -8
  278. package/front_end/panels/explain/components/ConsoleInsight.ts +15 -7
  279. package/front_end/panels/lighthouse/LighthouseController.ts +1 -6
  280. package/front_end/panels/network/NetworkLogView.ts +13 -14
  281. package/front_end/panels/screencast/ScreencastApp.ts +12 -6
  282. package/front_end/panels/screencast/ScreencastView.ts +37 -11
  283. package/front_end/panels/sensors/locationsSettingsTab.css +4 -0
  284. package/front_end/panels/settings/AISettingsTab.ts +13 -6
  285. package/front_end/panels/sources/DebuggerPlugin.ts +13 -2
  286. package/front_end/panels/sources/breakpointEditDialog.css +2 -2
  287. package/front_end/panels/timeline/components/LiveMetricsView.ts +14 -1
  288. package/front_end/panels/timeline/components/cpuThrottlingSelector.css +4 -0
  289. package/front_end/panels/timeline/components/liveMetricsView.css +28 -0
  290. package/front_end/panels/timeline/timeline-meta.ts +13 -0
  291. package/front_end/third_party/chromium/README.chromium +1 -1
  292. package/front_end/ui/components/menus/menu.css +4 -0
  293. package/front_end/ui/components/menus/menuItem.css +4 -0
  294. package/front_end/ui/components/menus/selectMenu.css +4 -0
  295. package/front_end/ui/components/menus/selectMenuButton.css +4 -0
  296. package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +21 -10
  297. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +23 -12
  298. package/front_end/ui/components/text_editor/config.ts +7 -0
  299. package/front_end/ui/legacy/AppProvider.ts +2 -1
  300. package/front_end/ui/legacy/RootView.ts +8 -1
  301. package/front_end/ui/legacy/UniverseRequestEvent.ts +19 -0
  302. package/front_end/ui/legacy/Widget.ts +49 -6
  303. package/front_end/ui/legacy/inspectorCommon.css +1 -1
  304. package/front_end/ui/legacy/legacy.ts +2 -0
  305. package/front_end/ui/visual_logging/KnownContextValues.ts +2 -0
  306. package/package.json +1 -2
  307. package/front_end/models/issues_manager/descriptions/SameSiteExcludeContextDowngradeRead.md +0 -8
  308. package/front_end/models/issues_manager/descriptions/SameSiteExcludeContextDowngradeSet.md +0 -8
  309. package/front_end/models/issues_manager/descriptions/SameSiteExcludeNavigationContextDowngrade.md +0 -8
  310. package/front_end/models/issues_manager/descriptions/SameSiteWarnCrossDowngradeRead.md +0 -8
  311. package/front_end/models/issues_manager/descriptions/SameSiteWarnCrossDowngradeSet.md +0 -8
  312. package/front_end/models/issues_manager/descriptions/SameSiteWarnStrictLaxDowngradeStrict.md +0 -8
@@ -6,6 +6,7 @@ import '../../ui/components/spinners/spinners.js';
6
6
  import '../../ui/components/tooltips/tooltips.js';
7
7
  import '../../ui/kit/kit.js';
8
8
 
9
+ import type * as Common from '../../core/common/common.js';
9
10
  import * as Host from '../../core/host/host.js';
10
11
  import * as i18n from '../../core/i18n/i18n.js';
11
12
  import type * as AiCodeCompletion from '../../models/ai_code_completion/ai_code_completion.js';
@@ -116,7 +117,8 @@ export class AiCodeCompletionSummaryToolbar extends UI.Widget.Widget {
116
117
  #panel: AiCodeCompletion.AiCodeCompletion.ContextFlavor;
117
118
 
118
119
  #aidaAvailability?: Host.AidaClient.AidaAccessPreconditions;
119
- #boundOnAidaAvailabilityChange: () => Promise<void>;
120
+ #boundOnAidaAvailabilityChange:
121
+ (ev: Common.EventTarget.EventTargetEvent<Host.AidaClient.AidaAccessPreconditions>) => void;
120
122
 
121
123
  constructor(props: AiCodeCompletionSummaryToolbarProps, view?: View) {
122
124
  super();
@@ -130,14 +132,17 @@ export class AiCodeCompletionSummaryToolbar extends UI.Widget.Widget {
130
132
  this.requestUpdate();
131
133
  }
132
134
 
133
- async #onAidaAvailabilityChange(): Promise<void> {
134
- const currentAidaAvailability = await Host.AidaClient.AidaClient.checkAccessPreconditions();
135
- if (currentAidaAvailability !== this.#aidaAvailability) {
136
- this.#aidaAvailability = currentAidaAvailability;
135
+ #updateAidaAvailability(aidaAvailability: Host.AidaClient.AidaAccessPreconditions): void {
136
+ if (aidaAvailability !== this.#aidaAvailability) {
137
+ this.#aidaAvailability = aidaAvailability;
137
138
  this.requestUpdate();
138
139
  }
139
140
  }
140
141
 
142
+ #onAidaAvailabilityChange(ev: Common.EventTarget.EventTargetEvent<Host.AidaClient.AidaAccessPreconditions>): void {
143
+ this.#updateAidaAvailability(ev.data);
144
+ }
145
+
141
146
  setLoading(loading: boolean): void {
142
147
  this.#loading = loading;
143
148
  this.requestUpdate();
@@ -172,7 +177,10 @@ export class AiCodeCompletionSummaryToolbar extends UI.Widget.Widget {
172
177
  super.wasShown();
173
178
  Host.AidaClient.HostConfigTracker.instance().addEventListener(
174
179
  Host.AidaClient.Events.AIDA_AVAILABILITY_CHANGED, this.#boundOnAidaAvailabilityChange);
175
- void this.#onAidaAvailabilityChange();
180
+ const initialAvailability = Host.AidaClient.HostConfigTracker.instance().aidaAvailability;
181
+ if (initialAvailability !== undefined) {
182
+ this.#updateAidaAvailability(initialAvailability);
183
+ }
176
184
  }
177
185
 
178
186
  override willHide(): void {
@@ -171,7 +171,8 @@ export class AiCodeCompletionTeaser extends UI.Widget.Widget {
171
171
  readonly #view: View;
172
172
 
173
173
  #aidaAvailability?: Host.AidaClient.AidaAccessPreconditions;
174
- #boundOnAidaAvailabilityChange: () => Promise<void>;
174
+ #boundOnAidaAvailabilityChange:
175
+ (ev: Common.EventTarget.EventTargetEvent<Host.AidaClient.AidaAccessPreconditions>) => void;
175
176
  #boundOnAiCodeCompletionSettingChanged: () => void;
176
177
  #onDetach: () => void;
177
178
  #panel?: AiCodeCompletion.AiCodeCompletion.ContextFlavor;
@@ -211,14 +212,17 @@ export class AiCodeCompletionTeaser extends UI.Widget.Widget {
211
212
  });
212
213
  }
213
214
 
214
- async #onAidaAvailabilityChange(): Promise<void> {
215
- const currentAidaAvailability = await Host.AidaClient.AidaClient.checkAccessPreconditions();
216
- if (currentAidaAvailability !== this.#aidaAvailability) {
217
- this.#aidaAvailability = currentAidaAvailability;
215
+ #updateAidaAvailability(aidaAvailability: Host.AidaClient.AidaAccessPreconditions): void {
216
+ if (aidaAvailability !== this.#aidaAvailability) {
217
+ this.#aidaAvailability = aidaAvailability;
218
218
  this.requestUpdate();
219
219
  }
220
220
  }
221
221
 
222
+ #onAidaAvailabilityChange(ev: Common.EventTarget.EventTargetEvent<Host.AidaClient.AidaAccessPreconditions>): void {
223
+ this.#updateAidaAvailability(ev.data);
224
+ }
225
+
222
226
  #onAiCodeCompletionSettingChanged(): void {
223
227
  if (this.#aiCodeCompletionFreCompletedSetting.get() || this.#aiCodeCompletionTeaserDismissedSetting.get()) {
224
228
  this.detach();
@@ -322,7 +326,10 @@ export class AiCodeCompletionTeaser extends UI.Widget.Widget {
322
326
  Host.AidaClient.Events.AIDA_AVAILABILITY_CHANGED, this.#boundOnAidaAvailabilityChange);
323
327
  this.#aiCodeCompletionFreCompletedSetting.addChangeListener(this.#boundOnAiCodeCompletionSettingChanged);
324
328
  this.#aiCodeCompletionTeaserDismissedSetting.addChangeListener(this.#boundOnAiCodeCompletionSettingChanged);
325
- void this.#onAidaAvailabilityChange();
329
+ const initialAvailability = Host.AidaClient.HostConfigTracker.instance().aidaAvailability;
330
+ if (initialAvailability !== undefined) {
331
+ this.#updateAidaAvailability(initialAvailability);
332
+ }
326
333
  }
327
334
 
328
335
  override willHide(): void {
@@ -177,7 +177,7 @@ export class GeminiRebrandPromoDialog extends UI.Widget.VBox {
177
177
  return;
178
178
  }
179
179
 
180
- const currentAidaAvailability = await Host.AidaClient.AidaClient.checkAccessPreconditions();
180
+ const currentAidaAvailability = Host.AidaClient.HostConfigTracker.instance().aidaAvailability;
181
181
  if (currentAidaAvailability !== Host.AidaClient.AidaAccessPreconditions.AVAILABLE) {
182
182
  return;
183
183
  }
@@ -409,7 +409,8 @@ export class ConsoleInsightTeaser extends UI.Widget.Widget {
409
409
  #isSlow = false;
410
410
  #timeoutId: ReturnType<typeof setTimeout>|null = null;
411
411
  #aidaAvailability?: Host.AidaClient.AidaAccessPreconditions;
412
- #boundOnAidaAvailabilityChange: () => Promise<void>;
412
+ #boundOnAidaAvailabilityChange:
413
+ (ev: Common.EventTarget.EventTargetEvent<Host.AidaClient.AidaAccessPreconditions>) => void;
413
414
  #boundOnDownloadProgressChange: (event: Common.EventTarget.EventTargetEvent<number>) => void;
414
415
  #boundOnSessionCreation: () => void;
415
416
  #downloadProgress: number|null = null;
@@ -448,14 +449,17 @@ export class ConsoleInsightTeaser extends UI.Widget.Widget {
448
449
  return Common.Settings.Settings.instance().createLocalSetting('console-insights-onboarding-finished', true);
449
450
  }
450
451
 
451
- async #onAidaAvailabilityChange(): Promise<void> {
452
- const currentAidaAvailability = await Host.AidaClient.AidaClient.checkAccessPreconditions();
453
- if (currentAidaAvailability !== this.#aidaAvailability) {
454
- this.#aidaAvailability = currentAidaAvailability;
452
+ #updateAidaAvailability(aidaAvailability: Host.AidaClient.AidaAccessPreconditions): void {
453
+ if (aidaAvailability !== this.#aidaAvailability) {
454
+ this.#aidaAvailability = aidaAvailability;
455
455
  this.requestUpdate();
456
456
  }
457
457
  }
458
458
 
459
+ #onAidaAvailabilityChange(ev: Common.EventTarget.EventTargetEvent<Host.AidaClient.AidaAccessPreconditions>): void {
460
+ this.#updateAidaAvailability(ev.data);
461
+ }
462
+
459
463
  #executeConsoleInsightAction(): void {
460
464
  UI.Context.Context.instance().setFlavor(ConsoleViewMessage, this.#consoleViewMessage);
461
465
  const action = UI.ActionRegistry.ActionRegistry.instance().getAction(EXPLAIN_TEASER_ACTION_ID);
@@ -731,7 +735,10 @@ export class ConsoleInsightTeaser extends UI.Widget.Widget {
731
735
  super.wasShown();
732
736
  Host.AidaClient.HostConfigTracker.instance().addEventListener(
733
737
  Host.AidaClient.Events.AIDA_AVAILABILITY_CHANGED, this.#boundOnAidaAvailabilityChange);
734
- void this.#onAidaAvailabilityChange();
738
+ const initialAvailability = Host.AidaClient.HostConfigTracker.instance().aidaAvailability;
739
+ if (initialAvailability !== undefined) {
740
+ this.#updateAidaAvailability(initialAvailability);
741
+ }
735
742
  }
736
743
 
737
744
  override willHide(): void {
@@ -196,9 +196,9 @@ const UIStrings = {
196
196
  */
197
197
  copyVisibleStyledSelection: 'Copy visible styled selection',
198
198
  /**
199
- * @description Text to replay an XHR request.
199
+ * @description Text to resend a network request.
200
200
  */
201
- replayXhr: 'Replay XHR',
201
+ resend: 'Resend',
202
202
  /**
203
203
  * @description Text to indicate DevTools is writing to a file.
204
204
  */
@@ -1338,10 +1338,10 @@ export class ConsoleView extends UI.Widget.VBox implements
1338
1338
 
1339
1339
  if (consoleMessage) {
1340
1340
  const request = Logs.NetworkLog.NetworkLog.requestForConsoleMessage(consoleMessage);
1341
- if (request && SDK.NetworkManager.NetworkManager.canReplayRequest(request)) {
1342
- contextMenu.debugSection().appendItem(
1343
- i18nString(UIStrings.replayXhr), SDK.NetworkManager.NetworkManager.replayRequest.bind(null, request),
1344
- {jslogContext: 'replay-xhr'});
1341
+ if (request && SDK.NetworkManager.NetworkManager.canResendRequest(request)) {
1342
+ contextMenu.debugSection().appendItem(i18nString(UIStrings.resend),
1343
+ SDK.NetworkManager.NetworkManager.replayRequest.bind(null, request),
1344
+ {jslogContext: 'resend'});
1345
1345
  }
1346
1346
  }
1347
1347
 
@@ -19,20 +19,20 @@ const {html, nothing, render} = Lit;
19
19
 
20
20
  const UIStrings = {
21
21
  /**
22
- * @description The console error count in the Warning Error Counter shown in the main toolbar (top-left in DevTools). The error count refers to the number of errors currently present in the JavaScript console.
22
+ * @description The console error count in the Warning Error Counter shown in the main toolbar (top-left in DevTools). The error count refers to the number of errors currently present in the Console.
23
23
  */
24
24
  sErrors: '{n, plural, =1 {# error} other {# errors}}',
25
25
  /**
26
- * @description The console warning count in the Warning Error Counter shown in the main toolbar (top-left in DevTools). The warning count refers to the number of warnings currently present in the JavaScript console.
26
+ * @description The console warning count in the Warning Error Counter shown in the main toolbar (top-left in DevTools). The warning count refers to the number of warnings currently present in the Console.
27
27
  */
28
28
  sWarnings: '{n, plural, =1 {# warning} other {# warnings}}',
29
29
  /**
30
- * @description Tooltip shown for a main toolbar button that opens the Console panel
30
+ * @description Tooltip shown for a main toolbar button that opens the Console panel.
31
31
  * @example {2 errors, 1 warning} PH1
32
32
  */
33
33
  openConsoleToViewS: 'Open Console to view {PH1}',
34
34
  /**
35
- * @description Title for the issues count in the Issues Error Counter shown in the main toolbar (top-left in DevTools). The issues count refers to the number of issues in the issues tab.
35
+ * @description Title for the issues count in the Issues Error Counter shown in the main toolbar (top-left in DevTools). The issues count refers to the number of issues in the Issues tab.
36
36
  */
37
37
  openIssuesToView: '{n, plural, =1 {Open Issues to view # issue:} other {Open Issues to view # issues:}}',
38
38
  } as const;
@@ -61,6 +61,7 @@ export class CoverageModel extends SDK.SDKModel.SDKModel<EventTypes> {
61
61
  private sourceMapManager: SDK.SourceMapManager.SourceMapManager<SDK.Script.Script>|null;
62
62
  private willResolveSourceMaps: boolean;
63
63
  private processSourceMapBacklog: SourceMapObject[];
64
+ private isPolling: boolean;
64
65
 
65
66
  constructor(target: SDK.Target.Target) {
66
67
  super(target);
@@ -88,6 +89,7 @@ export class CoverageModel extends SDK.SDKModel.SDKModel<EventTypes> {
88
89
  this.performanceTraceRecording = false;
89
90
  this.willResolveSourceMaps = false;
90
91
  this.processSourceMapBacklog = [];
92
+ this.isPolling = false;
91
93
  }
92
94
 
93
95
  async start(jsCoveragePerBlock: boolean): Promise<boolean> {
@@ -184,22 +186,30 @@ export class CoverageModel extends SDK.SDKModel.SDKModel<EventTypes> {
184
186
  }
185
187
 
186
188
  async startPolling(): Promise<void> {
187
- if (this.currentPollPromise || this.suspensionState !== SuspensionState.ACTIVE) {
189
+ if (this.isPolling || this.suspensionState !== SuspensionState.ACTIVE) {
188
190
  return;
189
191
  }
192
+ this.isPolling = true;
190
193
  await this.pollLoop();
191
194
  }
192
195
 
193
196
  private async pollLoop(): Promise<void> {
194
197
  this.clearTimer();
198
+ if (!this.isPolling) {
199
+ return;
200
+ }
195
201
  this.currentPollPromise = this.pollAndCallback();
196
202
  await this.currentPollPromise;
203
+ if (!this.isPolling) {
204
+ return;
205
+ }
197
206
  if (this.suspensionState === SuspensionState.ACTIVE || this.performanceTraceRecording) {
198
207
  this.pollTimer = window.setTimeout(() => this.pollLoop(), COVERAGE_POLLING_PERIOD_MS);
199
208
  }
200
209
  }
201
210
 
202
211
  async stopPolling(): Promise<void> {
212
+ this.isPolling = false;
203
213
  this.clearTimer();
204
214
  await this.currentPollPromise;
205
215
  this.currentPollPromise = null;
@@ -154,7 +154,7 @@ export class StylePropertiesSection {
154
154
  private parentsComputedStyles: Map<string, string>|null;
155
155
  private computedStyleExtraFields: Protocol.CSS.ComputedStyleExtraFields|null;
156
156
  editable: boolean;
157
- private hoverTimer: number|null = null;
157
+ private hoverTimer: ReturnType<typeof setTimeout>|null = null;
158
158
  private willCauseCancelEditing = false;
159
159
  private forceShowAll = false;
160
160
  private readonly originalPropertiesCount: number;
@@ -275,7 +275,11 @@ export class StylePropertiesSection {
275
275
  this.selectorElement.classList.add('selector');
276
276
  this.selectorElement.textContent = headerText;
277
277
  selectorContainer.appendChild(this.selectorElement);
278
- this.selectorElement.addEventListener('mouseenter', this.onMouseEnterSelector.bind(this), false);
278
+ this.selectorElement.addEventListener('mouseenter', () => {
279
+ if (this.styleInternal.parentRule instanceof SDK.CSSRule.CSSStyleRule) {
280
+ this.onMouseEnterSelector(this.styleInternal.parentRule);
281
+ }
282
+ }, false);
279
283
  this.selectorElement.addEventListener('mouseleave', this.onMouseOutSelector.bind(this), false);
280
284
  this.#specificityTooltips = selectorContainer.createChild('span');
281
285
 
@@ -679,23 +683,31 @@ export class StylePropertiesSection {
679
683
  SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
680
684
  }
681
685
 
682
- private onMouseEnterSelector(): void {
686
+ private onMouseEnterSelector(rule: SDK.CSSRule.CSSStyleRule, nestingIndex?: number): void {
683
687
  if (this.hoverTimer) {
684
688
  clearTimeout(this.hoverTimer);
685
689
  }
686
- this.hoverTimer = window.setTimeout(this.highlight.bind(this), 300);
690
+ const selectorList = constructResolvedSelector(rule, nestingIndex);
691
+ if (!selectorList) {
692
+ return;
693
+ }
694
+ this.hoverTimer = setTimeout(this.highlight.bind(this, undefined, selectorList), 300);
687
695
  }
688
696
 
689
- highlight(mode: string|undefined = 'all'): void {
697
+ /**
698
+ * Highlights the DOM node associated with this style section in the page overlay.
699
+ * Use `selectorList` to highlight elements matching a specific parent/ancestor
700
+ * rule or selector.
701
+ *
702
+ * @param mode Highlight mode (defaults to `'all'`).
703
+ * @param selectorList Parent selector string to highlight.
704
+ */
705
+ highlight(mode: string|undefined = 'all', selectorList: string): void {
690
706
  SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
691
707
  const node = this.stylesContainer.node();
692
708
  if (!node) {
693
709
  return;
694
710
  }
695
- const selectorList =
696
- this.styleInternal.parentRule && this.styleInternal.parentRule instanceof SDK.CSSRule.CSSStyleRule ?
697
- this.styleInternal.parentRule.selectorText() :
698
- undefined;
699
711
  node.domModel().overlayModel().highlightInOverlay({node, selectorList}, mode);
700
712
  }
701
713
 
@@ -1140,6 +1152,8 @@ export class StylePropertiesSection {
1140
1152
  }
1141
1153
 
1142
1154
  const selectorElement = container.createChild('span', 'selector');
1155
+ selectorElement.addEventListener('mouseenter', () => this.onMouseEnterSelector(parentRule), false);
1156
+ selectorElement.addEventListener('mouseleave', this.onMouseOutSelector.bind(this), false);
1143
1157
  const specificityContainer = container.createChild('span');
1144
1158
  this.renderSelectorsToElement(parentRule.selectors, matchingSelectors, this.elementToSelectorIndex,
1145
1159
  selectorElement, specificityContainer);
@@ -1150,6 +1164,8 @@ export class StylePropertiesSection {
1150
1164
  }
1151
1165
 
1152
1166
  const nestingElement = document.createElement('div');
1167
+ nestingElement.addEventListener('mouseenter', () => this.onMouseEnterSelector(rule, nestingIndex), false);
1168
+ nestingElement.addEventListener('mouseleave', this.onMouseOutSelector.bind(this), false);
1153
1169
  nestingElement.textContent = `${nestingSelector} {`;
1154
1170
  return nestingElement;
1155
1171
  }
@@ -1502,7 +1518,7 @@ export class StylePropertiesSection {
1502
1518
  }
1503
1519
 
1504
1520
  markSelectorHighlights(): void {
1505
- const selectors = this.selectorElement.getElementsByClassName('simple-selector');
1521
+ const selectors = this.element.getElementsByClassName('simple-selector');
1506
1522
  const regex = this.stylesContainer.filterRegex();
1507
1523
  for (let i = 0; i < selectors.length; ++i) {
1508
1524
  const selectorMatchesFilter = regex?.test(selectors[i].textContent || '');
@@ -2257,3 +2273,36 @@ export class HighlightPseudoStylePropertiesSection extends StylePropertiesSectio
2257
2273
  interface TreeElementParent {
2258
2274
  appendChild(child: UI.TreeOutline.TreeElement): void;
2259
2275
  }
2276
+
2277
+ export function constructResolvedSelector(rule: SDK.CSSRule.CSSRule|null, nestingIndex?: number): string|undefined {
2278
+ if (!(rule instanceof SDK.CSSRule.CSSStyleRule)) {
2279
+ return undefined;
2280
+ }
2281
+
2282
+ const nestingSelectors = rule.nestingSelectors;
2283
+ if (!nestingSelectors) {
2284
+ return nestingIndex === undefined ? rule.selectorText() : undefined;
2285
+ }
2286
+
2287
+ if (nestingIndex !== undefined && (nestingIndex < 0 || nestingIndex >= nestingSelectors.length)) {
2288
+ return undefined;
2289
+ }
2290
+
2291
+ const selectorText = nestingIndex !== undefined ? nestingSelectors[nestingIndex] : rule.selectorText();
2292
+
2293
+ const parentIndex = nestingIndex !== undefined ? nestingIndex + 1 : 0;
2294
+ const parentSelector = constructResolvedSelector(rule, parentIndex);
2295
+
2296
+ if (!parentSelector) {
2297
+ return selectorText;
2298
+ }
2299
+
2300
+ // Strip pseudo-elements (e.g. ::before) because pseudo-elements are invalid inside CSS :is(...).
2301
+ const sanitizedParent = parentSelector.replace(/::[a-zA-Z-]+/g, '').trim();
2302
+
2303
+ if (selectorText.includes('&')) {
2304
+ return selectorText.replaceAll('&', `:is(${sanitizedParent})`);
2305
+ }
2306
+
2307
+ return `:is(${sanitizedParent}) ${selectorText.trim()}`;
2308
+ }
@@ -29,17 +29,29 @@ export class StylesAiCodeCompletionProvider {
29
29
  sampleId?: number,
30
30
  }|null) => void;
31
31
 
32
- #boundOnUpdateAiCodeCompletionState = this.#updateAiCodeCompletionState.bind(this);
32
+ #boundOnAidaAvailabilityChange =
33
+ (ev: Common.EventTarget.EventTargetEvent<Host.AidaClient.AidaAccessPreconditions>): void => {
34
+ this.#updateAiCodeCompletionStateWithAvailability(ev.data);
35
+ };
36
+ #boundOnSettingChange = (): void => {
37
+ const aidaAvailability = Host.AidaClient.HostConfigTracker.instance().aidaAvailability;
38
+ if (aidaAvailability !== undefined) {
39
+ this.#updateAiCodeCompletionStateWithAvailability(aidaAvailability);
40
+ }
41
+ };
33
42
 
34
43
  private constructor(aiCodeCompletionConfig: TextEditor.AiCodeCompletionProvider.AiCodeCompletionConfig) {
35
44
  if (!AiCodeCompletion.AiCodeCompletion.AiCodeCompletion.isAiCodeCompletionStylesAvailable()) {
36
45
  throw new Error('AI code completion feature in Styles is not available.');
37
46
  }
38
47
  this.#aiCodeCompletionConfig = aiCodeCompletionConfig;
39
- Host.AidaClient.HostConfigTracker.instance().addEventListener(
40
- Host.AidaClient.Events.AIDA_AVAILABILITY_CHANGED, this.#boundOnUpdateAiCodeCompletionState);
41
- this.#aiCodeCompletionSetting.addChangeListener(this.#boundOnUpdateAiCodeCompletionState);
42
- void this.#updateAiCodeCompletionState();
48
+ Host.AidaClient.HostConfigTracker.instance().addEventListener(Host.AidaClient.Events.AIDA_AVAILABILITY_CHANGED,
49
+ this.#boundOnAidaAvailabilityChange);
50
+ this.#aiCodeCompletionSetting.addChangeListener(this.#boundOnSettingChange);
51
+ const initialAvailability = Host.AidaClient.HostConfigTracker.instance().aidaAvailability;
52
+ if (initialAvailability !== undefined) {
53
+ this.#updateAiCodeCompletionStateWithAvailability(initialAvailability);
54
+ }
43
55
  }
44
56
 
45
57
  static createInstance(aiCodeCompletionConfig: TextEditor.AiCodeCompletionProvider.AiCodeCompletionConfig):
@@ -78,8 +90,7 @@ export class StylesAiCodeCompletionProvider {
78
90
  this.#aiCodeCompletionConfig?.onFeatureDisabled();
79
91
  }
80
92
 
81
- async #updateAiCodeCompletionState(): Promise<void> {
82
- const aidaAvailability = await Host.AidaClient.AidaClient.checkAccessPreconditions();
93
+ #updateAiCodeCompletionStateWithAvailability(aidaAvailability: Host.AidaClient.AidaAccessPreconditions): void {
83
94
  const isAvailable = aidaAvailability === Host.AidaClient.AidaAccessPreconditions.AVAILABLE;
84
95
  const devtoolsLocale = i18n.DevToolsLocale.DevToolsLocale.instance().locale;
85
96
  const isEnabled =
@@ -235,6 +235,7 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
235
235
  #shouldRenderLazily = false;
236
236
  #lazyRenderObserver?: IntersectionObserver;
237
237
  #lazyRenderCallbacks = new WeakMap<Element, () => void>();
238
+ #elementsForSyncViewportCheck: Element[] = [];
238
239
  #updateId = 0;
239
240
 
240
241
  constructor(computedStyleModel: ComputedStyle.ComputedStyleModel.ComputedStyleModel) {
@@ -990,6 +991,7 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
990
991
 
991
992
  const focusedIndex = this.focusedSectionIndex();
992
993
 
994
+ this.#elementsForSyncViewportCheck = [];
993
995
  this.linkifier.reset();
994
996
  const prevSections = this.sectionBlocks.map(block => block.sections).flat();
995
997
 
@@ -1047,6 +1049,7 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
1047
1049
  }
1048
1050
 
1049
1051
  this.sectionsContainer.contentElement.appendChild(fragment);
1052
+ this.#performSyncViewportCheck();
1050
1053
 
1051
1054
  if (elementToFocus) {
1052
1055
  elementToFocus.focus();
@@ -1655,9 +1658,54 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
1655
1658
  }, {rootMargin: '100px'});
1656
1659
  }
1657
1660
  this.#lazyRenderCallbacks.set(element, callback);
1661
+ this.#elementsForSyncViewportCheck.push(element);
1658
1662
  this.#lazyRenderObserver.observe(element);
1659
1663
  }
1660
1664
 
1665
+ #performSyncViewportCheck(): void {
1666
+ if (!this.#shouldRenderLazily || this.#elementsForSyncViewportCheck.length === 0) {
1667
+ this.#elementsForSyncViewportCheck = [];
1668
+ return;
1669
+ }
1670
+ const scrollContainer = this.contentElement.parentElement;
1671
+ if (!scrollContainer) {
1672
+ this.#elementsForSyncViewportCheck = [];
1673
+ return;
1674
+ }
1675
+ const {top, bottom} = scrollContainer.getBoundingClientRect();
1676
+ if (bottom === top) {
1677
+ this.#elementsForSyncViewportCheck = [];
1678
+ return;
1679
+ }
1680
+ // Expand the bounding calculation by ±100px to accurately match the {rootMargin: '100px'}
1681
+ // option configured on the IntersectionObserver in trackForLazyRendering.
1682
+ const viewportTop = top - 100;
1683
+ const viewportBottom = bottom + 100;
1684
+
1685
+ const visibleElements: Element[] = [];
1686
+ for (const element of this.#elementsForSyncViewportCheck) {
1687
+ if (!element.isConnected || !this.#lazyRenderCallbacks.has(element)) {
1688
+ continue;
1689
+ }
1690
+ const rect = element.getBoundingClientRect();
1691
+ if (rect.top > viewportBottom) {
1692
+ break;
1693
+ }
1694
+ if (rect.bottom >= viewportTop) {
1695
+ visibleElements.push(element);
1696
+ }
1697
+ }
1698
+ this.#elementsForSyncViewportCheck = [];
1699
+
1700
+ for (const element of visibleElements) {
1701
+ const callback = this.#lazyRenderCallbacks.get(element);
1702
+ if (callback) {
1703
+ callback();
1704
+ this.untrackForLazyRendering(element);
1705
+ }
1706
+ }
1707
+ }
1708
+
1661
1709
  shouldRenderLazily(): boolean {
1662
1710
  return this.#shouldRenderLazily;
1663
1711
  }
@@ -5,13 +5,14 @@
5
5
 
6
6
  import type * as Common from '../../core/common/common.js';
7
7
  import * as Host from '../../core/host/host.js';
8
+ import type * as Foundation from '../../foundation/foundation.js';
8
9
  import * as UI from '../../ui/legacy/legacy.js';
9
10
  import * as ThemeSupport from '../../ui/legacy/theme_support/theme_support.js';
10
11
 
11
12
  import {DeviceModeWrapper} from './DeviceModeWrapper.js';
12
13
  import {type Bounds, Events, InspectedPagePlaceholder} from './InspectedPagePlaceholder.js';
13
14
 
14
- let appInstance: AdvancedApp;
15
+ let appInstance: AdvancedApp|null = null;
15
16
 
16
17
  export class AdvancedApp implements UI.App.App {
17
18
  private rootSplitWidget!: UI.SplitWidget.SplitWidget;
@@ -20,8 +21,10 @@ export class AdvancedApp implements UI.App.App {
20
21
  private toolboxWindow?: Window|null;
21
22
  private toolboxRootView?: UI.RootView.RootView;
22
23
  private changingDockSide?: boolean;
24
+ readonly #universe: Foundation.Universe.Universe;
23
25
 
24
- constructor() {
26
+ constructor(universe: Foundation.Universe.Universe) {
27
+ this.#universe = universe;
25
28
  UI.DockController.DockController.instance().addEventListener(
26
29
  UI.DockController.Events.BEFORE_DOCK_SIDE_CHANGED, this.openToolboxWindow, this);
27
30
  }
@@ -29,15 +32,22 @@ export class AdvancedApp implements UI.App.App {
29
32
  /**
30
33
  * Note: it's used by toolbox.ts without real type checks.
31
34
  */
32
- static instance(): AdvancedApp {
35
+ static instance(universe?: Foundation.Universe.Universe): AdvancedApp {
33
36
  if (!appInstance) {
34
- appInstance = new AdvancedApp();
37
+ if (!universe) {
38
+ throw new Error('AdvancedApp.instance() requires a Universe on initial instantiation');
39
+ }
40
+ appInstance = new AdvancedApp(universe);
35
41
  }
36
42
  return appInstance;
37
43
  }
38
44
 
45
+ static removeInstance(): void {
46
+ appInstance = null;
47
+ }
48
+
39
49
  presentUI(document: Document): void {
40
- const rootView = new UI.RootView.RootView();
50
+ const rootView = new UI.RootView.RootView(this.#universe);
41
51
 
42
52
  this.rootSplitWidget =
43
53
  new UI.SplitWidget.SplitWidget(false, true, 'inspector-view.split-view-state', 555, 300, true);
@@ -85,7 +95,7 @@ export class AdvancedApp implements UI.App.App {
85
95
  UI.UIUtils.installComponentRootStyles(toolboxDocument.body);
86
96
  UI.ContextMenu.ContextMenu.installHandler(toolboxDocument);
87
97
 
88
- this.toolboxRootView = new UI.RootView.RootView();
98
+ this.toolboxRootView = new UI.RootView.RootView(this.#universe);
89
99
  this.toolboxRootView.attachToDocument(toolboxDocument);
90
100
 
91
101
  this.updateDeviceModeView();
@@ -200,7 +210,7 @@ export class AdvancedAppProvider implements UI.AppProvider.AppProvider {
200
210
  return advancedAppProviderInstance;
201
211
  }
202
212
 
203
- createApp(): UI.App.App {
204
- return AdvancedApp.instance();
213
+ createApp(universe: Foundation.Universe.Universe): UI.App.App {
214
+ return AdvancedApp.instance(universe);
205
215
  }
206
216
  }
@@ -460,7 +460,6 @@ export class DeviceModeToolbar extends UI.Widget.Widget {
460
460
  this.showMediaInspectorSetting.addChangeListener(this.requestUpdate, this);
461
461
  this.showRulersSetting = Common.Settings.Settings.instance().moduleSetting('emulation.show-rulers');
462
462
  this.showRulersSetting.addChangeListener(this.requestUpdate, this);
463
-
464
463
  this.showDeviceScaleFactorSetting =
465
464
  Common.Settings.Settings.instance().createSetting('emulation.show-device-scale-factor', false);
466
465
  this.showDeviceScaleFactorSetting.addChangeListener(this.requestUpdate, this);