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
@@ -61,10 +61,33 @@ const AidaLanguageToMarkdown: Record<AidaInferenceLanguage, string> = {
61
61
  [AidaInferenceLanguage.UNKNOWN]: 'unknown',
62
62
  };
63
63
 
64
- export class AidaAbortError extends Error {}
65
- export class AidaBlockError extends Error {}
66
- export class AidaQuotaError extends Error {}
67
- export class AidaPayloadTooLargeError extends Error {}
64
+ export abstract class AidaClientError extends Error {
65
+ override name = 'AidaClientError';
66
+ }
67
+ export class AidaUnknownError extends AidaClientError {
68
+ override name = 'AidaUnknownError';
69
+ }
70
+ export class AidaAbortError extends AidaClientError {
71
+ override name = 'AidaAbortError';
72
+ }
73
+ export class AidaBlockError extends AidaClientError {
74
+ override name = 'AidaBlockError';
75
+ }
76
+ export class AidaQuotaError extends AidaClientError {
77
+ override name = 'AidaQuotaError';
78
+ }
79
+ export class AidaPayloadTooLargeError extends AidaClientError {
80
+ override name = 'AidaPayloadTooLargeError';
81
+ }
82
+ export class AidaPermissionDeniedError extends AidaClientError {
83
+ override name = 'AidaPermissionDeniedError';
84
+ }
85
+ export class AidaTimeoutError extends AidaClientError {
86
+ override name = 'AidaTimeoutError';
87
+ }
88
+ export class AidaInvalidJsonResponseError extends AidaClientError {
89
+ override name = 'AidaInvalidJsonResponseError';
90
+ }
68
91
 
69
92
  interface AiStream {
70
93
  write: (data: string) => Promise<void>;
@@ -185,40 +208,7 @@ export class AidaClient {
185
208
  },
186
209
  err => {
187
210
  debugLog('doConversation failed with error:', JSON.stringify(err));
188
- if (err instanceof DispatchHttpRequestClient.DispatchHttpRequestError && err.response) {
189
- const result = err.response;
190
- if (result.statusCode === 429) {
191
- stream.fail(new AidaQuotaError('Server responded: quota exceeded'));
192
- return;
193
- }
194
- if (result.statusCode === 403) {
195
- stream.fail(new Error('Server responded: permission denied'));
196
- return;
197
- }
198
- if ('error' in result && result.error) {
199
- if (isQuotaError(result.error, result.detail)) {
200
- stream.fail(new AidaQuotaError(
201
- `Cannot send request: ${result.error}${result.detail ? ` ${result.detail}` : ''}`));
202
- return;
203
- }
204
- if (isPayloadTooLargeError(result.error, result.detail)) {
205
- stream.fail(new AidaPayloadTooLargeError(
206
- `Cannot send request: ${result.error}${result.detail ? ` ${result.detail}` : ''}`));
207
- return;
208
- }
209
- stream.fail(new Error(`Cannot send request: ${result.error}${result.detail ? ` ${result.detail}` : ''}`));
210
- return;
211
- }
212
- if ('netErrorName' in result && result.netErrorName === 'net::ERR_TIMED_OUT') {
213
- stream.fail(new Error('doAidaConversation timed out'));
214
- return;
215
- }
216
- if (result.statusCode !== 200) {
217
- stream.fail(new Error(`Request failed: ${JSON.stringify(result)}`));
218
- return;
219
- }
220
- }
221
- stream.fail(err);
211
+ stream.fail(mapError(err));
222
212
  });
223
213
  await (yield* this.#handleResponseStream(stream));
224
214
  }
@@ -265,13 +255,7 @@ export class AidaClient {
265
255
  thoughtSignature: result.functionCallChunk.functionCall.thoughtSignature,
266
256
  });
267
257
  } else if ('error' in result) {
268
- if (isQuotaError(result.error)) {
269
- throw new AidaQuotaError(`Server responded: ${JSON.stringify(result)}`);
270
- }
271
- if (isPayloadTooLargeError(result.error)) {
272
- throw new AidaPayloadTooLargeError(`Server responded: ${JSON.stringify(result)}`);
273
- }
274
- throw new Error(`Server responded: ${JSON.stringify(result)}`);
258
+ throw mapError(result.error);
275
259
  } else {
276
260
  throw new Error(`Unknown chunk result ${JSON.stringify(result)}`);
277
261
  }
