chrome-devtools-frontend 1.0.1665921 → 1.0.1666631
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 +109 -60
- package/front_end/core/host/GcaClient.ts +3 -3
- package/front_end/core/host/UserMetrics.ts +1 -12
- package/front_end/core/sdk/NetworkRequest.ts +10 -55
- package/front_end/entrypoints/main/MainImpl.ts +0 -10
- package/front_end/foundation/Universe.ts +16 -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/data_formatters/PerformanceTraceFormatter.ts +21 -5
- 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/panels/application/DOMStorageItemsView.ts +1 -2
- package/front_end/panels/application/KeyValueStorageItemsView.ts +12 -0
- package/front_end/panels/elements/StylePropertiesSection.ts +25 -9
- package/front_end/panels/elements/StylesSidebarPane.ts +48 -0
- 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/lighthouse/LighthouseController.ts +1 -6
- package/front_end/panels/sources/breakpointEditDialog.css +2 -2
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +1 -2
- 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
|
@@ -18,7 +18,8 @@ import {DeviceModeToolbar} from './DeviceModeToolbar.js';
|
|
|
18
18
|
import deviceModeViewStyles from './deviceModeView.css.js';
|
|
19
19
|
import {MediaQueryInspector} from './MediaQueryInspector.js';
|
|
20
20
|
|
|
21
|
-
const {classMap, styleMap} = Directives;
|
|
21
|
+
const {classMap, ref, styleMap} = Directives;
|
|
22
|
+
const {widget} = UI.Widget;
|
|
22
23
|
|
|
23
24
|
const UIStrings = {
|
|
24
25
|
/**
|
|
@@ -59,29 +60,230 @@ const UIStrings = {
|
|
|
59
60
|
const str_ = i18n.i18n.registerUIStrings('panels/emulation/DeviceModeView.ts', UIStrings);
|
|
60
61
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
61
62
|
|
|
63
|
+
export interface DeviceModeViewRefs {
|
|
64
|
+
toolbar: DeviceModeToolbar;
|
|
65
|
+
bottomRightResizerElement: HTMLElement;
|
|
66
|
+
bottomLeftResizerElement: HTMLElement;
|
|
67
|
+
rightResizerElement: HTMLElement;
|
|
68
|
+
leftResizerElement: HTMLElement;
|
|
69
|
+
bottomResizerElement: HTMLElement;
|
|
70
|
+
pageArea: HTMLElement;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface DeviceModeViewInput {
|
|
74
|
+
model: EmulationModel.DeviceModeModel.DeviceModeModel;
|
|
75
|
+
showMediaInspectorSetting: Common.Settings.Setting<boolean>;
|
|
76
|
+
showRulersSetting: Common.Settings.Setting<boolean>;
|
|
77
|
+
outlineImage: string;
|
|
78
|
+
outlineImageLoaded: boolean;
|
|
79
|
+
screenImage: string;
|
|
80
|
+
screenImageLoaded: boolean;
|
|
81
|
+
showRulers: boolean;
|
|
82
|
+
showMediaInspector: boolean;
|
|
83
|
+
scale: number;
|
|
84
|
+
cachedCssScreenRect?: EmulationModel.DeviceModeModel.Rect;
|
|
85
|
+
cachedOutlineRect?: EmulationModel.DeviceModeModel.Rect;
|
|
86
|
+
onApplyPresetSize: (size: number, e: Event) => void;
|
|
87
|
+
bottomRightResizer: UI.ResizerWidget.ResizerWidget;
|
|
88
|
+
bottomLeftResizer: UI.ResizerWidget.ResizerWidget;
|
|
89
|
+
rightResizer: UI.ResizerWidget.ResizerWidget;
|
|
90
|
+
leftResizer: UI.ResizerWidget.ResizerWidget;
|
|
91
|
+
bottomResizer: UI.ResizerWidget.ResizerWidget;
|
|
92
|
+
bottomRightResizerRef: (el?: Element) => void;
|
|
93
|
+
bottomLeftResizerRef: (el?: Element) => void;
|
|
94
|
+
rightResizerRef: (el?: Element) => void;
|
|
95
|
+
leftResizerRef: (el?: Element) => void;
|
|
96
|
+
bottomResizerRef: (el?: Element) => void;
|
|
97
|
+
onDoubleclickBottomResizer: () => void;
|
|
98
|
+
onOutlineImageLoaded: (success: boolean) => void;
|
|
99
|
+
onScreenImageLoaded: (success: boolean) => void;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export type DeviceModeViewView = (
|
|
103
|
+
input: DeviceModeViewInput,
|
|
104
|
+
output: DeviceModeViewRefs,
|
|
105
|
+
target: HTMLElement,
|
|
106
|
+
) => void;
|
|
107
|
+
|
|
108
|
+
function resizerRef(
|
|
109
|
+
resizer: UI.ResizerWidget.ResizerWidget,
|
|
110
|
+
onConnect?: (el: HTMLElement) => void,
|
|
111
|
+
): (el?: Element) => void {
|
|
112
|
+
let oldEl: HTMLElement|undefined;
|
|
113
|
+
return (el?: Element) => {
|
|
114
|
+
if (el instanceof HTMLElement) {
|
|
115
|
+
if (oldEl === el) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (oldEl) {
|
|
119
|
+
resizer.removeElement(oldEl);
|
|
120
|
+
}
|
|
121
|
+
oldEl = el;
|
|
122
|
+
resizer.addElement(el);
|
|
123
|
+
onConnect?.(el);
|
|
124
|
+
} else if (oldEl) {
|
|
125
|
+
resizer.removeElement(oldEl);
|
|
126
|
+
oldEl = undefined;
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export const DEFAULT_DEVICE_MODE_VIEW: DeviceModeViewView = (
|
|
132
|
+
input: DeviceModeViewInput,
|
|
133
|
+
output: DeviceModeViewRefs,
|
|
134
|
+
target: HTMLElement,
|
|
135
|
+
): void => {
|
|
136
|
+
const sizes = [320, 375, 425, 768, 1024, 1440, 2560];
|
|
137
|
+
const titles = [
|
|
138
|
+
i18nString(UIStrings.mobileS),
|
|
139
|
+
i18nString(UIStrings.mobileM),
|
|
140
|
+
i18nString(UIStrings.mobileL),
|
|
141
|
+
i18nString(UIStrings.tablet),
|
|
142
|
+
i18nString(UIStrings.laptop),
|
|
143
|
+
i18nString(UIStrings.laptopL),
|
|
144
|
+
'4K',
|
|
145
|
+
];
|
|
146
|
+
// clang-format off
|
|
147
|
+
render(html`
|
|
148
|
+
<devtools-widget ${UI.Widget.widget(DeviceModeToolbar, {model: input.model})}
|
|
149
|
+
${UI.Widget.widgetRef(DeviceModeToolbar, t => { output.toolbar = t; })}></devtools-widget>
|
|
150
|
+
<div class=${classMap({
|
|
151
|
+
'device-mode-content-clip': true,
|
|
152
|
+
vbox: true,
|
|
153
|
+
'device-mode-outline-visible': Boolean(input.outlineImage),
|
|
154
|
+
'device-mode-rulers-visible': input.showRulers,
|
|
155
|
+
})}>
|
|
156
|
+
<div class="device-mode-presets-container" jslog=${VisualLogging.responsivePresets()}>
|
|
157
|
+
<div class="device-mode-presets-container-inner">
|
|
158
|
+
${sizes.map((size, idx) => html`
|
|
159
|
+
<div class="fill device-mode-preset-bar-outer">
|
|
160
|
+
<div class="device-mode-preset-bar"
|
|
161
|
+
style="width: ${size * input.scale}px;"
|
|
162
|
+
jslog=${VisualLogging.action().track({click: true}).context(`device-mode-preset-${size}px`)}
|
|
163
|
+
@click=${(e: Event) => input.onApplyPresetSize(size, e)}>
|
|
164
|
+
<span>${titles[idx]} – ${size}px</span>
|
|
165
|
+
</div>
|
|
166
|
+
</div>
|
|
167
|
+
`).reverse()}
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
<div class="device-mode-media-container">
|
|
171
|
+
${input.showMediaInspector ? widget(MediaQueryInspector, {
|
|
172
|
+
scale: input.scale,
|
|
173
|
+
getWidthCallback: () => input.model.appliedDeviceSize().width,
|
|
174
|
+
setWidthCallback: input.model.setWidth.bind(input.model),
|
|
175
|
+
}) : nothing}
|
|
176
|
+
</div>
|
|
177
|
+
<div class="device-mode-content-area">
|
|
178
|
+
<img class="device-mode-outline-image fill"
|
|
179
|
+
?hidden=${!input.outlineImage || !input.outlineImageLoaded}
|
|
180
|
+
style=${styleMap(input.cachedOutlineRect ? {
|
|
181
|
+
left: `${input.cachedOutlineRect.left}px`,
|
|
182
|
+
top: `${input.cachedOutlineRect.top}px`,
|
|
183
|
+
width: `${input.cachedOutlineRect.width}px`,
|
|
184
|
+
height: `${input.cachedOutlineRect.height}px`,
|
|
185
|
+
} : {})}
|
|
186
|
+
srcset=${input.outlineImage || nothing}
|
|
187
|
+
@load=${(): void => input.onOutlineImageLoaded(true)}
|
|
188
|
+
@error=${(): void => input.onOutlineImageLoaded(false)}>
|
|
189
|
+
<div class="device-mode-screen-area"
|
|
190
|
+
style=${styleMap(input.cachedCssScreenRect ? {
|
|
191
|
+
left: `${input.cachedCssScreenRect.left}px`,
|
|
192
|
+
top: `${input.cachedCssScreenRect.top}px`,
|
|
193
|
+
width: `${input.cachedCssScreenRect.width}px`,
|
|
194
|
+
height: `${input.cachedCssScreenRect.height}px`,
|
|
195
|
+
} : {})}>
|
|
196
|
+
<img class="device-mode-screen-image"
|
|
197
|
+
?hidden=${!input.screenImage || !input.screenImageLoaded}
|
|
198
|
+
srcset=${input.screenImage || nothing}
|
|
199
|
+
@load=${(): void => input.onScreenImageLoaded(true)}
|
|
200
|
+
@error=${(): void => input.onScreenImageLoaded(false)}>
|
|
201
|
+
<div class="device-mode-resizer device-mode-bottom-right-resizer"
|
|
202
|
+
jslog=${VisualLogging.slider('device-mode-resizer').track({drag: true})}
|
|
203
|
+
${ref(input.bottomRightResizerRef)}>
|
|
204
|
+
<div></div>
|
|
205
|
+
</div>
|
|
206
|
+
<div class="device-mode-resizer device-mode-bottom-left-resizer"
|
|
207
|
+
jslog=${VisualLogging.slider('device-mode-resizer').track({drag: true})}
|
|
208
|
+
${ref(input.bottomLeftResizerRef)}>
|
|
209
|
+
<div></div>
|
|
210
|
+
</div>
|
|
211
|
+
<div class="device-mode-resizer device-mode-right-resizer"
|
|
212
|
+
jslog=${VisualLogging.slider('device-mode-resizer').track({drag: true})}
|
|
213
|
+
${ref(input.rightResizerRef)}>
|
|
214
|
+
<div></div>
|
|
215
|
+
</div>
|
|
216
|
+
<div class="device-mode-resizer device-mode-left-resizer"
|
|
217
|
+
jslog=${VisualLogging.slider('device-mode-resizer').track({drag: true})}
|
|
218
|
+
${ref(input.leftResizerRef)}>
|
|
219
|
+
<div></div>
|
|
220
|
+
</div>
|
|
221
|
+
<div class="device-mode-resizer device-mode-bottom-resizer"
|
|
222
|
+
jslog=${VisualLogging.slider('device-mode-resizer').track({drag: true})}
|
|
223
|
+
title=${i18nString(UIStrings.doubleclickForFullHeight)}
|
|
224
|
+
${ref(input.bottomResizerRef)}
|
|
225
|
+
@dblclick=${input.onDoubleclickBottomResizer}>
|
|
226
|
+
<div></div>
|
|
227
|
+
</div>
|
|
228
|
+
<div class="device-mode-page-area" ${ref((el?: Element) => { if (el instanceof HTMLElement) { output.pageArea = el; } })}><slot></slot></div>
|
|
229
|
+
</div>
|
|
230
|
+
${input.showRulers ? html`
|
|
231
|
+
<devtools-widget class="device-mode-ruler-top device-mode-ruler"
|
|
232
|
+
style=${styleMap({left: `${input.cachedCssScreenRect?.left ?? 0}px`, top: `${input.cachedCssScreenRect?.top ?? 0}px`})}
|
|
233
|
+
${UI.Widget.widget(Ruler, {
|
|
234
|
+
scale: input.scale,
|
|
235
|
+
horizontal: true,
|
|
236
|
+
})}
|
|
237
|
+
@device-mode-ruler-marker-selected=${(e: CustomEvent<number>): void => input.model.setWidthAndScaleToFit(e.detail)}>
|
|
238
|
+
</devtools-widget>
|
|
239
|
+
<devtools-widget class="device-mode-ruler-left device-mode-ruler"
|
|
240
|
+
style=${styleMap({left: `${input.cachedCssScreenRect?.left ?? 0}px`, top: `${input.cachedCssScreenRect?.top ?? 0}px`})}
|
|
241
|
+
${UI.Widget.widget(Ruler, {
|
|
242
|
+
scale: input.scale,
|
|
243
|
+
horizontal: false,
|
|
244
|
+
})}
|
|
245
|
+
@device-mode-ruler-marker-selected=${(e: CustomEvent<number>): void => input.model.setHeightAndScaleToFit(e.detail)}>
|
|
246
|
+
</devtools-widget>
|
|
247
|
+
` : nothing}
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
250
|
+
`, target);
|
|
251
|
+
// clang-format on
|
|
252
|
+
};
|
|
253
|
+
|
|
62
254
|
export class DeviceModeView extends UI.Widget.VBox {
|
|
63
255
|
wrapperInstance!: UI.Widget.VBox|null;
|
|
64
256
|
private model: EmulationModel.DeviceModeModel.DeviceModeModel;
|
|
65
|
-
private readonly mediaInspector: MediaQueryInspector;
|
|
66
257
|
private showMediaInspectorSetting: Common.Settings.Setting<boolean>;
|
|
67
258
|
private showRulersSetting: Common.Settings.Setting<boolean>;
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
private
|
|
75
|
-
private
|
|
76
|
-
private
|
|
77
|
-
private
|
|
78
|
-
private
|
|
79
|
-
private
|
|
80
|
-
|
|
259
|
+
pageArea!: HTMLElement;
|
|
260
|
+
rightResizerElement!: HTMLElement;
|
|
261
|
+
leftResizerElement!: HTMLElement;
|
|
262
|
+
bottomResizerElement!: HTMLElement;
|
|
263
|
+
bottomRightResizerElement!: HTMLElement;
|
|
264
|
+
bottomLeftResizerElement!: HTMLElement;
|
|
265
|
+
private readonly bottomRightResizer = this.createResizer(2, 1);
|
|
266
|
+
private readonly bottomLeftResizer = this.createResizer(-2, 1);
|
|
267
|
+
private readonly rightResizer = this.createResizer(2, 0);
|
|
268
|
+
private readonly leftResizer = this.createResizer(-2, 0);
|
|
269
|
+
private readonly bottomResizer = this.createResizer(0, 1);
|
|
270
|
+
private readonly bottomRightResizerRef = resizerRef(this.bottomRightResizer, el => {
|
|
271
|
+
this.bottomRightResizerElement = el;
|
|
272
|
+
});
|
|
273
|
+
private readonly bottomLeftResizerRef = resizerRef(this.bottomLeftResizer, el => {
|
|
274
|
+
this.bottomLeftResizerElement = el;
|
|
275
|
+
});
|
|
276
|
+
private readonly rightResizerRef = resizerRef(this.rightResizer, el => {
|
|
277
|
+
this.rightResizerElement = el;
|
|
278
|
+
});
|
|
279
|
+
private readonly leftResizerRef = resizerRef(this.leftResizer, el => {
|
|
280
|
+
this.leftResizerElement = el;
|
|
281
|
+
});
|
|
282
|
+
private readonly bottomResizerRef = resizerRef(this.bottomResizer, el => {
|
|
283
|
+
this.bottomResizerElement = el;
|
|
284
|
+
});
|
|
81
285
|
private cachedResizable!: boolean|undefined;
|
|
82
|
-
|
|
83
|
-
private screenImage!: HTMLElement;
|
|
84
|
-
private toolbar!: DeviceModeToolbar;
|
|
286
|
+
toolbar!: DeviceModeToolbar;
|
|
85
287
|
private slowPositionStart?: {
|
|
86
288
|
x: number,
|
|
87
289
|
y: number,
|
|
@@ -95,9 +297,15 @@ export class DeviceModeView extends UI.Widget.VBox {
|
|
|
95
297
|
private cachedScale?: number;
|
|
96
298
|
private handleWidth?: number;
|
|
97
299
|
private handleHeight?: number;
|
|
300
|
+
#outlineImageLoaded = false;
|
|
301
|
+
#lastOutlineImageSrc?: string;
|
|
302
|
+
#screenImageLoaded = false;
|
|
303
|
+
#lastScreenImageSrc?: string;
|
|
304
|
+
#view: DeviceModeViewView;
|
|
98
305
|
|
|
99
|
-
constructor() {
|
|
306
|
+
constructor(view: DeviceModeViewView = DEFAULT_DEVICE_MODE_VIEW) {
|
|
100
307
|
super({useShadowDom: true});
|
|
308
|
+
this.#view = view;
|
|
101
309
|
|
|
102
310
|
this.setMinimumSize(150, 150);
|
|
103
311
|
this.element.classList.add('device-mode-view');
|
|
@@ -105,112 +313,75 @@ export class DeviceModeView extends UI.Widget.VBox {
|
|
|
105
313
|
|
|
106
314
|
this.model = EmulationModel.DeviceModeModel.DeviceModeModel.instance();
|
|
107
315
|
this.model.addEventListener(EmulationModel.DeviceModeModel.Events.UPDATED, this.updateUI, this);
|
|
108
|
-
this.mediaInspector = new MediaQueryInspector();
|
|
109
|
-
this.mediaInspector.getWidthCallback = () => this.model.appliedDeviceSize().width;
|
|
110
|
-
this.mediaInspector.setWidthCallback = this.model.setWidth.bind(this.model);
|
|
111
316
|
this.showMediaInspectorSetting = Common.Settings.Settings.instance().moduleSetting('show-media-query-inspector');
|
|
112
317
|
this.showMediaInspectorSetting.addChangeListener(this.updateUI, this);
|
|
113
318
|
this.showRulersSetting = Common.Settings.Settings.instance().moduleSetting('emulation.show-rulers');
|
|
114
319
|
this.showRulersSetting.addChangeListener(this.updateUI, this);
|
|
115
320
|
|
|
116
|
-
this.
|
|
117
|
-
this.topRuler.horizontal = true;
|
|
118
|
-
this.topRuler.addEventListener(RulerEvents.MARKER_SELECTED, event => {
|
|
119
|
-
this.model.setWidthAndScaleToFit(event.data);
|
|
120
|
-
});
|
|
121
|
-
this.topRuler.element.classList.add('device-mode-ruler-top');
|
|
122
|
-
this.leftRuler = new Ruler();
|
|
123
|
-
this.leftRuler.horizontal = false;
|
|
124
|
-
this.leftRuler.addEventListener(RulerEvents.MARKER_SELECTED, event => {
|
|
125
|
-
this.model.setHeightAndScaleToFit(event.data);
|
|
126
|
-
});
|
|
127
|
-
this.leftRuler.element.classList.add('device-mode-ruler-left');
|
|
128
|
-
this.createUI();
|
|
321
|
+
this.performUpdate();
|
|
129
322
|
UI.ZoomManager.ZoomManager.instance().addEventListener(UI.ZoomManager.Events.ZOOM_CHANGED, this.zoomChanged, this);
|
|
130
323
|
}
|
|
131
324
|
|
|
132
|
-
|
|
133
|
-
this
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
this
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
const scale = this.model.scale();
|
|
174
|
-
const sizes = [320, 375, 425, 768, 1024, 1440, 2560];
|
|
175
|
-
const titles = [
|
|
176
|
-
i18nString(UIStrings.mobileS),
|
|
177
|
-
i18nString(UIStrings.mobileM),
|
|
178
|
-
i18nString(UIStrings.mobileL),
|
|
179
|
-
i18nString(UIStrings.tablet),
|
|
180
|
-
i18nString(UIStrings.laptop),
|
|
181
|
-
i18nString(UIStrings.laptopL),
|
|
182
|
-
'4K',
|
|
183
|
-
];
|
|
184
|
-
|
|
185
|
-
const applySize = (width: number, e: Event): void => {
|
|
186
|
-
this.model.emulate(EmulationModel.DeviceModeModel.Type.Responsive, null, null);
|
|
187
|
-
this.model.setWidthAndScaleToFit(width);
|
|
188
|
-
e.consume();
|
|
325
|
+
override performUpdate(): void {
|
|
326
|
+
if (this.#lastOutlineImageSrc !== this.model.outlineImage()) {
|
|
327
|
+
this.#lastOutlineImageSrc = this.model.outlineImage();
|
|
328
|
+
this.#outlineImageLoaded = false;
|
|
329
|
+
}
|
|
330
|
+
if (this.#lastScreenImageSrc !== this.model.screenImage()) {
|
|
331
|
+
this.#lastScreenImageSrc = this.model.screenImage();
|
|
332
|
+
this.#screenImageLoaded = false;
|
|
333
|
+
}
|
|
334
|
+
const input: DeviceModeViewInput = {
|
|
335
|
+
model: this.model,
|
|
336
|
+
showMediaInspectorSetting: this.showMediaInspectorSetting,
|
|
337
|
+
showRulersSetting: this.showRulersSetting,
|
|
338
|
+
outlineImage: this.model.outlineImage(),
|
|
339
|
+
outlineImageLoaded: this.#outlineImageLoaded,
|
|
340
|
+
screenImage: this.model.screenImage(),
|
|
341
|
+
screenImageLoaded: this.#screenImageLoaded,
|
|
342
|
+
showRulers: this.showRulersSetting.get() && this.model.type() !== EmulationModel.DeviceModeModel.Type.None,
|
|
343
|
+
showMediaInspector:
|
|
344
|
+
this.showMediaInspectorSetting.get() && this.model.type() !== EmulationModel.DeviceModeModel.Type.None,
|
|
345
|
+
scale: this.model.scale(),
|
|
346
|
+
cachedCssScreenRect: this.cachedCssScreenRect,
|
|
347
|
+
cachedOutlineRect: this.cachedOutlineRect,
|
|
348
|
+
onApplyPresetSize: (width: number, e: Event): void => {
|
|
349
|
+
this.model.emulate(EmulationModel.DeviceModeModel.Type.Responsive, null, null);
|
|
350
|
+
this.model.setWidthAndScaleToFit(width);
|
|
351
|
+
e.consume();
|
|
352
|
+
},
|
|
353
|
+
bottomRightResizer: this.bottomRightResizer,
|
|
354
|
+
bottomLeftResizer: this.bottomLeftResizer,
|
|
355
|
+
rightResizer: this.rightResizer,
|
|
356
|
+
leftResizer: this.leftResizer,
|
|
357
|
+
bottomResizer: this.bottomResizer,
|
|
358
|
+
bottomRightResizerRef: this.bottomRightResizerRef,
|
|
359
|
+
bottomLeftResizerRef: this.bottomLeftResizerRef,
|
|
360
|
+
rightResizerRef: this.rightResizerRef,
|
|
361
|
+
leftResizerRef: this.leftResizerRef,
|
|
362
|
+
bottomResizerRef: this.bottomResizerRef,
|
|
363
|
+
onDoubleclickBottomResizer: (): void => this.model.setHeight(0),
|
|
364
|
+
onOutlineImageLoaded: (success: boolean): void => this.onOutlineImageLoaded(success),
|
|
365
|
+
onScreenImageLoaded: (success: boolean): void => this.onScreenImageLoaded(success),
|
|
189
366
|
};
|
|
367
|
+
this.#view(input, this, this.contentElement);
|
|
368
|
+
}
|
|
190
369
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
<div class="device-mode-preset-bar"
|
|
197
|
-
style="width: ${size * scale}px;"
|
|
198
|
-
jslog=${VisualLogging.action().track({click: true}).context(`device-mode-preset-${size}px`)}
|
|
199
|
-
@click=${(e: Event) => applySize(size, e)}>
|
|
200
|
-
<span>${titles[idx]} – ${size}px</span>
|
|
201
|
-
</div>
|
|
202
|
-
</div>
|
|
203
|
-
`).reverse()}
|
|
204
|
-
</div>
|
|
205
|
-
`,
|
|
206
|
-
this.responsivePresetsContainer);
|
|
370
|
+
private onOutlineImageLoaded(success: boolean): void {
|
|
371
|
+
if (this.#outlineImageLoaded !== success) {
|
|
372
|
+
this.#outlineImageLoaded = success;
|
|
373
|
+
this.requestUpdate();
|
|
374
|
+
}
|
|
207
375
|
}
|
|
208
376
|
|
|
209
|
-
private
|
|
210
|
-
|
|
377
|
+
private onScreenImageLoaded(success: boolean): void {
|
|
378
|
+
if (this.#screenImageLoaded !== success) {
|
|
379
|
+
this.#screenImageLoaded = success;
|
|
380
|
+
this.requestUpdate();
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
private createResizer(widthFactor: number, heightFactor: number): UI.ResizerWidget.ResizerWidget {
|
|
211
384
|
const resizer = new UI.ResizerWidget.ResizerWidget();
|
|
212
|
-
element.setAttribute('jslog', `${VisualLogging.slider('device-mode-resizer').track({drag: true})}`);
|
|
213
|
-
resizer.addElement(element);
|
|
214
385
|
let cursor: 'nwse-resize'|'nesw-resize'|('ew-resize' | 'ns-resize') = widthFactor ? 'ew-resize' : 'ns-resize';
|
|
215
386
|
if (widthFactor * heightFactor > 0) {
|
|
216
387
|
cursor = 'nwse-resize';
|
|
@@ -294,12 +465,9 @@ export class DeviceModeView extends UI.Widget.VBox {
|
|
|
294
465
|
let callDoResize = false;
|
|
295
466
|
const showRulers = this.showRulersSetting.get() && this.model.type() !== EmulationModel.DeviceModeModel.Type.None;
|
|
296
467
|
let contentAreaResized = false;
|
|
297
|
-
let updateRulers = false;
|
|
298
468
|
|
|
299
469
|
const cssScreenRect = this.model.screenRect().scale(1 / zoomFactor);
|
|
300
470
|
if (!this.cachedCssScreenRect || !cssScreenRect.isEqual(this.cachedCssScreenRect)) {
|
|
301
|
-
applyRect(this.screenArea, cssScreenRect);
|
|
302
|
-
updateRulers = true;
|
|
303
471
|
callDoResize = true;
|
|
304
472
|
this.cachedCssScreenRect = cssScreenRect;
|
|
305
473
|
}
|
|
@@ -315,12 +483,10 @@ export class DeviceModeView extends UI.Widget.VBox {
|
|
|
315
483
|
if (outlineRectFromModel) {
|
|
316
484
|
const outlineRect = outlineRectFromModel.scale(1 / zoomFactor);
|
|
317
485
|
if (!this.cachedOutlineRect || !outlineRect.isEqual(this.cachedOutlineRect)) {
|
|
318
|
-
applyRect(this.outlineImage, outlineRect);
|
|
319
486
|
callDoResize = true;
|
|
320
487
|
this.cachedOutlineRect = outlineRect;
|
|
321
488
|
}
|
|
322
489
|
}
|
|
323
|
-
this.contentClip.classList.toggle('device-mode-outline-visible', Boolean(this.model.outlineImage()));
|
|
324
490
|
|
|
325
491
|
const resizable = this.model.type() === EmulationModel.DeviceModeModel.Type.Responsive;
|
|
326
492
|
if (resizable !== this.cachedResizable) {
|
|
@@ -335,73 +501,32 @@ export class DeviceModeView extends UI.Widget.VBox {
|
|
|
335
501
|
const mediaInspectorVisible =
|
|
336
502
|
this.showMediaInspectorSetting.get() && this.model.type() !== EmulationModel.DeviceModeModel.Type.None;
|
|
337
503
|
if (mediaInspectorVisible !== this.cachedMediaInspectorVisible) {
|
|
338
|
-
if (mediaInspectorVisible) {
|
|
339
|
-
this.mediaInspector.show(this.mediaInspectorContainer);
|
|
340
|
-
} else {
|
|
341
|
-
this.mediaInspector.detach();
|
|
342
|
-
}
|
|
343
504
|
contentAreaResized = true;
|
|
344
505
|
callDoResize = true;
|
|
345
506
|
this.cachedMediaInspectorVisible = mediaInspectorVisible;
|
|
346
507
|
}
|
|
347
508
|
|
|
348
509
|
if (showRulers !== this.cachedShowRulers) {
|
|
349
|
-
this.contentClip.classList.toggle('device-mode-rulers-visible', showRulers);
|
|
350
|
-
if (showRulers) {
|
|
351
|
-
this.topRuler.show(this.contentArea);
|
|
352
|
-
this.leftRuler.show(this.contentArea);
|
|
353
|
-
} else {
|
|
354
|
-
this.topRuler.detach();
|
|
355
|
-
this.leftRuler.detach();
|
|
356
|
-
}
|
|
357
510
|
contentAreaResized = true;
|
|
358
511
|
callDoResize = true;
|
|
359
512
|
this.cachedShowRulers = showRulers;
|
|
360
513
|
}
|
|
361
514
|
|
|
362
515
|
if (this.model.scale() !== this.cachedScale) {
|
|
363
|
-
updateRulers = true;
|
|
364
516
|
callDoResize = true;
|
|
365
|
-
this.renderPresets();
|
|
366
517
|
this.cachedScale = this.model.scale();
|
|
367
518
|
}
|
|
368
519
|
|
|
520
|
+
this.requestUpdate();
|
|
369
521
|
this.toolbar.requestUpdate();
|
|
370
|
-
this.loadImage(this.screenImage, this.model.screenImage());
|
|
371
|
-
this.loadImage(this.outlineImage, this.model.outlineImage());
|
|
372
|
-
this.mediaInspector.setAxisTransform(this.model.scale());
|
|
373
522
|
if (callDoResize) {
|
|
374
523
|
this.doResize();
|
|
375
524
|
}
|
|
376
|
-
if (updateRulers) {
|
|
377
|
-
this.topRuler.render(this.model.scale());
|
|
378
|
-
this.leftRuler.render(this.model.scale());
|
|
379
|
-
this.topRuler.element.positionAt(
|
|
380
|
-
this.cachedCssScreenRect ? this.cachedCssScreenRect.left : 0,
|
|
381
|
-
this.cachedCssScreenRect ? this.cachedCssScreenRect.top : 0);
|
|
382
|
-
this.leftRuler.element.positionAt(
|
|
383
|
-
this.cachedCssScreenRect ? this.cachedCssScreenRect.left : 0,
|
|
384
|
-
this.cachedCssScreenRect ? this.cachedCssScreenRect.top : 0);
|
|
385
|
-
}
|
|
386
525
|
if (contentAreaResized) {
|
|
387
526
|
this.contentAreaResized();
|
|
388
527
|
}
|
|
389
528
|
}
|
|
390
529
|
|
|
391
|
-
private loadImage(element: Element, srcset: string): void {
|
|
392
|
-
if (element.getAttribute('srcset') === srcset) {
|
|
393
|
-
return;
|
|
394
|
-
}
|
|
395
|
-
element.setAttribute('srcset', srcset);
|
|
396
|
-
if (!srcset) {
|
|
397
|
-
element.classList.toggle('hidden', true);
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
private onImageLoaded(element: Element, success: boolean): void {
|
|
402
|
-
element.classList.toggle('hidden', !success);
|
|
403
|
-
}
|
|
404
|
-
|
|
405
530
|
setNonEmulatedAvailableSize(element: Element): void {
|
|
406
531
|
if (this.model.type() !== EmulationModel.DeviceModeModel.Type.None) {
|
|
407
532
|
return;
|
|
@@ -414,8 +539,12 @@ export class DeviceModeView extends UI.Widget.VBox {
|
|
|
414
539
|
}
|
|
415
540
|
|
|
416
541
|
private contentAreaResized(): void {
|
|
542
|
+
const contentArea = this.contentElement.querySelector<HTMLElement>('.device-mode-content-area');
|
|
543
|
+
if (!contentArea) {
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
417
546
|
const zoomFactor = UI.ZoomManager.ZoomManager.instance().zoomFactor();
|
|
418
|
-
const rect =
|
|
547
|
+
const rect = contentArea.getBoundingClientRect();
|
|
419
548
|
const availableSize =
|
|
420
549
|
new Geometry.Size(Math.max(rect.width * zoomFactor, 1), Math.max(rect.height * zoomFactor, 1));
|
|
421
550
|
const preferredSize = new Geometry.Size(
|
|
@@ -689,10 +818,6 @@ export class Ruler extends Common.ObjectWrapper.eventMixin<RulerEventTypes, type
|
|
|
689
818
|
this.requestUpdate();
|
|
690
819
|
}
|
|
691
820
|
|
|
692
|
-
render(scale: number): void {
|
|
693
|
-
this.scale = scale;
|
|
694
|
-
}
|
|
695
|
-
|
|
696
821
|
override wasShown(): void {
|
|
697
822
|
super.wasShown();
|
|
698
823
|
this.requestUpdate();
|
|
@@ -161,14 +161,14 @@ export class MediaQueryInspector extends UI.Widget.Widget<ShadowRoot> implements
|
|
|
161
161
|
readonly mediaThrottler: Common.Throttler.Throttler = new Common.Throttler.Throttler(0);
|
|
162
162
|
#getWidthCallback?: () => number;
|
|
163
163
|
#setWidthCallback?: (arg0: number) => void;
|
|
164
|
-
|
|
164
|
+
#scale: number;
|
|
165
165
|
private cssModel?: SDK.CSSModel.CSSModel;
|
|
166
166
|
private cachedQueryModels?: MediaQueryUIModel[];
|
|
167
167
|
|
|
168
168
|
constructor(element?: HTMLElement, view = DEFAULT_VIEW) {
|
|
169
169
|
super(element, {useShadowDom: 'pure'});
|
|
170
170
|
this.view = view;
|
|
171
|
-
this
|
|
171
|
+
this.#scale = 1;
|
|
172
172
|
|
|
173
173
|
SDK.TargetManager.TargetManager.instance().observeModels(SDK.CSSModel.CSSModel, this);
|
|
174
174
|
UI.ZoomManager.ZoomManager.instance().addEventListener(
|
|
@@ -217,11 +217,15 @@ export class MediaQueryInspector extends UI.Widget.Widget<ShadowRoot> implements
|
|
|
217
217
|
delete this.cssModel;
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
-
|
|
221
|
-
|
|
220
|
+
get scale(): number {
|
|
221
|
+
return this.#scale;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
set scale(scale: number) {
|
|
225
|
+
if (Math.abs(this.#scale - scale) < 1e-8) {
|
|
222
226
|
return;
|
|
223
227
|
}
|
|
224
|
-
this
|
|
228
|
+
this.#scale = scale;
|
|
225
229
|
this.requestUpdate();
|
|
226
230
|
}
|
|
227
231
|
|
|
@@ -368,7 +372,7 @@ export class MediaQueryInspector extends UI.Widget.Widget<ShadowRoot> implements
|
|
|
368
372
|
}
|
|
369
373
|
|
|
370
374
|
private zoomFactor(): number {
|
|
371
|
-
return UI.ZoomManager.ZoomManager.instance().zoomFactor() / this
|
|
375
|
+
return UI.ZoomManager.ZoomManager.instance().zoomFactor() / this.#scale;
|
|
372
376
|
}
|
|
373
377
|
|
|
374
378
|
override wasShown(): void {
|
|
@@ -27,7 +27,7 @@ const UIStrings = {
|
|
|
27
27
|
'There may be stored data affecting loading performance in this location: {PH1}. Audit this page in an incognito window to stop those resources from affecting your scores.',
|
|
28
28
|
/**
|
|
29
29
|
* @description Text when stored data in multiple locations may affect Lighthouse run.
|
|
30
|
-
* @example {IndexedDB
|
|
30
|
+
* @example {IndexedDB} PH1
|
|
31
31
|
*/
|
|
32
32
|
thereMayBeStoredDataAffectingLoadingPlural:
|
|
33
33
|
'There may be stored data affecting loading performance in these locations: {PH1}. Audit this page in an incognito window to stop those resources from affecting your scores.',
|
|
@@ -48,10 +48,6 @@ const UIStrings = {
|
|
|
48
48
|
* @description Text in sidebar of the Application panel.
|
|
49
49
|
*/
|
|
50
50
|
indexeddb: 'IndexedDB',
|
|
51
|
-
/**
|
|
52
|
-
* @description Text in sidebar of the Application panel.
|
|
53
|
-
*/
|
|
54
|
-
webSql: 'Web SQL',
|
|
55
51
|
/**
|
|
56
52
|
* @description Text of checkbox to include running the performance audits in Lighthouse.
|
|
57
53
|
*/
|
|
@@ -713,7 +709,6 @@ export class LighthouseController extends Common.ObjectWrapper.ObjectWrapper<Eve
|
|
|
713
709
|
const STORAGE_TYPE_NAMES = new Map([
|
|
714
710
|
[Protocol.Storage.StorageType.Local_storage, i18nLazyString(UIStrings.localStorage)],
|
|
715
711
|
[Protocol.Storage.StorageType.Indexeddb, i18nLazyString(UIStrings.indexeddb)],
|
|
716
|
-
[Protocol.Storage.StorageType.Websql, i18nLazyString(UIStrings.webSql)],
|
|
717
712
|
]);
|
|
718
713
|
|
|
719
714
|
let presets: LighthouseModel.RunTypes.Preset[]|null = null;
|
|
@@ -31,13 +31,13 @@
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
:host-context(.sources-edit-breakpoint-dialog) .source-frame-breakpoint-toolbar {
|
|
34
|
-
font-family:
|
|
34
|
+
font-family: var(--default-font-family);
|
|
35
35
|
font-size: 12px;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
:host-context(.sources-edit-breakpoint-dialog) .link,
|
|
39
39
|
.devtools-link {
|
|
40
|
-
font-family:
|
|
40
|
+
font-family: var(--default-font-family);
|
|
41
41
|
font-size: 12px;
|
|
42
42
|
margin: 0 3px;
|
|
43
43
|
}
|