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
|
@@ -6,6 +6,7 @@ import '../../ui/components/spinners/spinners.js';
|
|
|
6
6
|
import '../../ui/components/tooltips/tooltips.js';
|
|
7
7
|
import '../../ui/kit/kit.js';
|
|
8
8
|
|
|
9
|
+
import type * as Common from '../../core/common/common.js';
|
|
9
10
|
import * as Host from '../../core/host/host.js';
|
|
10
11
|
import * as i18n from '../../core/i18n/i18n.js';
|
|
11
12
|
import type * as AiCodeCompletion from '../../models/ai_code_completion/ai_code_completion.js';
|
|
@@ -116,7 +117,8 @@ export class AiCodeCompletionSummaryToolbar extends UI.Widget.Widget {
|
|
|
116
117
|
#panel: AiCodeCompletion.AiCodeCompletion.ContextFlavor;
|
|
117
118
|
|
|
118
119
|
#aidaAvailability?: Host.AidaClient.AidaAccessPreconditions;
|
|
119
|
-
#boundOnAidaAvailabilityChange:
|
|
120
|
+
#boundOnAidaAvailabilityChange:
|
|
121
|
+
(ev: Common.EventTarget.EventTargetEvent<Host.AidaClient.AidaAccessPreconditions>) => void;
|
|
120
122
|
|
|
121
123
|
constructor(props: AiCodeCompletionSummaryToolbarProps, view?: View) {
|
|
122
124
|
super();
|
|
@@ -130,14 +132,17 @@ export class AiCodeCompletionSummaryToolbar extends UI.Widget.Widget {
|
|
|
130
132
|
this.requestUpdate();
|
|
131
133
|
}
|
|
132
134
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
this.#aidaAvailability = currentAidaAvailability;
|
|
135
|
+
#updateAidaAvailability(aidaAvailability: Host.AidaClient.AidaAccessPreconditions): void {
|
|
136
|
+
if (aidaAvailability !== this.#aidaAvailability) {
|
|
137
|
+
this.#aidaAvailability = aidaAvailability;
|
|
137
138
|
this.requestUpdate();
|
|
138
139
|
}
|
|
139
140
|
}
|
|
140
141
|
|
|
142
|
+
#onAidaAvailabilityChange(ev: Common.EventTarget.EventTargetEvent<Host.AidaClient.AidaAccessPreconditions>): void {
|
|
143
|
+
this.#updateAidaAvailability(ev.data);
|
|
144
|
+
}
|
|
145
|
+
|
|
141
146
|
setLoading(loading: boolean): void {
|
|
142
147
|
this.#loading = loading;
|
|
143
148
|
this.requestUpdate();
|
|
@@ -172,7 +177,10 @@ export class AiCodeCompletionSummaryToolbar extends UI.Widget.Widget {
|
|
|
172
177
|
super.wasShown();
|
|
173
178
|
Host.AidaClient.HostConfigTracker.instance().addEventListener(
|
|
174
179
|
Host.AidaClient.Events.AIDA_AVAILABILITY_CHANGED, this.#boundOnAidaAvailabilityChange);
|
|
175
|
-
|
|
180
|
+
const initialAvailability = Host.AidaClient.HostConfigTracker.instance().aidaAvailability;
|
|
181
|
+
if (initialAvailability !== undefined) {
|
|
182
|
+
this.#updateAidaAvailability(initialAvailability);
|
|
183
|
+
}
|
|
176
184
|
}
|
|
177
185
|
|
|
178
186
|
override willHide(): void {
|
|
@@ -171,7 +171,8 @@ export class AiCodeCompletionTeaser extends UI.Widget.Widget {
|
|
|
171
171
|
readonly #view: View;
|
|
172
172
|
|
|
173
173
|
#aidaAvailability?: Host.AidaClient.AidaAccessPreconditions;
|
|
174
|
-
#boundOnAidaAvailabilityChange:
|
|
174
|
+
#boundOnAidaAvailabilityChange:
|
|
175
|
+
(ev: Common.EventTarget.EventTargetEvent<Host.AidaClient.AidaAccessPreconditions>) => void;
|
|
175
176
|
#boundOnAiCodeCompletionSettingChanged: () => void;
|
|
176
177
|
#onDetach: () => void;
|
|
177
178
|
#panel?: AiCodeCompletion.AiCodeCompletion.ContextFlavor;
|
|
@@ -211,14 +212,17 @@ export class AiCodeCompletionTeaser extends UI.Widget.Widget {
|
|
|
211
212
|
});
|
|
212
213
|
}
|
|
213
214
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
this.#aidaAvailability = currentAidaAvailability;
|
|
215
|
+
#updateAidaAvailability(aidaAvailability: Host.AidaClient.AidaAccessPreconditions): void {
|
|
216
|
+
if (aidaAvailability !== this.#aidaAvailability) {
|
|
217
|
+
this.#aidaAvailability = aidaAvailability;
|
|
218
218
|
this.requestUpdate();
|
|
219
219
|
}
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
+
#onAidaAvailabilityChange(ev: Common.EventTarget.EventTargetEvent<Host.AidaClient.AidaAccessPreconditions>): void {
|
|
223
|
+
this.#updateAidaAvailability(ev.data);
|
|
224
|
+
}
|
|
225
|
+
|
|
222
226
|
#onAiCodeCompletionSettingChanged(): void {
|
|
223
227
|
if (this.#aiCodeCompletionFreCompletedSetting.get() || this.#aiCodeCompletionTeaserDismissedSetting.get()) {
|
|
224
228
|
this.detach();
|
|
@@ -322,7 +326,10 @@ export class AiCodeCompletionTeaser extends UI.Widget.Widget {
|
|
|
322
326
|
Host.AidaClient.Events.AIDA_AVAILABILITY_CHANGED, this.#boundOnAidaAvailabilityChange);
|
|
323
327
|
this.#aiCodeCompletionFreCompletedSetting.addChangeListener(this.#boundOnAiCodeCompletionSettingChanged);
|
|
324
328
|
this.#aiCodeCompletionTeaserDismissedSetting.addChangeListener(this.#boundOnAiCodeCompletionSettingChanged);
|
|
325
|
-
|
|
329
|
+
const initialAvailability = Host.AidaClient.HostConfigTracker.instance().aidaAvailability;
|
|
330
|
+
if (initialAvailability !== undefined) {
|
|
331
|
+
this.#updateAidaAvailability(initialAvailability);
|
|
332
|
+
}
|
|
326
333
|
}
|
|
327
334
|
|
|
328
335
|
override willHide(): void {
|
|
@@ -177,7 +177,7 @@ export class GeminiRebrandPromoDialog extends UI.Widget.VBox {
|
|
|
177
177
|
return;
|
|
178
178
|
}
|
|
179
179
|
|
|
180
|
-
const currentAidaAvailability =
|
|
180
|
+
const currentAidaAvailability = Host.AidaClient.HostConfigTracker.instance().aidaAvailability;
|
|
181
181
|
if (currentAidaAvailability !== Host.AidaClient.AidaAccessPreconditions.AVAILABLE) {
|
|
182
182
|
return;
|
|
183
183
|
}
|
|
@@ -409,7 +409,8 @@ export class ConsoleInsightTeaser extends UI.Widget.Widget {
|
|
|
409
409
|
#isSlow = false;
|
|
410
410
|
#timeoutId: ReturnType<typeof setTimeout>|null = null;
|
|
411
411
|
#aidaAvailability?: Host.AidaClient.AidaAccessPreconditions;
|
|
412
|
-
#boundOnAidaAvailabilityChange:
|
|
412
|
+
#boundOnAidaAvailabilityChange:
|
|
413
|
+
(ev: Common.EventTarget.EventTargetEvent<Host.AidaClient.AidaAccessPreconditions>) => void;
|
|
413
414
|
#boundOnDownloadProgressChange: (event: Common.EventTarget.EventTargetEvent<number>) => void;
|
|
414
415
|
#boundOnSessionCreation: () => void;
|
|
415
416
|
#downloadProgress: number|null = null;
|
|
@@ -448,14 +449,17 @@ export class ConsoleInsightTeaser extends UI.Widget.Widget {
|
|
|
448
449
|
return Common.Settings.Settings.instance().createLocalSetting('console-insights-onboarding-finished', true);
|
|
449
450
|
}
|
|
450
451
|
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
this.#aidaAvailability = currentAidaAvailability;
|
|
452
|
+
#updateAidaAvailability(aidaAvailability: Host.AidaClient.AidaAccessPreconditions): void {
|
|
453
|
+
if (aidaAvailability !== this.#aidaAvailability) {
|
|
454
|
+
this.#aidaAvailability = aidaAvailability;
|
|
455
455
|
this.requestUpdate();
|
|
456
456
|
}
|
|
457
457
|
}
|
|
458
458
|
|
|
459
|
+
#onAidaAvailabilityChange(ev: Common.EventTarget.EventTargetEvent<Host.AidaClient.AidaAccessPreconditions>): void {
|
|
460
|
+
this.#updateAidaAvailability(ev.data);
|
|
461
|
+
}
|
|
462
|
+
|
|
459
463
|
#executeConsoleInsightAction(): void {
|
|
460
464
|
UI.Context.Context.instance().setFlavor(ConsoleViewMessage, this.#consoleViewMessage);
|
|
461
465
|
const action = UI.ActionRegistry.ActionRegistry.instance().getAction(EXPLAIN_TEASER_ACTION_ID);
|
|
@@ -731,7 +735,10 @@ export class ConsoleInsightTeaser extends UI.Widget.Widget {
|
|
|
731
735
|
super.wasShown();
|
|
732
736
|
Host.AidaClient.HostConfigTracker.instance().addEventListener(
|
|
733
737
|
Host.AidaClient.Events.AIDA_AVAILABILITY_CHANGED, this.#boundOnAidaAvailabilityChange);
|
|
734
|
-
|
|
738
|
+
const initialAvailability = Host.AidaClient.HostConfigTracker.instance().aidaAvailability;
|
|
739
|
+
if (initialAvailability !== undefined) {
|
|
740
|
+
this.#updateAidaAvailability(initialAvailability);
|
|
741
|
+
}
|
|
735
742
|
}
|
|
736
743
|
|
|
737
744
|
override willHide(): void {
|
|
@@ -196,9 +196,9 @@ const UIStrings = {
|
|
|
196
196
|
*/
|
|
197
197
|
copyVisibleStyledSelection: 'Copy visible styled selection',
|
|
198
198
|
/**
|
|
199
|
-
* @description Text to
|
|
199
|
+
* @description Text to resend a network request.
|
|
200
200
|
*/
|
|
201
|
-
|
|
201
|
+
resend: 'Resend',
|
|
202
202
|
/**
|
|
203
203
|
* @description Text to indicate DevTools is writing to a file.
|
|
204
204
|
*/
|
|
@@ -1338,10 +1338,10 @@ export class ConsoleView extends UI.Widget.VBox implements
|
|
|
1338
1338
|
|
|
1339
1339
|
if (consoleMessage) {
|
|
1340
1340
|
const request = Logs.NetworkLog.NetworkLog.requestForConsoleMessage(consoleMessage);
|
|
1341
|
-
if (request && SDK.NetworkManager.NetworkManager.
|
|
1342
|
-
contextMenu.debugSection().appendItem(
|
|
1343
|
-
|
|
1344
|
-
|
|
1341
|
+
if (request && SDK.NetworkManager.NetworkManager.canResendRequest(request)) {
|
|
1342
|
+
contextMenu.debugSection().appendItem(i18nString(UIStrings.resend),
|
|
1343
|
+
SDK.NetworkManager.NetworkManager.replayRequest.bind(null, request),
|
|
1344
|
+
{jslogContext: 'resend'});
|
|
1345
1345
|
}
|
|
1346
1346
|
}
|
|
1347
1347
|
|
|
@@ -19,20 +19,20 @@ const {html, nothing, render} = Lit;
|
|
|
19
19
|
|
|
20
20
|
const UIStrings = {
|
|
21
21
|
/**
|
|
22
|
-
* @description The console error count in the Warning Error Counter shown in the main toolbar (top-left in DevTools). The error count refers to the number of errors currently present in the
|
|
22
|
+
* @description The console error count in the Warning Error Counter shown in the main toolbar (top-left in DevTools). The error count refers to the number of errors currently present in the Console.
|
|
23
23
|
*/
|
|
24
24
|
sErrors: '{n, plural, =1 {# error} other {# errors}}',
|
|
25
25
|
/**
|
|
26
|
-
* @description The console warning count in the Warning Error Counter shown in the main toolbar (top-left in DevTools). The warning count refers to the number of warnings currently present in the
|
|
26
|
+
* @description The console warning count in the Warning Error Counter shown in the main toolbar (top-left in DevTools). The warning count refers to the number of warnings currently present in the Console.
|
|
27
27
|
*/
|
|
28
28
|
sWarnings: '{n, plural, =1 {# warning} other {# warnings}}',
|
|
29
29
|
/**
|
|
30
|
-
* @description Tooltip shown for a main toolbar button that opens the Console panel
|
|
30
|
+
* @description Tooltip shown for a main toolbar button that opens the Console panel.
|
|
31
31
|
* @example {2 errors, 1 warning} PH1
|
|
32
32
|
*/
|
|
33
33
|
openConsoleToViewS: 'Open Console to view {PH1}',
|
|
34
34
|
/**
|
|
35
|
-
* @description Title for the issues count in the Issues Error Counter shown in the main toolbar (top-left in DevTools). The issues count refers to the number of issues in the
|
|
35
|
+
* @description Title for the issues count in the Issues Error Counter shown in the main toolbar (top-left in DevTools). The issues count refers to the number of issues in the Issues tab.
|
|
36
36
|
*/
|
|
37
37
|
openIssuesToView: '{n, plural, =1 {Open Issues to view # issue:} other {Open Issues to view # issues:}}',
|
|
38
38
|
} as const;
|
|
@@ -61,6 +61,7 @@ export class CoverageModel extends SDK.SDKModel.SDKModel<EventTypes> {
|
|
|
61
61
|
private sourceMapManager: SDK.SourceMapManager.SourceMapManager<SDK.Script.Script>|null;
|
|
62
62
|
private willResolveSourceMaps: boolean;
|
|
63
63
|
private processSourceMapBacklog: SourceMapObject[];
|
|
64
|
+
private isPolling: boolean;
|
|
64
65
|
|
|
65
66
|
constructor(target: SDK.Target.Target) {
|
|
66
67
|
super(target);
|
|
@@ -88,6 +89,7 @@ export class CoverageModel extends SDK.SDKModel.SDKModel<EventTypes> {
|
|
|
88
89
|
this.performanceTraceRecording = false;
|
|
89
90
|
this.willResolveSourceMaps = false;
|
|
90
91
|
this.processSourceMapBacklog = [];
|
|
92
|
+
this.isPolling = false;
|
|
91
93
|
}
|
|
92
94
|
|
|
93
95
|
async start(jsCoveragePerBlock: boolean): Promise<boolean> {
|
|
@@ -184,22 +186,30 @@ export class CoverageModel extends SDK.SDKModel.SDKModel<EventTypes> {
|
|
|
184
186
|
}
|
|
185
187
|
|
|
186
188
|
async startPolling(): Promise<void> {
|
|
187
|
-
if (this.
|
|
189
|
+
if (this.isPolling || this.suspensionState !== SuspensionState.ACTIVE) {
|
|
188
190
|
return;
|
|
189
191
|
}
|
|
192
|
+
this.isPolling = true;
|
|
190
193
|
await this.pollLoop();
|
|
191
194
|
}
|
|
192
195
|
|
|
193
196
|
private async pollLoop(): Promise<void> {
|
|
194
197
|
this.clearTimer();
|
|
198
|
+
if (!this.isPolling) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
195
201
|
this.currentPollPromise = this.pollAndCallback();
|
|
196
202
|
await this.currentPollPromise;
|
|
203
|
+
if (!this.isPolling) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
197
206
|
if (this.suspensionState === SuspensionState.ACTIVE || this.performanceTraceRecording) {
|
|
198
207
|
this.pollTimer = window.setTimeout(() => this.pollLoop(), COVERAGE_POLLING_PERIOD_MS);
|
|
199
208
|
}
|
|
200
209
|
}
|
|
201
210
|
|
|
202
211
|
async stopPolling(): Promise<void> {
|
|
212
|
+
this.isPolling = false;
|
|
203
213
|
this.clearTimer();
|
|
204
214
|
await this.currentPollPromise;
|
|
205
215
|
this.currentPollPromise = null;
|
|
@@ -154,7 +154,7 @@ export class StylePropertiesSection {
|
|
|
154
154
|
private parentsComputedStyles: Map<string, string>|null;
|
|
155
155
|
private computedStyleExtraFields: Protocol.CSS.ComputedStyleExtraFields|null;
|
|
156
156
|
editable: boolean;
|
|
157
|
-
private hoverTimer:
|
|
157
|
+
private hoverTimer: ReturnType<typeof setTimeout>|null = null;
|
|
158
158
|
private willCauseCancelEditing = false;
|
|
159
159
|
private forceShowAll = false;
|
|
160
160
|
private readonly originalPropertiesCount: number;
|
|
@@ -275,7 +275,11 @@ export class StylePropertiesSection {
|
|
|
275
275
|
this.selectorElement.classList.add('selector');
|
|
276
276
|
this.selectorElement.textContent = headerText;
|
|
277
277
|
selectorContainer.appendChild(this.selectorElement);
|
|
278
|
-
this.selectorElement.addEventListener('mouseenter',
|
|
278
|
+
this.selectorElement.addEventListener('mouseenter', () => {
|
|
279
|
+
if (this.styleInternal.parentRule instanceof SDK.CSSRule.CSSStyleRule) {
|
|
280
|
+
this.onMouseEnterSelector(this.styleInternal.parentRule);
|
|
281
|
+
}
|
|
282
|
+
}, false);
|
|
279
283
|
this.selectorElement.addEventListener('mouseleave', this.onMouseOutSelector.bind(this), false);
|
|
280
284
|
this.#specificityTooltips = selectorContainer.createChild('span');
|
|
281
285
|
|
|
@@ -679,23 +683,31 @@ export class StylePropertiesSection {
|
|
|
679
683
|
SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
|
|
680
684
|
}
|
|
681
685
|
|
|
682
|
-
private onMouseEnterSelector(): void {
|
|
686
|
+
private onMouseEnterSelector(rule: SDK.CSSRule.CSSStyleRule, nestingIndex?: number): void {
|
|
683
687
|
if (this.hoverTimer) {
|
|
684
688
|
clearTimeout(this.hoverTimer);
|
|
685
689
|
}
|
|
686
|
-
|
|
690
|
+
const selectorList = constructResolvedSelector(rule, nestingIndex);
|
|
691
|
+
if (!selectorList) {
|
|
692
|
+
return;
|
|
693
|
+
}
|
|
694
|
+
this.hoverTimer = setTimeout(this.highlight.bind(this, undefined, selectorList), 300);
|
|
687
695
|
}
|
|
688
696
|
|
|
689
|
-
|
|
697
|
+
/**
|
|
698
|
+
* Highlights the DOM node associated with this style section in the page overlay.
|
|
699
|
+
* Use `selectorList` to highlight elements matching a specific parent/ancestor
|
|
700
|
+
* rule or selector.
|
|
701
|
+
*
|
|
702
|
+
* @param mode Highlight mode (defaults to `'all'`).
|
|
703
|
+
* @param selectorList Parent selector string to highlight.
|
|
704
|
+
*/
|
|
705
|
+
highlight(mode: string|undefined = 'all', selectorList: string): void {
|
|
690
706
|
SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight(SDK.TargetManager.TargetManager.instance());
|
|
691
707
|
const node = this.stylesContainer.node();
|
|
692
708
|
if (!node) {
|
|
693
709
|
return;
|
|
694
710
|
}
|
|
695
|
-
const selectorList =
|
|
696
|
-
this.styleInternal.parentRule && this.styleInternal.parentRule instanceof SDK.CSSRule.CSSStyleRule ?
|
|
697
|
-
this.styleInternal.parentRule.selectorText() :
|
|
698
|
-
undefined;
|
|
699
711
|
node.domModel().overlayModel().highlightInOverlay({node, selectorList}, mode);
|
|
700
712
|
}
|
|
701
713
|
|
|
@@ -1140,6 +1152,8 @@ export class StylePropertiesSection {
|
|
|
1140
1152
|
}
|
|
1141
1153
|
|
|
1142
1154
|
const selectorElement = container.createChild('span', 'selector');
|
|
1155
|
+
selectorElement.addEventListener('mouseenter', () => this.onMouseEnterSelector(parentRule), false);
|
|
1156
|
+
selectorElement.addEventListener('mouseleave', this.onMouseOutSelector.bind(this), false);
|
|
1143
1157
|
const specificityContainer = container.createChild('span');
|
|
1144
1158
|
this.renderSelectorsToElement(parentRule.selectors, matchingSelectors, this.elementToSelectorIndex,
|
|
1145
1159
|
selectorElement, specificityContainer);
|
|
@@ -1150,6 +1164,8 @@ export class StylePropertiesSection {
|
|
|
1150
1164
|
}
|
|
1151
1165
|
|
|
1152
1166
|
const nestingElement = document.createElement('div');
|
|
1167
|
+
nestingElement.addEventListener('mouseenter', () => this.onMouseEnterSelector(rule, nestingIndex), false);
|
|
1168
|
+
nestingElement.addEventListener('mouseleave', this.onMouseOutSelector.bind(this), false);
|
|
1153
1169
|
nestingElement.textContent = `${nestingSelector} {`;
|
|
1154
1170
|
return nestingElement;
|
|
1155
1171
|
}
|
|
@@ -1502,7 +1518,7 @@ export class StylePropertiesSection {
|
|
|
1502
1518
|
}
|
|
1503
1519
|
|
|
1504
1520
|
markSelectorHighlights(): void {
|
|
1505
|
-
const selectors = this.
|
|
1521
|
+
const selectors = this.element.getElementsByClassName('simple-selector');
|
|
1506
1522
|
const regex = this.stylesContainer.filterRegex();
|
|
1507
1523
|
for (let i = 0; i < selectors.length; ++i) {
|
|
1508
1524
|
const selectorMatchesFilter = regex?.test(selectors[i].textContent || '');
|
|
@@ -2257,3 +2273,36 @@ export class HighlightPseudoStylePropertiesSection extends StylePropertiesSectio
|
|
|
2257
2273
|
interface TreeElementParent {
|
|
2258
2274
|
appendChild(child: UI.TreeOutline.TreeElement): void;
|
|
2259
2275
|
}
|
|
2276
|
+
|
|
2277
|
+
export function constructResolvedSelector(rule: SDK.CSSRule.CSSRule|null, nestingIndex?: number): string|undefined {
|
|
2278
|
+
if (!(rule instanceof SDK.CSSRule.CSSStyleRule)) {
|
|
2279
|
+
return undefined;
|
|
2280
|
+
}
|
|
2281
|
+
|
|
2282
|
+
const nestingSelectors = rule.nestingSelectors;
|
|
2283
|
+
if (!nestingSelectors) {
|
|
2284
|
+
return nestingIndex === undefined ? rule.selectorText() : undefined;
|
|
2285
|
+
}
|
|
2286
|
+
|
|
2287
|
+
if (nestingIndex !== undefined && (nestingIndex < 0 || nestingIndex >= nestingSelectors.length)) {
|
|
2288
|
+
return undefined;
|
|
2289
|
+
}
|
|
2290
|
+
|
|
2291
|
+
const selectorText = nestingIndex !== undefined ? nestingSelectors[nestingIndex] : rule.selectorText();
|
|
2292
|
+
|
|
2293
|
+
const parentIndex = nestingIndex !== undefined ? nestingIndex + 1 : 0;
|
|
2294
|
+
const parentSelector = constructResolvedSelector(rule, parentIndex);
|
|
2295
|
+
|
|
2296
|
+
if (!parentSelector) {
|
|
2297
|
+
return selectorText;
|
|
2298
|
+
}
|
|
2299
|
+
|
|
2300
|
+
// Strip pseudo-elements (e.g. ::before) because pseudo-elements are invalid inside CSS :is(...).
|
|
2301
|
+
const sanitizedParent = parentSelector.replace(/::[a-zA-Z-]+/g, '').trim();
|
|
2302
|
+
|
|
2303
|
+
if (selectorText.includes('&')) {
|
|
2304
|
+
return selectorText.replaceAll('&', `:is(${sanitizedParent})`);
|
|
2305
|
+
}
|
|
2306
|
+
|
|
2307
|
+
return `:is(${sanitizedParent}) ${selectorText.trim()}`;
|
|
2308
|
+
}
|
|
@@ -29,17 +29,29 @@ export class StylesAiCodeCompletionProvider {
|
|
|
29
29
|
sampleId?: number,
|
|
30
30
|
}|null) => void;
|
|
31
31
|
|
|
32
|
-
#
|
|
32
|
+
#boundOnAidaAvailabilityChange =
|
|
33
|
+
(ev: Common.EventTarget.EventTargetEvent<Host.AidaClient.AidaAccessPreconditions>): void => {
|
|
34
|
+
this.#updateAiCodeCompletionStateWithAvailability(ev.data);
|
|
35
|
+
};
|
|
36
|
+
#boundOnSettingChange = (): void => {
|
|
37
|
+
const aidaAvailability = Host.AidaClient.HostConfigTracker.instance().aidaAvailability;
|
|
38
|
+
if (aidaAvailability !== undefined) {
|
|
39
|
+
this.#updateAiCodeCompletionStateWithAvailability(aidaAvailability);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
33
42
|
|
|
34
43
|
private constructor(aiCodeCompletionConfig: TextEditor.AiCodeCompletionProvider.AiCodeCompletionConfig) {
|
|
35
44
|
if (!AiCodeCompletion.AiCodeCompletion.AiCodeCompletion.isAiCodeCompletionStylesAvailable()) {
|
|
36
45
|
throw new Error('AI code completion feature in Styles is not available.');
|
|
37
46
|
}
|
|
38
47
|
this.#aiCodeCompletionConfig = aiCodeCompletionConfig;
|
|
39
|
-
Host.AidaClient.HostConfigTracker.instance().addEventListener(
|
|
40
|
-
|
|
41
|
-
this.#aiCodeCompletionSetting.addChangeListener(this.#
|
|
42
|
-
|
|
48
|
+
Host.AidaClient.HostConfigTracker.instance().addEventListener(Host.AidaClient.Events.AIDA_AVAILABILITY_CHANGED,
|
|
49
|
+
this.#boundOnAidaAvailabilityChange);
|
|
50
|
+
this.#aiCodeCompletionSetting.addChangeListener(this.#boundOnSettingChange);
|
|
51
|
+
const initialAvailability = Host.AidaClient.HostConfigTracker.instance().aidaAvailability;
|
|
52
|
+
if (initialAvailability !== undefined) {
|
|
53
|
+
this.#updateAiCodeCompletionStateWithAvailability(initialAvailability);
|
|
54
|
+
}
|
|
43
55
|
}
|
|
44
56
|
|
|
45
57
|
static createInstance(aiCodeCompletionConfig: TextEditor.AiCodeCompletionProvider.AiCodeCompletionConfig):
|
|
@@ -78,8 +90,7 @@ export class StylesAiCodeCompletionProvider {
|
|
|
78
90
|
this.#aiCodeCompletionConfig?.onFeatureDisabled();
|
|
79
91
|
}
|
|
80
92
|
|
|
81
|
-
|
|
82
|
-
const aidaAvailability = await Host.AidaClient.AidaClient.checkAccessPreconditions();
|
|
93
|
+
#updateAiCodeCompletionStateWithAvailability(aidaAvailability: Host.AidaClient.AidaAccessPreconditions): void {
|
|
83
94
|
const isAvailable = aidaAvailability === Host.AidaClient.AidaAccessPreconditions.AVAILABLE;
|
|
84
95
|
const devtoolsLocale = i18n.DevToolsLocale.DevToolsLocale.instance().locale;
|
|
85
96
|
const isEnabled =
|
|
@@ -235,6 +235,7 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
|
|
|
235
235
|
#shouldRenderLazily = false;
|
|
236
236
|
#lazyRenderObserver?: IntersectionObserver;
|
|
237
237
|
#lazyRenderCallbacks = new WeakMap<Element, () => void>();
|
|
238
|
+
#elementsForSyncViewportCheck: Element[] = [];
|
|
238
239
|
#updateId = 0;
|
|
239
240
|
|
|
240
241
|
constructor(computedStyleModel: ComputedStyle.ComputedStyleModel.ComputedStyleModel) {
|
|
@@ -990,6 +991,7 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
|
|
|
990
991
|
|
|
991
992
|
const focusedIndex = this.focusedSectionIndex();
|
|
992
993
|
|
|
994
|
+
this.#elementsForSyncViewportCheck = [];
|
|
993
995
|
this.linkifier.reset();
|
|
994
996
|
const prevSections = this.sectionBlocks.map(block => block.sections).flat();
|
|
995
997
|
|
|
@@ -1047,6 +1049,7 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
|
|
|
1047
1049
|
}
|
|
1048
1050
|
|
|
1049
1051
|
this.sectionsContainer.contentElement.appendChild(fragment);
|
|
1052
|
+
this.#performSyncViewportCheck();
|
|
1050
1053
|
|
|
1051
1054
|
if (elementToFocus) {
|
|
1052
1055
|
elementToFocus.focus();
|
|
@@ -1655,9 +1658,54 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
|
|
|
1655
1658
|
}, {rootMargin: '100px'});
|
|
1656
1659
|
}
|
|
1657
1660
|
this.#lazyRenderCallbacks.set(element, callback);
|
|
1661
|
+
this.#elementsForSyncViewportCheck.push(element);
|
|
1658
1662
|
this.#lazyRenderObserver.observe(element);
|
|
1659
1663
|
}
|
|
1660
1664
|
|
|
1665
|
+
#performSyncViewportCheck(): void {
|
|
1666
|
+
if (!this.#shouldRenderLazily || this.#elementsForSyncViewportCheck.length === 0) {
|
|
1667
|
+
this.#elementsForSyncViewportCheck = [];
|
|
1668
|
+
return;
|
|
1669
|
+
}
|
|
1670
|
+
const scrollContainer = this.contentElement.parentElement;
|
|
1671
|
+
if (!scrollContainer) {
|
|
1672
|
+
this.#elementsForSyncViewportCheck = [];
|
|
1673
|
+
return;
|
|
1674
|
+
}
|
|
1675
|
+
const {top, bottom} = scrollContainer.getBoundingClientRect();
|
|
1676
|
+
if (bottom === top) {
|
|
1677
|
+
this.#elementsForSyncViewportCheck = [];
|
|
1678
|
+
return;
|
|
1679
|
+
}
|
|
1680
|
+
// Expand the bounding calculation by ±100px to accurately match the {rootMargin: '100px'}
|
|
1681
|
+
// option configured on the IntersectionObserver in trackForLazyRendering.
|
|
1682
|
+
const viewportTop = top - 100;
|
|
1683
|
+
const viewportBottom = bottom + 100;
|
|
1684
|
+
|
|
1685
|
+
const visibleElements: Element[] = [];
|
|
1686
|
+
for (const element of this.#elementsForSyncViewportCheck) {
|
|
1687
|
+
if (!element.isConnected || !this.#lazyRenderCallbacks.has(element)) {
|
|
1688
|
+
continue;
|
|
1689
|
+
}
|
|
1690
|
+
const rect = element.getBoundingClientRect();
|
|
1691
|
+
if (rect.top > viewportBottom) {
|
|
1692
|
+
break;
|
|
1693
|
+
}
|
|
1694
|
+
if (rect.bottom >= viewportTop) {
|
|
1695
|
+
visibleElements.push(element);
|
|
1696
|
+
}
|
|
1697
|
+
}
|
|
1698
|
+
this.#elementsForSyncViewportCheck = [];
|
|
1699
|
+
|
|
1700
|
+
for (const element of visibleElements) {
|
|
1701
|
+
const callback = this.#lazyRenderCallbacks.get(element);
|
|
1702
|
+
if (callback) {
|
|
1703
|
+
callback();
|
|
1704
|
+
this.untrackForLazyRendering(element);
|
|
1705
|
+
}
|
|
1706
|
+
}
|
|
1707
|
+
}
|
|
1708
|
+
|
|
1661
1709
|
shouldRenderLazily(): boolean {
|
|
1662
1710
|
return this.#shouldRenderLazily;
|
|
1663
1711
|
}
|
|
@@ -5,13 +5,14 @@
|
|
|
5
5
|
|
|
6
6
|
import type * as Common from '../../core/common/common.js';
|
|
7
7
|
import * as Host from '../../core/host/host.js';
|
|
8
|
+
import type * as Foundation from '../../foundation/foundation.js';
|
|
8
9
|
import * as UI from '../../ui/legacy/legacy.js';
|
|
9
10
|
import * as ThemeSupport from '../../ui/legacy/theme_support/theme_support.js';
|
|
10
11
|
|
|
11
12
|
import {DeviceModeWrapper} from './DeviceModeWrapper.js';
|
|
12
13
|
import {type Bounds, Events, InspectedPagePlaceholder} from './InspectedPagePlaceholder.js';
|
|
13
14
|
|
|
14
|
-
let appInstance: AdvancedApp;
|
|
15
|
+
let appInstance: AdvancedApp|null = null;
|
|
15
16
|
|
|
16
17
|
export class AdvancedApp implements UI.App.App {
|
|
17
18
|
private rootSplitWidget!: UI.SplitWidget.SplitWidget;
|
|
@@ -20,8 +21,10 @@ export class AdvancedApp implements UI.App.App {
|
|
|
20
21
|
private toolboxWindow?: Window|null;
|
|
21
22
|
private toolboxRootView?: UI.RootView.RootView;
|
|
22
23
|
private changingDockSide?: boolean;
|
|
24
|
+
readonly #universe: Foundation.Universe.Universe;
|
|
23
25
|
|
|
24
|
-
constructor() {
|
|
26
|
+
constructor(universe: Foundation.Universe.Universe) {
|
|
27
|
+
this.#universe = universe;
|
|
25
28
|
UI.DockController.DockController.instance().addEventListener(
|
|
26
29
|
UI.DockController.Events.BEFORE_DOCK_SIDE_CHANGED, this.openToolboxWindow, this);
|
|
27
30
|
}
|
|
@@ -29,15 +32,22 @@ export class AdvancedApp implements UI.App.App {
|
|
|
29
32
|
/**
|
|
30
33
|
* Note: it's used by toolbox.ts without real type checks.
|
|
31
34
|
*/
|
|
32
|
-
static instance(): AdvancedApp {
|
|
35
|
+
static instance(universe?: Foundation.Universe.Universe): AdvancedApp {
|
|
33
36
|
if (!appInstance) {
|
|
34
|
-
|
|
37
|
+
if (!universe) {
|
|
38
|
+
throw new Error('AdvancedApp.instance() requires a Universe on initial instantiation');
|
|
39
|
+
}
|
|
40
|
+
appInstance = new AdvancedApp(universe);
|
|
35
41
|
}
|
|
36
42
|
return appInstance;
|
|
37
43
|
}
|
|
38
44
|
|
|
45
|
+
static removeInstance(): void {
|
|
46
|
+
appInstance = null;
|
|
47
|
+
}
|
|
48
|
+
|
|
39
49
|
presentUI(document: Document): void {
|
|
40
|
-
const rootView = new UI.RootView.RootView();
|
|
50
|
+
const rootView = new UI.RootView.RootView(this.#universe);
|
|
41
51
|
|
|
42
52
|
this.rootSplitWidget =
|
|
43
53
|
new UI.SplitWidget.SplitWidget(false, true, 'inspector-view.split-view-state', 555, 300, true);
|
|
@@ -85,7 +95,7 @@ export class AdvancedApp implements UI.App.App {
|
|
|
85
95
|
UI.UIUtils.installComponentRootStyles(toolboxDocument.body);
|
|
86
96
|
UI.ContextMenu.ContextMenu.installHandler(toolboxDocument);
|
|
87
97
|
|
|
88
|
-
this.toolboxRootView = new UI.RootView.RootView();
|
|
98
|
+
this.toolboxRootView = new UI.RootView.RootView(this.#universe);
|
|
89
99
|
this.toolboxRootView.attachToDocument(toolboxDocument);
|
|
90
100
|
|
|
91
101
|
this.updateDeviceModeView();
|
|
@@ -200,7 +210,7 @@ export class AdvancedAppProvider implements UI.AppProvider.AppProvider {
|
|
|
200
210
|
return advancedAppProviderInstance;
|
|
201
211
|
}
|
|
202
212
|
|
|
203
|
-
createApp(): UI.App.App {
|
|
204
|
-
return AdvancedApp.instance();
|
|
213
|
+
createApp(universe: Foundation.Universe.Universe): UI.App.App {
|
|
214
|
+
return AdvancedApp.instance(universe);
|
|
205
215
|
}
|
|
206
216
|
}
|
|
@@ -460,7 +460,6 @@ export class DeviceModeToolbar extends UI.Widget.Widget {
|
|
|
460
460
|
this.showMediaInspectorSetting.addChangeListener(this.requestUpdate, this);
|
|
461
461
|
this.showRulersSetting = Common.Settings.Settings.instance().moduleSetting('emulation.show-rulers');
|
|
462
462
|
this.showRulersSetting.addChangeListener(this.requestUpdate, this);
|
|
463
|
-
|
|
464
463
|
this.showDeviceScaleFactorSetting =
|
|
465
464
|
Common.Settings.Settings.instance().createSetting('emulation.show-device-scale-factor', false);
|
|
466
465
|
this.showDeviceScaleFactorSetting.addChangeListener(this.requestUpdate, this);
|