@@ -364,14 +348,18 @@ export class AidaClient {
364
348
  }
365
349
 
366
350
  if (this.#gcaClient.enabled()) {
367
- return await this.#gcaClient.completeCode(request);
351
+ try {
352
+ return await this.#gcaClient.completeCode(request);
353
+ } catch (err) {
354
+ throw mapError(err);
355
+ }
368
356
  }
369
357
  const {promise, resolve} = Promise.withResolvers<AidaCodeCompleteResult>();
370
358
  InspectorFrontendHostInstance.aidaCodeComplete(JSON.stringify(request), resolve);
371
359
  const completeCodeResult = await promise;
372
360
 
373
361
  if (completeCodeResult.error) {
374
- throw new Error(`Cannot send request: ${completeCodeResult.error} ${completeCodeResult.detail || ''}`);
362
+ throw mapError(completeCodeResult.error, completeCodeResult.detail);
375
363
  }
376
364
  const response = completeCodeResult.response;
377
365
  if (!response?.length) {
@@ -420,18 +408,25 @@ export class AidaClient {
420
408
 
421
409
  if (this.#gcaClient.enabled()) {
422
410
  // Inline and remove the else clause after migration
423
- return await this.#gcaClient.generateCode(request, options);
424
- }
425
- const response = await DispatchHttpRequestClient.makeHttpRequest<GenerateCodeResponse>(
426
- {
427
- service: SERVICE_NAME,
428
- path: '/v1/aida:generateCode',
429
- method: 'POST',
430
- body: JSON.stringify(request),
431
- },
432
- options);
411
+ try {
412
+ return await this.#gcaClient.generateCode(request, options);
413
+ } catch (err) {
414
+ throw mapError(err);
415
+ }
416
+ }
417
+ try {
418
+ const response = await DispatchHttpRequestClient.makeHttpRequest<GenerateCodeResponse>({
419
+ service: SERVICE_NAME,
420
+ path: '/v1/aida:generateCode',
421
+ method: 'POST',
422
+ body: JSON.stringify(request),
423
+ },
424
+ options);
433
425
 
434
- return response;
426
+ return response;
427
+ } catch (err) {
428
+ throw mapError(err);
429
+ }
435
430
  }
436
431
  }
437
432
 
@@ -461,6 +456,10 @@ export class HostConfigTracker extends Common.ObjectWrapper.ObjectWrapper<EventT
461
456
  #pollTimer?: ReturnType<typeof setTimeout>;
462
457
  #aidaAvailability?: AidaAccessPreconditions;
463
458
 
459
+ get aidaAvailability(): AidaAccessPreconditions|undefined {
460
+ return this.#aidaAvailability;
461
+ }
462
+
464
463
  static instance({forceNew}: {
465
464
  forceNew: boolean,
466
465
  } = {forceNew: false}): HostConfigTracker {
@@ -512,9 +511,7 @@ export class HostConfigTracker extends Common.ObjectWrapper.ObjectWrapper<EventT
512
511
  const config =
513
512
  await new Promise<Root.Runtime.HostConfig>(resolve => InspectorFrontendHostInstance.getHostConfig(resolve));
514
513
  Object.assign(Root.Runtime.hostConfig, config);
515
- // TODO(crbug.com/442545623): Send `currentAidaAvailability` to the listeners as part of the event so that
516
- // `await AidaClient.checkAccessPreconditions()` does not need to be called again in the event handlers.
517
- this.dispatchEventToListeners(Events.AIDA_AVAILABILITY_CHANGED);
514
+ this.dispatchEventToListeners(Events.AIDA_AVAILABILITY_CHANGED, currentAidaAvailability);
518
515
  }
519
516
  }
520
517
  }
@@ -524,13 +521,67 @@ export const enum Events {
524
521
  }
525
522
 
526
523
  export interface EventTypes {
527
- [Events.AIDA_AVAILABILITY_CHANGED]: void;
524
+ [Events.AIDA_AVAILABILITY_CHANGED]: AidaAccessPreconditions;
528
525
  }
529
526
 
