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.
- package/.agents/skills/devtools-testing-guidance/SKILL.md +4 -0
- package/.agents/skills/migrate-chromium-test/SKILL.md +63 -48
- package/.agents/skills/ui-eng-vision-local-lit-renderer/SKILL.md +14 -5
- package/.agents/skills/ui-eng-vision-logic-consolidator/SKILL.md +11 -2
- package/.agents/skills/ui-eng-vision-orchestrator/SKILL.md +46 -9
- package/.agents/skills/ui-eng-vision-test-scaffolder/SKILL.md +20 -1
- package/.agents/skills/ui-eng-vision-widget-promoter/SKILL.md +9 -0
- package/front_end/core/host/AidaClient.ts +115 -64
- package/front_end/core/host/GcaClient.ts +3 -3
- package/front_end/core/host/InspectorFrontendHostAPI.ts +1 -0
- package/front_end/core/host/InspectorFrontendHostStub.ts +3 -3
- package/front_end/core/host/UserMetrics.ts +50 -13
- package/front_end/core/sdk/CSSMatchedStyles.ts +2 -5
- package/front_end/core/sdk/CSSPropertyParserMatchers.ts +12 -0
- package/front_end/core/sdk/Connections.ts +1 -1
- package/front_end/core/sdk/DOMModel.test.api.ts +104 -0
- package/front_end/core/sdk/DOMModel.ts +23 -11
- package/front_end/core/sdk/DebuggerModel.ts +9 -9
- package/front_end/core/sdk/IsolateManager.ts +1 -1
- package/front_end/core/sdk/NetworkManager.ts +105 -4
- package/front_end/core/sdk/NetworkRequest.ts +10 -55
- package/front_end/core/sdk/OverlayModel.ts +15 -14
- package/front_end/core/sdk/RemoteObject.ts +1 -1
- package/front_end/devtools_compatibility.js +1 -0
- package/front_end/entrypoints/main/MainImpl.ts +5 -12
- package/front_end/entrypoints/main/SimpleApp.ts +9 -3
- package/front_end/foundation/Universe.ts +22 -0
- package/front_end/generated/InspectorBackendCommands.ts +2 -2
- package/front_end/generated/protocol.ts +2 -1
- package/front_end/models/ai_assistance/agents/AiAgent.ts +22 -13
- package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +23 -10
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +21 -5
- package/front_end/models/computed_style/ComputedStyleModel.ts +4 -7
- package/front_end/models/crux-manager/CrUXManager.ts +4 -0
- package/front_end/models/extensions/ExtensionAPI.ts +3 -3
- package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +2 -2
- package/front_end/models/issues_manager/CookieIssue.ts +6 -127
- package/front_end/models/issues_manager/descriptions/CoepCorpNotSameOrigin.md +2 -2
- package/front_end/models/issues_manager/descriptions/CoepCorpNotSameOriginAfterDefaultedToSameOriginByCoep.md +3 -3
- package/front_end/models/issues_manager/descriptions/CoepCorpNotSameSite.md +2 -2
- package/front_end/models/issues_manager/descriptions/CoepFrameResourceNeedsCoepHeader.md +1 -1
- package/front_end/models/issues_manager/descriptions/CompatibilityModeQuirks.md +1 -1
- package/front_end/models/issues_manager/descriptions/CookieAttributeValueExceedsMaxSize.md +2 -2
- package/front_end/models/issues_manager/descriptions/LowTextContrast.md +1 -1
- package/front_end/models/issues_manager/descriptions/SameSiteNoneInsecureErrorRead.md +1 -1
- package/front_end/models/issues_manager/descriptions/SameSiteNoneInsecureErrorSet.md +1 -1
- package/front_end/models/issues_manager/descriptions/SameSiteNoneInsecureWarnRead.md +1 -1
- package/front_end/models/issues_manager/descriptions/SameSiteNoneInsecureWarnSet.md +1 -1
- package/front_end/models/issues_manager/descriptions/SameSiteUnspecifiedLaxAllowUnsafeRead.md +3 -3
- package/front_end/models/issues_manager/descriptions/SameSiteUnspecifiedLaxAllowUnsafeSet.md +3 -3
- package/front_end/models/issues_manager/descriptions/bounceTrackingMitigations.md +1 -1
- package/front_end/models/issues_manager/descriptions/connectionAllowlistInvalidAllowlistItemType.md +2 -2
- package/front_end/models/issues_manager/descriptions/connectionAllowlistInvalidHeader.md +2 -2
- package/front_end/models/issues_manager/descriptions/connectionAllowlistInvalidUrlPattern.md +3 -3
- package/front_end/models/issues_manager/descriptions/connectionAllowlistItemNotInnerList.md +2 -2
- package/front_end/models/issues_manager/descriptions/connectionAllowlistMoreThanOneList.md +2 -2
- package/front_end/models/issues_manager/descriptions/connectionAllowlistReportingEndpointNotToken.md +1 -1
- package/front_end/models/issues_manager/descriptions/cookieCrossSiteRedirectDowngrade.md +3 -3
- package/front_end/models/issues_manager/descriptions/cookieExcludeBlockedWithinRelatedWebsiteSet.md +1 -1
- package/front_end/models/issues_manager/descriptions/cookieExcludePortMismatch.md +1 -1
- package/front_end/models/issues_manager/descriptions/cookieExcludeSchemeMismatch.md +1 -1
- package/front_end/models/issues_manager/descriptions/cookieExcludeThirdPartyPhaseoutSet.md +1 -1
- package/front_end/models/issues_manager/descriptions/cookieWarnThirdPartyPhaseoutRead.md +1 -1
- package/front_end/models/issues_manager/descriptions/corsAllowCredentialsRequired.md +1 -1
- package/front_end/models/issues_manager/descriptions/corsDisabledScheme.md +2 -2
- package/front_end/models/issues_manager/descriptions/corsDisallowedByMode.md +2 -2
- package/front_end/models/issues_manager/descriptions/corsHeaderDisallowedByPreflightResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/corsInvalidHeaderValues.md +3 -3
- package/front_end/models/issues_manager/descriptions/corsLocalNetworkAccessPermissionDenied.md +1 -1
- package/front_end/models/issues_manager/descriptions/corsMethodDisallowedByPreflightResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/corsNoCorsRedirectModeNotFollow.md +1 -1
- package/front_end/models/issues_manager/descriptions/corsOriginMismatch.md +3 -3
- package/front_end/models/issues_manager/descriptions/corsPreflightResponseInvalid.md +2 -2
- package/front_end/models/issues_manager/descriptions/corsRedirectContainsCredentials.md +3 -3
- package/front_end/models/issues_manager/descriptions/corsWildcardOriginNotAllowed.md +4 -3
- package/front_end/models/issues_manager/descriptions/cspEvalViolation.md +4 -4
- package/front_end/models/issues_manager/descriptions/cspInlineViolation.md +2 -2
- package/front_end/models/issues_manager/descriptions/cspTrustedTypesPolicyViolation.md +2 -2
- package/front_end/models/issues_manager/descriptions/cspTrustedTypesSinkViolation.md +4 -4
- package/front_end/models/issues_manager/descriptions/cspURLViolation.md +4 -4
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestAccountsEmptyList.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestAccountsHttpNotFound.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestAccountsInvalidContentType.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestAccountsInvalidResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestAccountsNoResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestDnsFetchFailed.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestDnsInvalidRecord.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestEmailVerificationWellKnownHttpNotFound.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestEmailVerificationWellKnownInvalidContentType.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestEmailVerificationWellKnownInvalidResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestEmailVerificationWellKnownNoResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestInvalidEmail.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestJwksHttpNotFound.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestJwksInvalidResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestKeyBindingSigningFailed.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestRpOriginIsOpaque.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenHttpNotFound.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenInvalidContentType.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenInvalidResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenInvalidSdJwt.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenMalformedSdJwt.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenNoResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbInvalidAudience.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbInvalidIssuedAt.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbInvalidNonce.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbInvalidSdHash.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbInvalidTyp.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbMissingAud.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbMissingCnf.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbMissingIat.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbMissingNonce.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbMissingSdHash.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbSignatureFailed.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidEmail.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidEmailVerified.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidHolderKey.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidIssuedAt.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidIssuer.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtJwksMissingKeys.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtMissingCnf.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtMissingEmail.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtMissingIat.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtMissingIss.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtSignatureFailed.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtUnsupportedHeaderAlg.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestUserLoggedOut.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownAccountsEndpointCrossOrigin.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownHttpNotFound.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownInvalidContentType.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownInvalidResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownIssuanceEndpointCrossOrigin.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownListEmpty.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownMissingAccountsEndpoint.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownMissingIssuanceEndpoint.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownNoResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownUnsupportedSigningAlgorithm.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestAccountsHttpNotFound.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestAccountsInvalidResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestAccountsNoResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestApprovalDeclined.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestCanceled.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestErrorFetchingSignin.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestErrorIdToken.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestIdTokenHttpNotFound.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestIdTokenInvalidRequest.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestIdTokenInvalidResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestIdTokenNoResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestInvalidSigninResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestManifestHttpNotFound.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestManifestInvalidResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestManifestNoResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthRequestTooManyRequests.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestInvalidAccountsResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestInvalidConfigOrWellKnown.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNoAccountSharingPermission.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNoApiPermission.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNoReturningUserFromFetchedAccounts.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotIframe.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotPotentiallyTrustworthy.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotSameOrigin.md +1 -1
- package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotSignedInWithIdp.md +1 -1
- package/front_end/models/issues_manager/descriptions/fetchingPartitionedBlobURL.md +2 -2
- package/front_end/models/issues_manager/descriptions/genericFormAriaLabelledByToNonExistingIdError.md +2 -2
- package/front_end/models/issues_manager/descriptions/genericFormAutocompleteAttributeEmptyError.md +1 -1
- package/front_end/models/issues_manager/descriptions/genericFormDuplicateIdForInputError.md +1 -1
- package/front_end/models/issues_manager/descriptions/genericFormEmptyIdAndNameAttributesForInputError.md +2 -2
- package/front_end/models/issues_manager/descriptions/genericFormInputAssignedAutocompleteValueToIdOrNameAttributeError.md +2 -2
- package/front_end/models/issues_manager/descriptions/genericFormInputHasWrongButWellIntendedAutocompleteValueError.md +1 -1
- package/front_end/models/issues_manager/descriptions/genericFormInputWithNoLabelError.md +1 -1
- package/front_end/models/issues_manager/descriptions/genericFormLabelForMatchesNonExistingIdError.md +2 -2
- package/front_end/models/issues_manager/descriptions/genericFormLabelForNameError.md +1 -1
- package/front_end/models/issues_manager/descriptions/genericFormLabelHasNeitherForNorNestedInputError.md +1 -1
- package/front_end/models/issues_manager/descriptions/genericFormModelContextMissingToolName.md +1 -1
- package/front_end/models/issues_manager/descriptions/genericFormModelContextParameterMissingName.md +1 -1
- package/front_end/models/issues_manager/descriptions/genericFormModelContextRequiredParameterMissingName.md +1 -1
- package/front_end/models/issues_manager/descriptions/genericNavigationEntryMarkedSkippable.md +2 -2
- package/front_end/models/issues_manager/descriptions/heavyAd.md +1 -1
- package/front_end/models/issues_manager/descriptions/lazyLoadImageZeroSize.md +1 -1
- package/front_end/models/issues_manager/descriptions/navigatingPartitionedBlobURL.md +3 -3
- package/front_end/models/issues_manager/descriptions/permissionElementActivationDisabled.md +1 -1
- package/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluder.md +1 -1
- package/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluderParent.md +1 -1
- package/front_end/models/issues_manager/descriptions/permissionElementFencedFrameDisallowed.md +2 -2
- package/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooLarge.md +2 -2
- package/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooSmall.md +2 -2
- package/front_end/models/issues_manager/descriptions/permissionElementInsetBoxShadowUnsupported.md +1 -1
- package/front_end/models/issues_manager/descriptions/permissionElementInvalidDisplayStyle.md +2 -2
- package/front_end/models/issues_manager/descriptions/permissionElementInvalidSizeValue.md +2 -2
- package/front_end/models/issues_manager/descriptions/permissionElementInvalidType.md +2 -2
- package/front_end/models/issues_manager/descriptions/permissionElementInvalidTypeActivation.md +2 -2
- package/front_end/models/issues_manager/descriptions/permissionElementNonOpaqueColor.md +1 -1
- package/front_end/models/issues_manager/descriptions/permissionElementPaddingBottomUnsupported.md +2 -2
- package/front_end/models/issues_manager/descriptions/permissionElementPaddingRightUnsupported.md +2 -2
- package/front_end/models/issues_manager/descriptions/permissionElementRequestInProgress.md +2 -2
- package/front_end/models/issues_manager/descriptions/permissionElementSecurityChecksFailed.md +1 -1
- package/front_end/models/issues_manager/descriptions/permissionElementTypeNotSupported.md +2 -2
- package/front_end/models/issues_manager/descriptions/permissionElementUntrustedEvent.md +1 -1
- package/front_end/models/issues_manager/descriptions/placeholderDescriptionForInvisibleIssues.md +1 -1
- package/front_end/models/issues_manager/descriptions/selectElementAccessibilityDisallowedOptGroupChild.md +1 -1
- package/front_end/models/issues_manager/descriptions/selectElementAccessibilityDisallowedSelectChild.md +1 -1
- package/front_end/models/issues_manager/descriptions/selectElementAccessibilityInteractiveContentAttributesSelectDescendant.md +1 -1
- package/front_end/models/issues_manager/descriptions/selectElementAccessibilityInteractiveContentLegendChild.md +1 -1
- package/front_end/models/issues_manager/descriptions/selectElementAccessibilityInteractiveContentOptionChild.md +1 -1
- package/front_end/models/issues_manager/descriptions/selectElementAccessibilityNonPhrasingContentOptionChild.md +1 -1
- package/front_end/models/issues_manager/descriptions/selectivePermissionsIntervention.md +3 -3
- package/front_end/models/issues_manager/descriptions/sharedArrayBuffer.md +1 -1
- package/front_end/models/issues_manager/descriptions/sharedDictionaryUseErrorCrossOriginNoCorsRequest.md +1 -1
- package/front_end/models/issues_manager/descriptions/sharedDictionaryUseErrorMatchingDictionaryNotUsed.md +1 -1
- package/front_end/models/issues_manager/descriptions/sharedDictionaryUseErrorUnexpectedContentDictionaryHeader.md +1 -1
- package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorCossOriginNoCorsRequest.md +1 -1
- package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorDisallowedBySettings.md +1 -1
- package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorExpiredResponse.md +1 -1
- package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorFeatureDisabled.md +2 -2
- package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorInvalidStructuredHeader.md +1 -1
- package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorNavigationRequest.md +2 -2
- package/front_end/models/issues_manager/descriptions/sriInvalidSignatureHeader.md +4 -4
- package/front_end/models/issues_manager/descriptions/sriInvalidSignatureInputHeader.md +4 -4
- package/front_end/models/issues_manager/descriptions/sriMissingSignatureHeader.md +1 -1
- package/front_end/models/issues_manager/descriptions/sriMissingSignatureInputHeader.md +2 -2
- package/front_end/models/issues_manager/descriptions/sriSignatureHeaderValueIsIncorrectLength.md +2 -2
- package/front_end/models/issues_manager/descriptions/sriSignatureHeaderValueIsNotByteSequence.md +4 -4
- package/front_end/models/issues_manager/descriptions/sriSignatureHeaderValueIsParameterized.md +4 -4
- package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidComponentName.md +1 -1
- package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidComponentType.md +2 -2
- package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidDerivedComponentParameter.md +1 -1
- package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidHeaderComponentParameter.md +1 -1
- package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidParameter.md +2 -2
- package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderKeyIdLength.md +5 -5
- package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderMissingLabel.md +3 -3
- package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderMissingRequiredParameters.md +2 -2
- package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderValueMissingComponents.md +2 -2
- package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderValueNotInnerList.md +2 -2
- package/front_end/models/issues_manager/descriptions/sriValidationFailedIntegrityMismatch.md +4 -4
- package/front_end/models/issues_manager/descriptions/sriValidationFailedInvalidLength.md +3 -3
- package/front_end/models/issues_manager/descriptions/sriValidationFailedSignatureExpired.md +2 -2
- package/front_end/models/issues_manager/descriptions/sriValidationFailedSignatureMismatch.md +2 -2
- package/front_end/models/issues_manager/descriptions/stylesheetLateImport.md +1 -1
- package/front_end/models/issues_manager/descriptions/summaryElementAccessibilityInteractiveContentSummaryDescendant.md +1 -1
- package/front_end/models/issues_manager/descriptions/unencodedDigestIncorrectDigestLength.md +2 -2
- package/front_end/models/issues_manager/descriptions/unencodedDigestIncorrectDigestType.md +3 -3
- package/front_end/models/issues_manager/descriptions/unencodedDigestMalformedDictionary.md +2 -2
- package/front_end/models/issues_manager/descriptions/unencodedDigestUnknownAlgorithm.md +1 -1
- package/front_end/models/live-metrics/LiveMetrics.ts +59 -19
- package/front_end/models/live-metrics/web-vitals-injected/README.md +1 -1
- package/front_end/models/live-metrics/web-vitals-injected/spec/spec.ts +6 -1
- package/front_end/models/live-metrics/web-vitals-injected/web-vitals-injected.ts +11 -3
- package/front_end/models/logs/LogManager.ts +1 -1
- package/front_end/models/persistence/FileSystemWorkspaceBinding.ts +1 -1
- package/front_end/models/source_map_scopes/FunctionCodeResolver.ts +6 -7
- package/front_end/models/workspace_diff/WorkspaceDiff.ts +13 -14
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +15 -7
- package/front_end/panels/application/BackgroundServiceView.ts +18 -20
- package/front_end/panels/application/DOMStorageItemsView.ts +1 -2
- package/front_end/panels/application/KeyValueStorageItemsView.ts +12 -0
- package/front_end/panels/autofill/AutofillView.ts +17 -17
- package/front_end/panels/autofill/autofillView.css +7 -8
- package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +31 -31
- package/front_end/panels/browser_debugger/DOMBreakpointsSidebarPane.ts +15 -15
- package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +12 -12
- package/front_end/panels/browser_debugger/browser_debugger-meta.ts +27 -27
- package/front_end/panels/common/AiCodeCompletionDisclaimer.ts +14 -6
- package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +14 -6
- package/front_end/panels/common/AiCodeCompletionTeaser.ts +13 -6
- package/front_end/panels/common/GeminiRebrandPromoDialog.ts +1 -1
- package/front_end/panels/console/ConsoleInsightTeaser.ts +13 -6
- package/front_end/panels/console/ConsoleView.ts +6 -6
- package/front_end/panels/console_counters/WarningErrorCounter.ts +4 -4
- package/front_end/panels/coverage/CoverageModel.ts +11 -1
- package/front_end/panels/elements/StylePropertiesSection.ts +59 -10
- package/front_end/panels/elements/StylesAiCodeCompletionProvider.ts +18 -7
- package/front_end/panels/elements/StylesSidebarPane.ts +48 -0
- package/front_end/panels/emulation/AdvancedApp.ts +18 -8
- package/front_end/panels/emulation/DeviceModeToolbar.ts +0 -1
- package/front_end/panels/emulation/DeviceModeView.ts +289 -164
- package/front_end/panels/emulation/MediaQueryInspector.ts +10 -6
- package/front_end/panels/emulation/deviceModeView.css +1 -0
- package/front_end/panels/event_listeners/EventListenersView.ts +8 -8
- package/front_end/panels/explain/components/ConsoleInsight.ts +15 -7
- package/front_end/panels/lighthouse/LighthouseController.ts +1 -6
- package/front_end/panels/network/NetworkLogView.ts +13 -14
- package/front_end/panels/screencast/ScreencastApp.ts +12 -6
- package/front_end/panels/screencast/ScreencastView.ts +37 -11
- package/front_end/panels/sensors/locationsSettingsTab.css +4 -0
- package/front_end/panels/settings/AISettingsTab.ts +13 -6
- package/front_end/panels/sources/DebuggerPlugin.ts +13 -2
- package/front_end/panels/sources/breakpointEditDialog.css +2 -2
- package/front_end/panels/timeline/components/LiveMetricsView.ts +14 -1
- package/front_end/panels/timeline/components/cpuThrottlingSelector.css +4 -0
- package/front_end/panels/timeline/components/liveMetricsView.css +28 -0
- package/front_end/panels/timeline/timeline-meta.ts +13 -0
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/ui/components/menus/menu.css +4 -0
- package/front_end/ui/components/menus/menuItem.css +4 -0
- package/front_end/ui/components/menus/selectMenu.css +4 -0
- package/front_end/ui/components/menus/selectMenuButton.css +4 -0
- package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +21 -10
- package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +23 -12
- package/front_end/ui/components/text_editor/config.ts +7 -0
- package/front_end/ui/legacy/AppProvider.ts +2 -1
- package/front_end/ui/legacy/RootView.ts +8 -1
- package/front_end/ui/legacy/UniverseRequestEvent.ts +19 -0
- package/front_end/ui/legacy/Widget.ts +49 -6
- package/front_end/ui/legacy/inspectorCommon.css +1 -1
- package/front_end/ui/legacy/legacy.ts +2 -0
- package/front_end/ui/visual_logging/KnownContextValues.ts +2 -0
- package/package.json +1 -2
- package/front_end/models/issues_manager/descriptions/SameSiteExcludeContextDowngradeRead.md +0 -8
- package/front_end/models/issues_manager/descriptions/SameSiteExcludeContextDowngradeSet.md +0 -8
- package/front_end/models/issues_manager/descriptions/SameSiteExcludeNavigationContextDowngrade.md +0 -8
- package/front_end/models/issues_manager/descriptions/SameSiteWarnCrossDowngradeRead.md +0 -8
- package/front_end/models/issues_manager/descriptions/SameSiteWarnCrossDowngradeSet.md +0 -8
- 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
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
export class
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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]:
|
|
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,
|
|
95
|
-
|
|
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
|
-
|
|
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
|
-
|
|
121
|
+
globalThis.setTimeout(callback, 0);
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
showSurvey(_trigger: string, callback: (arg0: ShowSurveyResult) => void): void {
|
|
125
|
-
|
|
125
|
+
globalThis.setTimeout(() => callback({surveyShown: false}), 0);
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
canShowSurvey(_trigger: string, callback: (arg0: CanShowSurveyResult) => void): void {
|
|
129
|
-
|
|
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
|
-
|
|
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
|
|
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() ===
|
|
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
|
-
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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() ===
|
|
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() ===
|
|
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() !==
|
|
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() ===
|
|
1173
|
+
if (node && node.nodeType() === NodeType.TEXT_NODE && node.parentNode) {
|
|
1162
1174
|
node = node.parentNode;
|
|
1163
1175
|
}
|
|
1164
1176
|
|
|
1165
|
-
if (node && node.nodeType() !==
|
|
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() !==
|
|
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?:
|
|
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 =
|
|
1678
|
+
this.#loadNodeAttributesTimeout = globalThis.setTimeout(this.loadNodeAttributes.bind(this), 20);
|
|
1667
1679
|
}
|
|
1668
1680
|
}
|
|
1669
1681
|
|