530
- function isQuotaError(...inputs: Array<string|undefined>): boolean {
527
+ export function isQuotaError(...inputs: Array<string|undefined>): boolean {
531
528
  return inputs.some(input => input?.toLowerCase().includes('quota'));
532
529
  }
533
530
 
534
- function isPayloadTooLargeError(...inputs: Array<string|undefined>): boolean {
531
+ export function isPayloadTooLargeError(...inputs: Array<string|undefined>): boolean {
535
532
  return inputs.some(input => input?.toLowerCase().includes('payload size exceeds the limit'));
536
533
  }
534
+
535
+ /**
536
+ * Maps AIDA-specific errors, DispatchHttpRequestErrors, strings, and generic
537
+ * Errors to dedicated AidaClientError subclasses.
538
+ */
539
+ export function mapError(err: unknown, detail?: string): AidaClientError {
540
+ if (err instanceof AidaClientError) {
541
+ return err;
542
+ }
543
+
544
+ if (err instanceof DispatchHttpRequestClient.DispatchHttpRequestError) {
545
+ if (err.type === DispatchHttpRequestClient.ErrorType.ABORT) {
546
+ return new AidaAbortError();
547
+ }
548
+ const response = err.response;
549
+ if (response) {
550
+ if (response.statusCode === 429) {
551
+ return new AidaQuotaError('Server responded: quota exceeded');
552
+ }
553
+ if (response.statusCode === 403) {
554
+ return new AidaPermissionDeniedError('Server responded: permission denied');
555
+ }
556
+ if ('netErrorName' in response && response.netErrorName === 'net::ERR_TIMED_OUT') {
557
+ return new AidaTimeoutError('AIDA request timed out');
558
+ }
559
+ if ('error' in response && response.error) {
560
+ return mapError(response.error, response.detail);
561
+ }
562
+ // The dispatcher throws HTTP_RESPONSE_UNAVAILABLE with status code 200
563
+ // when it successfully receives the HTTP response but fails to parse its JSON body.
564
+ if (response.statusCode === 200 && err.type === DispatchHttpRequestClient.ErrorType.HTTP_RESPONSE_UNAVAILABLE) {
565
+ return new AidaInvalidJsonResponseError('Server responded with invalid JSON', {cause: err});
566
+ }
567
+ if (response.statusCode !== 200) {
568
+ return new AidaUnknownError(`Request failed: ${JSON.stringify(response)}`);
569
+ }
570
+ }
571
+ }
572
+
573
+ if (typeof err === 'string') {
574
+ if (isQuotaError(err, detail)) {
575
+ return new AidaQuotaError(`Cannot send request: ${err}${detail ? ` ${detail}` : ''}`);
576
+ }
577
+ if (isPayloadTooLargeError(err, detail)) {
578
+ return new AidaPayloadTooLargeError(`Cannot send request: ${err}${detail ? ` ${detail}` : ''}`);
579
+ }
580
+ return new AidaUnknownError(`Cannot send request: ${err}${detail ? ` ${detail}` : ''}`);
581
+ }
582
+
583
+ if (err instanceof Error) {
584
+ return new AidaUnknownError(err.message, {cause: err});
585
+ }
586
+ return new AidaUnknownError(String(err));
587
+ }
@@ -91,8 +91,8 @@ export class GcaClient {
91
91
  return result ? gcaResponseToAidaGenerateCodeResponse(result) : null;
92
92
  }
93
93
 
94
- async #requestContent(request: GenerateContentRequest, options?: {signal?: AbortSignal}):
95
- Promise<GenerateContentResponse|null> {
94
+ async #requestContent(request: GenerateContentRequest,
95
+ options?: {signal?: AbortSignal}): Promise<GenerateContentResponse> {
96
96
  try {
97
97
  const response = await DispatchHttpRequestClient.makeHttpRequest<GenerateContentResponse>(
98
98
  {
@@ -106,7 +106,7 @@ export class GcaClient {
106
106
  return response;
107
107
  } catch (err) {
108
108
  debugLog('GCA request failed:', JSON.stringify(request), err);
109
- return null;
109
+ throw err;
110
110
  }
111
111
  }
112
112
  }
@@ -556,5 +556,6 @@ export const enum EnumeratedHistogram {
556
556
  LighthouseCategoryUsed = 'DevTools.LighthouseCategoryUsed',
557
557
  SwatchActivated = 'DevTools.SwatchActivated',
558
558
  BuiltInAiAvailability = 'DevTools.BuiltInAiAvailability',
559
+ ResendRequest = 'DevTools.ResendRequest',
559
560
  // LINT.ThenChange(/front_end/devtools_compatibility.js:EnumeratedHistogram)
560
561
  }
@@ -118,15 +118,15 @@ export class InspectorFrontendHostStub implements InspectorFrontendHostAPI {
118
118
  }
119
119
 
120
120
  setIsDocked(_isDocked: boolean, callback: () => void): void {
121
- window.setTimeout(callback, 0);
121
+ globalThis.setTimeout(callback, 0);
122
122
  }
123
123
 
124
124
  showSurvey(_trigger: string, callback: (arg0: ShowSurveyResult) => void): void {
125
- window.setTimeout(() => callback({surveyShown: false}), 0);
125
+ globalThis.setTimeout(() => callback({surveyShown: false}), 0);
126
126
  }
127
127
 
128
128
  canShowSurvey(_trigger: string, callback: (arg0: CanShowSurveyResult) => void): void {
129
- window.setTimeout(() => callback({canShowSurvey: false}), 0);
129
+ globalThis.setTimeout(() => callback({canShowSurvey: false}), 0);
130
130
  }
131
131
 
132
132
  /**
@@ -2,6 +2,8 @@
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
4
 
5
+ import * as Common from '../common/common.js';
6
+
5
7
  import {InspectorFrontendHostInstance} from './InspectorFrontendHost.js';
6
8
  import {EnumeratedHistogram} from './InspectorFrontendHostAPI.js';
7
9
 
@@ -29,6 +31,11 @@ export class UserMetrics {
29
31
  InspectorFrontendHostInstance.recordEnumeratedHistogram(EnumeratedHistogram.ActionTaken, action, Action.MAX_VALUE);
30
32
  }
31
33
 
34
+ resendRequest(resourceType: ResendRequestType): void {
35
+ InspectorFrontendHostInstance.recordEnumeratedHistogram(EnumeratedHistogram.ResendRequest, resourceType,
36
+ ResendRequestType.MAX_VALUE);
37
+ }
38
+
32
39
  keybindSetSettingChanged(keybindSet: string): void {
33
40
  const value = KeybindSetSettings[keybindSet as keyof typeof KeybindSetSettings] || 0;
34
41
  InspectorFrontendHostInstance.recordEnumeratedHistogram(
@@ -253,7 +260,6 @@ export class UserMetrics {
253
260
  InspectorFrontendHostInstance.recordPerformanceHistogram(
254
261
  'DevTools.Insights.ShortTeaserGenerationTime', timeInMilliseconds);
255
262
  }
256
-
257
263
  }
258
264
 
259
265
  /**
@@ -813,18 +819,7 @@ export enum IssueCreated {
813
819
  'CookieIssue::ExcludeSameSiteNoneInsecure::SetCookie' = 15,
814
820
  'CookieIssue::WarnSameSiteNoneInsecure::ReadCookie' = 16,
815
821
  'CookieIssue::WarnSameSiteNoneInsecure::SetCookie' = 17,
816
- 'CookieIssue::WarnSameSiteStrictLaxDowngradeStrict::Secure' = 18,
817
- 'CookieIssue::WarnSameSiteStrictLaxDowngradeStrict::Insecure' = 19,
818
- 'CookieIssue::WarnCrossDowngrade::ReadCookie::Secure' = 20,
819
- 'CookieIssue::WarnCrossDowngrade::ReadCookie::Insecure' = 21,
820
- 'CookieIssue::WarnCrossDowngrade::SetCookie::Secure' = 22,
821
- 'CookieIssue::WarnCrossDowngrade::SetCookie::Insecure' = 23,
822
- 'CookieIssue::ExcludeNavigationContextDowngrade::Secure' = 24,
823
- 'CookieIssue::ExcludeNavigationContextDowngrade::Insecure' = 25,
824
- 'CookieIssue::ExcludeContextDowngrade::ReadCookie::Secure' = 26,
825
- 'CookieIssue::ExcludeContextDowngrade::ReadCookie::Insecure' = 27,
826
- 'CookieIssue::ExcludeContextDowngrade::SetCookie::Secure' = 28,
827
- 'CookieIssue::ExcludeContextDowngrade::SetCookie::Insecure' = 29,
822
+
828
823
  'CookieIssue::ExcludeSameSiteUnspecifiedTreatedAsLax::ReadCookie' = 30,
829
824
  'CookieIssue::ExcludeSameSiteUnspecifiedTreatedAsLax::SetCookie' = 31,
830
825
  'CookieIssue::WarnSameSiteUnspecifiedLaxAllowUnsafe::ReadCookie' = 32,
@@ -1193,3 +1188,45 @@ export const enum BuiltInAiAvailability {
1193
1188
  DISABLED_NO_GPU = 9,
1194
1189
  MAX_VALUE = 10,
1195
1190
  }
1191
+
1192
+ export const enum ResendRequestType {
1193
+ XHR = 0,
1194
+ FETCH = 1,
1195
+ SCRIPT = 2,
1196
+ STYLESHEET = 3,
1197
+ IMAGE = 4,
1198
+ MEDIA = 5,
1199
+ FONT = 6,
1200
+ WASM = 7,
1201
+ MANIFEST = 8,
1202
+ TEXT_TRACK = 9,
1203
+ SOURCE_MAP_SCRIPT = 10,
1204
+ SOURCE_MAP_STYLE_SHEET = 11,
1205
+ DOCUMENT = 12,
1206
+ PREFETCH = 13,
1207
+ PING = 14,
1208
+ OTHER = 15,
1209
+ MAX_VALUE = 16,
1210
+ }
1211
+
1212
+ const resendRequestTypeMap = new Map<Common.ResourceType.ResourceType, ResendRequestType>([
1213
+ [Common.ResourceType.resourceTypes.XHR, ResendRequestType.XHR],
1214
+ [Common.ResourceType.resourceTypes.Fetch, ResendRequestType.FETCH],
1215
+ [Common.ResourceType.resourceTypes.Script, ResendRequestType.SCRIPT],
1216
+ [Common.ResourceType.resourceTypes.Stylesheet, ResendRequestType.STYLESHEET],
1217
+ [Common.ResourceType.resourceTypes.Image, ResendRequestType.IMAGE],
1218
+ [Common.ResourceType.resourceTypes.Media, ResendRequestType.MEDIA],
1219
+ [Common.ResourceType.resourceTypes.Font, ResendRequestType.FONT],
1220
+ [Common.ResourceType.resourceTypes.Wasm, ResendRequestType.WASM],
1221
+ [Common.ResourceType.resourceTypes.Manifest, ResendRequestType.MANIFEST],
1222
+ [Common.ResourceType.resourceTypes.TextTrack, ResendRequestType.TEXT_TRACK],
1223
+ [Common.ResourceType.resourceTypes.SourceMapScript, ResendRequestType.SOURCE_MAP_SCRIPT],
1224
+ [Common.ResourceType.resourceTypes.SourceMapStyleSheet, ResendRequestType.SOURCE_MAP_STYLE_SHEET],
1225
+ [Common.ResourceType.resourceTypes.Document, ResendRequestType.DOCUMENT],
1226
+ [Common.ResourceType.resourceTypes.Prefetch, ResendRequestType.PREFETCH],
1227
+ [Common.ResourceType.resourceTypes.Ping, ResendRequestType.PING],
1228
+ ]);
1229
+
1230
+ export function resendRequestType(resourceType: Common.ResourceType.ResourceType): ResendRequestType {
1231
+ return resendRequestTypeMap.get(resourceType) ?? ResendRequestType.OTHER;
1232
+ }
@@ -52,7 +52,7 @@ import {
52
52
  CSSStyleRule,
53
53
  } from './CSSRule.js';
54
54
  import {CSSStyleDeclaration, Type} from './CSSStyleDeclaration.js';
55
- import type {DOMNode} from './DOMModel.js';
55
+ import {type DOMNode, NodeType} from './DOMModel.js';
56
56
 
57
57
  function containsStyle(styles: CSSStyleDeclaration[]|Set<CSSStyleDeclaration>, query: CSSStyleDeclaration): boolean {
58
58
  if (!query.styleSheetId || !query.range) {
@@ -456,7 +456,7 @@ export class CSSMatchedStyles {
456
456
  }
457
457
 
458
458
  // Inline style takes precedence over regular and inherited rules.
459
- if (inlinePayload && this.#node.nodeType() === Node.ELEMENT_NODE) {
459
+ if (inlinePayload && this.#node.nodeType() === NodeType.ELEMENT_NODE) {
460
460
  const style = new CSSStyleDeclaration(this.#cssModel, null, inlinePayload, Type.Inline);
461
461
  this.#nodeForStyle.set(style, this.#node);
462
462
  nodeStyles.push(style);
@@ -905,9 +905,6 @@ export class CSSMatchedStyles {
905
905
 
906
906
  const matchCascade = (cascade: DOMInheritanceCascade): CSSStyleRule|null => {
907
907
  for (const style of cascade.styles()) {
908
- if (this.isInherited(style)) {
909
- continue;
910
- }
911
908
  const parentRule = style.parentRule;
912
909
  if (!(parentRule instanceof CSSStyleRule)) {
913
910
  continue;
@@ -243,6 +243,18 @@ function getCssEvaluationElement(): HTMLElement {
243
243
  return cssEvaluationElement;
244
244
  }
245
245
 
246
+ /**
247
+ * If a test calls localEvalCSS, an element is created on demand for this
248
+ * purpose. This element is not removed from the DOM and will leak between tests
249
+ * if not removed.
250
+ */
251
+ export function removeCSSEvaluationElement(): void {
252
+ if (cssEvaluationElement) {
253
+ document.body.removeChild(cssEvaluationElement);
254
+ cssEvaluationElement = null;
255
+ }
256
+ }
257
+
246
258
  /**
247
259
  * These functions use an element in the frontend to evaluate CSS. The advantage
248
260
  * of this is that it is synchronous and doesn't require a CDP method. The
@@ -189,7 +189,7 @@ export class StubTransport implements ProtocolClient.ConnectionTransport.Connect
189
189
  }
190
190
 
191
191
  sendRawMessage(message: string): void {
192
- window.setTimeout(this.respondWithError.bind(this, message), 0);
192
+ globalThis.setTimeout(this.respondWithError.bind(this, message), 0);
193
193
  }
194
194
 
195
195
  private respondWithError(message: string): void {
@@ -0,0 +1,104 @@
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 {assert} from 'chai';
6
+
7
+ import type * as Common from '../common/common.js';
8
+
9
+ // eslint-disable-next-line @devtools/es-modules-import
10
+ import * as SDK from './sdk.js';
11
+
12
+ function findNode(node: SDK.DOMModel.DOMNode, predicate: (node: SDK.DOMModel.DOMNode) => boolean): SDK.DOMModel.DOMNode|
13
+ null {
14
+ if (predicate(node)) {
15
+ return node;
16
+ }
17
+ const children = node.children();
18
+ if (children) {
19
+ for (const child of children) {
20
+ const result = findNode(child, predicate);
21
+ if (result) {
22
+ return result;
23
+ }
24
+ }
25
+ }
26
+ return null;
27
+ }
28
+
29
+ describe('DOMModel API Test', () => {
30
+ it('generates attribute updated event only when attribute is actually changed', async ({inspectedPage, universe}) => {
31
+ const primaryTarget = universe.targetManager.primaryPageTarget();
32
+ assert.isNotNull(primaryTarget);
33
+
34
+ const domModel = primaryTarget.model(SDK.DOMModel.DOMModel);
35
+ assert.isNotNull(domModel);
36
+
37
+ await inspectedPage.goToHtml(`
38
+ <div id="container">
39
+ <div id="node-set-new-value" style="color:red"></div>
40
+ <div id="node-set-same-value" style="color:red"></div>
41
+ </div>
42
+ `);
43
+
44
+ const documentNode = await domModel.requestDocument();
45
+ assert.isNotNull(documentNode);
46
+
47
+ // Retrieve the subtree to populate the DOMModel cache.
48
+ await documentNode.getSubtree(5, true);
49
+
50
+ const container = findNode(documentNode, n => n.getAttribute('id') === 'container');
51
+ assert.isNotNull(container);
52
+
53
+ const nodeSetNewValue = findNode(documentNode, n => n.getAttribute('id') === 'node-set-new-value');
54
+ assert.isNotNull(nodeSetNewValue);
55
+
56
+ const nodeSetSameValue = findNode(documentNode, n => n.getAttribute('id') === 'node-set-same-value');
57
+ assert.isNotNull(nodeSetSameValue);
58
+
59
+ if (!nodeSetNewValue || !nodeSetSameValue) {
60
+ assert.fail('Could not find test nodes');
61
+ }
62
+
63
+ // Verifies that setting a new style attribute value triggers the AttrModified event.
64
+ let attrModifiedPromise = domModel.once(SDK.DOMModel.Events.AttrModified);
65
+
66
+ await inspectedPage.evaluate(() => {
67
+ (document.getElementById('node-set-new-value') as HTMLElement).style.setProperty('color', 'blue');
68
+ });
69
+
70
+ let eventData = await attrModifiedPromise;
71
+ assert.strictEqual(eventData.node, nodeSetNewValue);
72
+ assert.strictEqual(eventData.name, 'style');
73
+ assert.strictEqual(nodeSetNewValue.getAttribute('style'), 'color: blue;');
74
+
75
+ // Verifies that setting the style attribute to the same value does not trigger the AttrModified event.
76
+ let attrModifiedFired = false;
77
+ const listener =
78
+ (event: Common.EventTarget
79
+ .EventTargetEvent<SDK.DOMModel.EventTypes[SDK.DOMModel.Events.AttrModified], SDK.DOMModel.EventTypes>):
80
+ void => {
81
+ if (event.data.node === nodeSetSameValue) {
82
+ attrModifiedFired = true;
83
+ }
84
+ };
85
+ domModel.addEventListener(SDK.DOMModel.Events.AttrModified, listener);
86
+
87
+ await inspectedPage.evaluate(() => {
88
+ (document.getElementById('node-set-same-value') as HTMLElement).style.setProperty('color', 'red');
89
+ });
90
+
91
+ // Flushes pending events by triggering a style change on the new value node.
92
+ attrModifiedPromise = domModel.once(SDK.DOMModel.Events.AttrModified);
93
+
94
+ await inspectedPage.evaluate(() => {
95
+ (document.getElementById('node-set-new-value') as HTMLElement).style.setProperty('color', 'green');
96
+ });
97
+
98
+ eventData = await attrModifiedPromise;
99
+ assert.strictEqual(eventData.node, nodeSetNewValue);
100
+ assert.isFalse(attrModifiedFired, 'AttrModified should not have fired for same value');
101
+
102
+ domModel.removeEventListener(SDK.DOMModel.Events.AttrModified, listener);
103
+ });
104
+ });
@@ -50,6 +50,18 @@ import {SDKModel} from './SDKModel.js';
50
50
  import {Capability, type Target} from './Target.js';
51
51
  import type {TargetManager} from './TargetManager.js';
52
52
 
53
+ export const enum NodeType {
54
+ ELEMENT_NODE = 1,
55
+ ATTRIBUTE_NODE = 2,
56
+ TEXT_NODE = 3,
57
+ CDATA_SECTION_NODE = 4,
58
+ PROCESSING_INSTRUCTION_NODE = 7,
59
+ COMMENT_NODE = 8,
60
+ DOCUMENT_NODE = 9,
61
+ DOCUMENT_TYPE_NODE = 10,
62
+ DOCUMENT_FRAGMENT_NODE = 11,
63
+ }
64
+
53
65
  /** Keep this list in sync with https://w3c.github.io/aria/#state_prop_def **/
54
66
  export const ARIA_ATTRIBUTES = new Set<string>([
55
67
  'role',
@@ -297,7 +309,7 @@ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventType
297
309
  this.#adProvenance = payload.adProvenance;
298
310
  }
299
311
 
300
- if (this.#nodeType === Node.ELEMENT_NODE) {
312
+ if (this.#nodeType === NodeType.ELEMENT_NODE) {
301
313
  // HTML and BODY from internal iframes should not overwrite top-level ones.
302
314
  if (this.ownerDocument && !this.ownerDocument.documentElement && this.#nodeName === 'HTML') {
303
315
  this.ownerDocument.documentElement = this;
@@ -305,11 +317,11 @@ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventType
305
317
  if (this.ownerDocument && !this.ownerDocument.body && this.#nodeName === 'BODY') {
306
318
  this.ownerDocument.body = this;
307
319
  }
308
- } else if (this.#nodeType === Node.DOCUMENT_TYPE_NODE) {
320
+ } else if (this.#nodeType === NodeType.DOCUMENT_TYPE_NODE) {
309
321
  this.publicId = payload.publicId;
310
322
  this.systemId = payload.systemId;
311
323
  this.internalSubset = payload.internalSubset;
312
- } else if (this.#nodeType === Node.ATTRIBUTE_NODE) {
324
+ } else if (this.#nodeType === NodeType.ATTRIBUTE_NODE) {
313
325
  this.name = payload.name;
314
326
  this.value = payload.value;
315
327
  }
@@ -354,7 +366,7 @@ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventType
354
366
  }
355
367
 
356
368
  isRootNode(): boolean {
357
- if (this.nodeType() === Node.ELEMENT_NODE && this.nodeName() === 'HTML') {
369
+ if (this.nodeType() === NodeType.ELEMENT_NODE && this.nodeName() === 'HTML') {
358
370
  return true;
359
371
  }
360
372
  return false;
@@ -762,7 +774,7 @@ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventType
762
774
  if (node.isShadowRoot()) {
763
775
  return node.shadowRootType() === DOMNode.ShadowRootTypes.UserAgent ? 'u' : 'a';
764
776
  }
765
- if (node.nodeType() === Node.DOCUMENT_NODE) {
777
+ if (node.nodeType() === NodeType.DOCUMENT_NODE) {
766
778
  return 'd';
767
779
  }
768
780
  return null;
@@ -1018,7 +1030,7 @@ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventType
1018
1030
  }
1019
1031
 
1020
1032
  isCustomElement(): boolean {
1021
- if (this.nodeType() !== Node.ELEMENT_NODE || this.isXMLNode()) {
1033
+ if (this.nodeType() !== NodeType.ELEMENT_NODE || this.isXMLNode()) {
1022
1034
  return false;
1023
1035
  }
1024
1036
  const localName = this.localName() || this.nodeName().toLowerCase();
@@ -1158,11 +1170,11 @@ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventType
1158
1170
 
1159
1171
  enclosingElementOrSelf(): DOMNode|null {
1160
1172
  let node: DOMNode|null = this;
1161
- if (node && node.nodeType() === Node.TEXT_NODE && node.parentNode) {
1173
+ if (node && node.nodeType() === NodeType.TEXT_NODE && node.parentNode) {
1162
1174
  node = node.parentNode;
1163
1175
  }
1164
1176
 
1165
- if (node && node.nodeType() !== Node.ELEMENT_NODE) {
1177
+ if (node && node.nodeType() !== NodeType.ELEMENT_NODE) {
1166
1178
  node = null;
1167
1179
  }
1168
1180
  return node;
@@ -1223,7 +1235,7 @@ export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventType
1223
1235
 
1224
1236
  simpleSelector(): string {
1225
1237
  const lowerCaseName = this.localName() || this.nodeName().toLowerCase();
1226
- if (this.nodeType() !== Node.ELEMENT_NODE) {
1238
+ if (this.nodeType() !== NodeType.ELEMENT_NODE) {
1227
1239
  return lowerCaseName;
1228
1240
  }
1229
1241
  const type = this.getAttribute('type');
@@ -1474,7 +1486,7 @@ export class DOMModel extends SDKModel<EventTypes> {
1474
1486
  #lastMutationId!: number;
1475
1487
  #pendingDocumentRequestPromise: Promise<DOMDocument|null>|null = null;
1476
1488
  #frameOwnerNode?: DOMNode|null;
1477
- #loadNodeAttributesTimeout?: number;
1489
+ #loadNodeAttributesTimeout?: ReturnType<typeof setTimeout>;
1478
1490
  #searchId?: string;
1479
1491
  #topLayerThrottler = new Common.Throttler.Throttler(100);
1480
1492
  #topLayerNodes: DOMNode[] = [];
@@ -1663,7 +1675,7 @@ export class DOMModel extends SDKModel<EventTypes> {
1663
1675
  inlineStyleInvalidated(nodeIds: Protocol.DOM.NodeId[]): void {
1664
1676
  nodeIds.forEach(nodeId => this.#attributeLoadNodeIds.add(nodeId));
1665
1677
  if (!this.#loadNodeAttributesTimeout) {
1666
- this.#loadNodeAttributesTimeout = window.setTimeout(this.loadNodeAttributes.bind(this), 20);
1678
+ this.#loadNodeAttributesTimeout = globalThis.setTimeout(this.loadNodeAttributes.bind(this), 20);
1667
1679
  }
1668
1680
  }
1669
1681