chrome-devtools-frontend 1.0.1665921 → 1.0.1667564

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/.agents/skills/devtools-testing-guidance/SKILL.md +4 -0
  2. package/.agents/skills/migrate-chromium-test/SKILL.md +63 -48
  3. package/.agents/skills/ui-eng-vision-local-lit-renderer/SKILL.md +14 -5
  4. package/.agents/skills/ui-eng-vision-logic-consolidator/SKILL.md +11 -2
  5. package/.agents/skills/ui-eng-vision-orchestrator/SKILL.md +46 -9
  6. package/.agents/skills/ui-eng-vision-test-scaffolder/SKILL.md +20 -1
  7. package/.agents/skills/ui-eng-vision-widget-promoter/SKILL.md +9 -0
  8. package/front_end/core/host/AidaClient.ts +115 -64
  9. package/front_end/core/host/GcaClient.ts +3 -3
  10. package/front_end/core/host/InspectorFrontendHostAPI.ts +1 -0
  11. package/front_end/core/host/InspectorFrontendHostStub.ts +3 -3
  12. package/front_end/core/host/UserMetrics.ts +50 -13
  13. package/front_end/core/sdk/CSSMatchedStyles.ts +2 -5
  14. package/front_end/core/sdk/CSSPropertyParserMatchers.ts +12 -0
  15. package/front_end/core/sdk/Connections.ts +1 -1
  16. package/front_end/core/sdk/DOMModel.test.api.ts +104 -0
  17. package/front_end/core/sdk/DOMModel.ts +23 -11
  18. package/front_end/core/sdk/DebuggerModel.ts +9 -9
  19. package/front_end/core/sdk/IsolateManager.ts +1 -1
  20. package/front_end/core/sdk/NetworkManager.ts +105 -4
  21. package/front_end/core/sdk/NetworkRequest.ts +10 -55
  22. package/front_end/core/sdk/OverlayModel.ts +15 -14
  23. package/front_end/core/sdk/RemoteObject.ts +1 -1
  24. package/front_end/devtools_compatibility.js +1 -0
  25. package/front_end/entrypoints/main/MainImpl.ts +5 -12
  26. package/front_end/entrypoints/main/SimpleApp.ts +9 -3
  27. package/front_end/foundation/Universe.ts +22 -0
  28. package/front_end/generated/InspectorBackendCommands.ts +2 -2
  29. package/front_end/generated/protocol.ts +2 -1
  30. package/front_end/models/ai_assistance/agents/AiAgent.ts +22 -13
  31. package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +23 -10
  32. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +21 -5
  33. package/front_end/models/computed_style/ComputedStyleModel.ts +4 -7
  34. package/front_end/models/crux-manager/CrUXManager.ts +4 -0
  35. package/front_end/models/extensions/ExtensionAPI.ts +3 -3
  36. package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +2 -2
  37. package/front_end/models/issues_manager/CookieIssue.ts +6 -127
  38. package/front_end/models/issues_manager/descriptions/CoepCorpNotSameOrigin.md +2 -2
  39. package/front_end/models/issues_manager/descriptions/CoepCorpNotSameOriginAfterDefaultedToSameOriginByCoep.md +3 -3
  40. package/front_end/models/issues_manager/descriptions/CoepCorpNotSameSite.md +2 -2
  41. package/front_end/models/issues_manager/descriptions/CoepFrameResourceNeedsCoepHeader.md +1 -1
  42. package/front_end/models/issues_manager/descriptions/CompatibilityModeQuirks.md +1 -1
  43. package/front_end/models/issues_manager/descriptions/CookieAttributeValueExceedsMaxSize.md +2 -2
  44. package/front_end/models/issues_manager/descriptions/LowTextContrast.md +1 -1
  45. package/front_end/models/issues_manager/descriptions/SameSiteNoneInsecureErrorRead.md +1 -1
  46. package/front_end/models/issues_manager/descriptions/SameSiteNoneInsecureErrorSet.md +1 -1
  47. package/front_end/models/issues_manager/descriptions/SameSiteNoneInsecureWarnRead.md +1 -1
  48. package/front_end/models/issues_manager/descriptions/SameSiteNoneInsecureWarnSet.md +1 -1
  49. package/front_end/models/issues_manager/descriptions/SameSiteUnspecifiedLaxAllowUnsafeRead.md +3 -3
  50. package/front_end/models/issues_manager/descriptions/SameSiteUnspecifiedLaxAllowUnsafeSet.md +3 -3
  51. package/front_end/models/issues_manager/descriptions/bounceTrackingMitigations.md +1 -1
  52. package/front_end/models/issues_manager/descriptions/connectionAllowlistInvalidAllowlistItemType.md +2 -2
  53. package/front_end/models/issues_manager/descriptions/connectionAllowlistInvalidHeader.md +2 -2
  54. package/front_end/models/issues_manager/descriptions/connectionAllowlistInvalidUrlPattern.md +3 -3
  55. package/front_end/models/issues_manager/descriptions/connectionAllowlistItemNotInnerList.md +2 -2
  56. package/front_end/models/issues_manager/descriptions/connectionAllowlistMoreThanOneList.md +2 -2
  57. package/front_end/models/issues_manager/descriptions/connectionAllowlistReportingEndpointNotToken.md +1 -1
  58. package/front_end/models/issues_manager/descriptions/cookieCrossSiteRedirectDowngrade.md +3 -3
  59. package/front_end/models/issues_manager/descriptions/cookieExcludeBlockedWithinRelatedWebsiteSet.md +1 -1
  60. package/front_end/models/issues_manager/descriptions/cookieExcludePortMismatch.md +1 -1
  61. package/front_end/models/issues_manager/descriptions/cookieExcludeSchemeMismatch.md +1 -1
  62. package/front_end/models/issues_manager/descriptions/cookieExcludeThirdPartyPhaseoutSet.md +1 -1
  63. package/front_end/models/issues_manager/descriptions/cookieWarnThirdPartyPhaseoutRead.md +1 -1
  64. package/front_end/models/issues_manager/descriptions/corsAllowCredentialsRequired.md +1 -1
  65. package/front_end/models/issues_manager/descriptions/corsDisabledScheme.md +2 -2
  66. package/front_end/models/issues_manager/descriptions/corsDisallowedByMode.md +2 -2
  67. package/front_end/models/issues_manager/descriptions/corsHeaderDisallowedByPreflightResponse.md +1 -1
  68. package/front_end/models/issues_manager/descriptions/corsInvalidHeaderValues.md +3 -3
  69. package/front_end/models/issues_manager/descriptions/corsLocalNetworkAccessPermissionDenied.md +1 -1
  70. package/front_end/models/issues_manager/descriptions/corsMethodDisallowedByPreflightResponse.md +1 -1
  71. package/front_end/models/issues_manager/descriptions/corsNoCorsRedirectModeNotFollow.md +1 -1
  72. package/front_end/models/issues_manager/descriptions/corsOriginMismatch.md +3 -3
  73. package/front_end/models/issues_manager/descriptions/corsPreflightResponseInvalid.md +2 -2
  74. package/front_end/models/issues_manager/descriptions/corsRedirectContainsCredentials.md +3 -3
  75. package/front_end/models/issues_manager/descriptions/corsWildcardOriginNotAllowed.md +4 -3
  76. package/front_end/models/issues_manager/descriptions/cspEvalViolation.md +4 -4
  77. package/front_end/models/issues_manager/descriptions/cspInlineViolation.md +2 -2
  78. package/front_end/models/issues_manager/descriptions/cspTrustedTypesPolicyViolation.md +2 -2
  79. package/front_end/models/issues_manager/descriptions/cspTrustedTypesSinkViolation.md +4 -4
  80. package/front_end/models/issues_manager/descriptions/cspURLViolation.md +4 -4
  81. package/front_end/models/issues_manager/descriptions/emailVerificationRequestAccountsEmptyList.md +1 -1
  82. package/front_end/models/issues_manager/descriptions/emailVerificationRequestAccountsHttpNotFound.md +1 -1
  83. package/front_end/models/issues_manager/descriptions/emailVerificationRequestAccountsInvalidContentType.md +1 -1
  84. package/front_end/models/issues_manager/descriptions/emailVerificationRequestAccountsInvalidResponse.md +1 -1
  85. package/front_end/models/issues_manager/descriptions/emailVerificationRequestAccountsNoResponse.md +1 -1
  86. package/front_end/models/issues_manager/descriptions/emailVerificationRequestDnsFetchFailed.md +1 -1
  87. package/front_end/models/issues_manager/descriptions/emailVerificationRequestDnsInvalidRecord.md +1 -1
  88. package/front_end/models/issues_manager/descriptions/emailVerificationRequestEmailVerificationWellKnownHttpNotFound.md +1 -1
  89. package/front_end/models/issues_manager/descriptions/emailVerificationRequestEmailVerificationWellKnownInvalidContentType.md +1 -1
  90. package/front_end/models/issues_manager/descriptions/emailVerificationRequestEmailVerificationWellKnownInvalidResponse.md +1 -1
  91. package/front_end/models/issues_manager/descriptions/emailVerificationRequestEmailVerificationWellKnownNoResponse.md +1 -1
  92. package/front_end/models/issues_manager/descriptions/emailVerificationRequestInvalidEmail.md +1 -1
  93. package/front_end/models/issues_manager/descriptions/emailVerificationRequestJwksHttpNotFound.md +1 -1
  94. package/front_end/models/issues_manager/descriptions/emailVerificationRequestJwksInvalidResponse.md +1 -1
  95. package/front_end/models/issues_manager/descriptions/emailVerificationRequestKeyBindingSigningFailed.md +1 -1
  96. package/front_end/models/issues_manager/descriptions/emailVerificationRequestRpOriginIsOpaque.md +1 -1
  97. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenHttpNotFound.md +1 -1
  98. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenInvalidContentType.md +1 -1
  99. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenInvalidResponse.md +1 -1
  100. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenInvalidSdJwt.md +1 -1
  101. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenMalformedSdJwt.md +1 -1
  102. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenNoResponse.md +1 -1
  103. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbInvalidAudience.md +1 -1
  104. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbInvalidIssuedAt.md +1 -1
  105. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbInvalidNonce.md +1 -1
  106. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbInvalidSdHash.md +1 -1
  107. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbInvalidTyp.md +1 -1
  108. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbMissingAud.md +1 -1
  109. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbMissingCnf.md +1 -1
  110. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbMissingIat.md +1 -1
  111. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbMissingNonce.md +1 -1
  112. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbMissingSdHash.md +1 -1
  113. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationKbSignatureFailed.md +1 -1
  114. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidEmail.md +1 -1
  115. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidEmailVerified.md +1 -1
  116. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidHolderKey.md +1 -1
  117. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidIssuedAt.md +1 -1
  118. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtInvalidIssuer.md +1 -1
  119. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtJwksMissingKeys.md +1 -1
  120. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtMissingCnf.md +1 -1
  121. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtMissingEmail.md +1 -1
  122. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtMissingIat.md +1 -1
  123. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtMissingIss.md +1 -1
  124. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtSignatureFailed.md +1 -1
  125. package/front_end/models/issues_manager/descriptions/emailVerificationRequestTokenVerificationSdJwtUnsupportedHeaderAlg.md +1 -1
  126. package/front_end/models/issues_manager/descriptions/emailVerificationRequestUserLoggedOut.md +1 -1
  127. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownAccountsEndpointCrossOrigin.md +1 -1
  128. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownHttpNotFound.md +1 -1
  129. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownInvalidContentType.md +1 -1
  130. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownInvalidResponse.md +1 -1
  131. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownIssuanceEndpointCrossOrigin.md +1 -1
  132. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownListEmpty.md +1 -1
  133. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownMissingAccountsEndpoint.md +1 -1
  134. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownMissingIssuanceEndpoint.md +1 -1
  135. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownNoResponse.md +1 -1
  136. package/front_end/models/issues_manager/descriptions/emailVerificationRequestWellKnownUnsupportedSigningAlgorithm.md +1 -1
  137. package/front_end/models/issues_manager/descriptions/federatedAuthRequestAccountsHttpNotFound.md +1 -1
  138. package/front_end/models/issues_manager/descriptions/federatedAuthRequestAccountsInvalidResponse.md +1 -1
  139. package/front_end/models/issues_manager/descriptions/federatedAuthRequestAccountsNoResponse.md +1 -1
  140. package/front_end/models/issues_manager/descriptions/federatedAuthRequestApprovalDeclined.md +1 -1
  141. package/front_end/models/issues_manager/descriptions/federatedAuthRequestCanceled.md +1 -1
  142. package/front_end/models/issues_manager/descriptions/federatedAuthRequestErrorFetchingSignin.md +1 -1
  143. package/front_end/models/issues_manager/descriptions/federatedAuthRequestErrorIdToken.md +1 -1
  144. package/front_end/models/issues_manager/descriptions/federatedAuthRequestIdTokenHttpNotFound.md +1 -1
  145. package/front_end/models/issues_manager/descriptions/federatedAuthRequestIdTokenInvalidRequest.md +1 -1
  146. package/front_end/models/issues_manager/descriptions/federatedAuthRequestIdTokenInvalidResponse.md +1 -1
  147. package/front_end/models/issues_manager/descriptions/federatedAuthRequestIdTokenNoResponse.md +1 -1
  148. package/front_end/models/issues_manager/descriptions/federatedAuthRequestInvalidSigninResponse.md +1 -1
  149. package/front_end/models/issues_manager/descriptions/federatedAuthRequestManifestHttpNotFound.md +1 -1
  150. package/front_end/models/issues_manager/descriptions/federatedAuthRequestManifestInvalidResponse.md +1 -1
  151. package/front_end/models/issues_manager/descriptions/federatedAuthRequestManifestNoResponse.md +1 -1
  152. package/front_end/models/issues_manager/descriptions/federatedAuthRequestTooManyRequests.md +1 -1
  153. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestInvalidAccountsResponse.md +1 -1
  154. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestInvalidConfigOrWellKnown.md +1 -1
  155. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNoAccountSharingPermission.md +1 -1
  156. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNoApiPermission.md +1 -1
  157. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNoReturningUserFromFetchedAccounts.md +1 -1
  158. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotIframe.md +1 -1
  159. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotPotentiallyTrustworthy.md +1 -1
  160. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotSameOrigin.md +1 -1
  161. package/front_end/models/issues_manager/descriptions/federatedAuthUserInfoRequestNotSignedInWithIdp.md +1 -1
  162. package/front_end/models/issues_manager/descriptions/fetchingPartitionedBlobURL.md +2 -2
  163. package/front_end/models/issues_manager/descriptions/genericFormAriaLabelledByToNonExistingIdError.md +2 -2
  164. package/front_end/models/issues_manager/descriptions/genericFormAutocompleteAttributeEmptyError.md +1 -1
  165. package/front_end/models/issues_manager/descriptions/genericFormDuplicateIdForInputError.md +1 -1
  166. package/front_end/models/issues_manager/descriptions/genericFormEmptyIdAndNameAttributesForInputError.md +2 -2
  167. package/front_end/models/issues_manager/descriptions/genericFormInputAssignedAutocompleteValueToIdOrNameAttributeError.md +2 -2
  168. package/front_end/models/issues_manager/descriptions/genericFormInputHasWrongButWellIntendedAutocompleteValueError.md +1 -1
  169. package/front_end/models/issues_manager/descriptions/genericFormInputWithNoLabelError.md +1 -1
  170. package/front_end/models/issues_manager/descriptions/genericFormLabelForMatchesNonExistingIdError.md +2 -2
  171. package/front_end/models/issues_manager/descriptions/genericFormLabelForNameError.md +1 -1
  172. package/front_end/models/issues_manager/descriptions/genericFormLabelHasNeitherForNorNestedInputError.md +1 -1
  173. package/front_end/models/issues_manager/descriptions/genericFormModelContextMissingToolName.md +1 -1
  174. package/front_end/models/issues_manager/descriptions/genericFormModelContextParameterMissingName.md +1 -1
  175. package/front_end/models/issues_manager/descriptions/genericFormModelContextRequiredParameterMissingName.md +1 -1
  176. package/front_end/models/issues_manager/descriptions/genericNavigationEntryMarkedSkippable.md +2 -2
  177. package/front_end/models/issues_manager/descriptions/heavyAd.md +1 -1
  178. package/front_end/models/issues_manager/descriptions/lazyLoadImageZeroSize.md +1 -1
  179. package/front_end/models/issues_manager/descriptions/navigatingPartitionedBlobURL.md +3 -3
  180. package/front_end/models/issues_manager/descriptions/permissionElementActivationDisabled.md +1 -1
  181. package/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluder.md +1 -1
  182. package/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluderParent.md +1 -1
  183. package/front_end/models/issues_manager/descriptions/permissionElementFencedFrameDisallowed.md +2 -2
  184. package/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooLarge.md +2 -2
  185. package/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooSmall.md +2 -2
  186. package/front_end/models/issues_manager/descriptions/permissionElementInsetBoxShadowUnsupported.md +1 -1
  187. package/front_end/models/issues_manager/descriptions/permissionElementInvalidDisplayStyle.md +2 -2
  188. package/front_end/models/issues_manager/descriptions/permissionElementInvalidSizeValue.md +2 -2
  189. package/front_end/models/issues_manager/descriptions/permissionElementInvalidType.md +2 -2
  190. package/front_end/models/issues_manager/descriptions/permissionElementInvalidTypeActivation.md +2 -2
  191. package/front_end/models/issues_manager/descriptions/permissionElementNonOpaqueColor.md +1 -1
  192. package/front_end/models/issues_manager/descriptions/permissionElementPaddingBottomUnsupported.md +2 -2
  193. package/front_end/models/issues_manager/descriptions/permissionElementPaddingRightUnsupported.md +2 -2
  194. package/front_end/models/issues_manager/descriptions/permissionElementRequestInProgress.md +2 -2
  195. package/front_end/models/issues_manager/descriptions/permissionElementSecurityChecksFailed.md +1 -1
  196. package/front_end/models/issues_manager/descriptions/permissionElementTypeNotSupported.md +2 -2
  197. package/front_end/models/issues_manager/descriptions/permissionElementUntrustedEvent.md +1 -1
  198. package/front_end/models/issues_manager/descriptions/placeholderDescriptionForInvisibleIssues.md +1 -1
  199. package/front_end/models/issues_manager/descriptions/selectElementAccessibilityDisallowedOptGroupChild.md +1 -1
  200. package/front_end/models/issues_manager/descriptions/selectElementAccessibilityDisallowedSelectChild.md +1 -1
  201. package/front_end/models/issues_manager/descriptions/selectElementAccessibilityInteractiveContentAttributesSelectDescendant.md +1 -1
  202. package/front_end/models/issues_manager/descriptions/selectElementAccessibilityInteractiveContentLegendChild.md +1 -1
  203. package/front_end/models/issues_manager/descriptions/selectElementAccessibilityInteractiveContentOptionChild.md +1 -1
  204. package/front_end/models/issues_manager/descriptions/selectElementAccessibilityNonPhrasingContentOptionChild.md +1 -1
  205. package/front_end/models/issues_manager/descriptions/selectivePermissionsIntervention.md +3 -3
  206. package/front_end/models/issues_manager/descriptions/sharedArrayBuffer.md +1 -1
  207. package/front_end/models/issues_manager/descriptions/sharedDictionaryUseErrorCrossOriginNoCorsRequest.md +1 -1
  208. package/front_end/models/issues_manager/descriptions/sharedDictionaryUseErrorMatchingDictionaryNotUsed.md +1 -1
  209. package/front_end/models/issues_manager/descriptions/sharedDictionaryUseErrorUnexpectedContentDictionaryHeader.md +1 -1
  210. package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorCossOriginNoCorsRequest.md +1 -1
  211. package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorDisallowedBySettings.md +1 -1
  212. package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorExpiredResponse.md +1 -1
  213. package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorFeatureDisabled.md +2 -2
  214. package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorInvalidStructuredHeader.md +1 -1
  215. package/front_end/models/issues_manager/descriptions/sharedDictionaryWriteErrorNavigationRequest.md +2 -2
  216. package/front_end/models/issues_manager/descriptions/sriInvalidSignatureHeader.md +4 -4
  217. package/front_end/models/issues_manager/descriptions/sriInvalidSignatureInputHeader.md +4 -4
  218. package/front_end/models/issues_manager/descriptions/sriMissingSignatureHeader.md +1 -1
  219. package/front_end/models/issues_manager/descriptions/sriMissingSignatureInputHeader.md +2 -2
  220. package/front_end/models/issues_manager/descriptions/sriSignatureHeaderValueIsIncorrectLength.md +2 -2
  221. package/front_end/models/issues_manager/descriptions/sriSignatureHeaderValueIsNotByteSequence.md +4 -4
  222. package/front_end/models/issues_manager/descriptions/sriSignatureHeaderValueIsParameterized.md +4 -4
  223. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidComponentName.md +1 -1
  224. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidComponentType.md +2 -2
  225. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidDerivedComponentParameter.md +1 -1
  226. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidHeaderComponentParameter.md +1 -1
  227. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderInvalidParameter.md +2 -2
  228. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderKeyIdLength.md +5 -5
  229. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderMissingLabel.md +3 -3
  230. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderMissingRequiredParameters.md +2 -2
  231. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderValueMissingComponents.md +2 -2
  232. package/front_end/models/issues_manager/descriptions/sriSignatureInputHeaderValueNotInnerList.md +2 -2
  233. package/front_end/models/issues_manager/descriptions/sriValidationFailedIntegrityMismatch.md +4 -4
  234. package/front_end/models/issues_manager/descriptions/sriValidationFailedInvalidLength.md +3 -3
  235. package/front_end/models/issues_manager/descriptions/sriValidationFailedSignatureExpired.md +2 -2
  236. package/front_end/models/issues_manager/descriptions/sriValidationFailedSignatureMismatch.md +2 -2
  237. package/front_end/models/issues_manager/descriptions/stylesheetLateImport.md +1 -1
  238. package/front_end/models/issues_manager/descriptions/summaryElementAccessibilityInteractiveContentSummaryDescendant.md +1 -1
  239. package/front_end/models/issues_manager/descriptions/unencodedDigestIncorrectDigestLength.md +2 -2
  240. package/front_end/models/issues_manager/descriptions/unencodedDigestIncorrectDigestType.md +3 -3
  241. package/front_end/models/issues_manager/descriptions/unencodedDigestMalformedDictionary.md +2 -2
  242. package/front_end/models/issues_manager/descriptions/unencodedDigestUnknownAlgorithm.md +1 -1
  243. package/front_end/models/live-metrics/LiveMetrics.ts +59 -19
  244. package/front_end/models/live-metrics/web-vitals-injected/README.md +1 -1
  245. package/front_end/models/live-metrics/web-vitals-injected/spec/spec.ts +6 -1
  246. package/front_end/models/live-metrics/web-vitals-injected/web-vitals-injected.ts +11 -3
  247. package/front_end/models/logs/LogManager.ts +1 -1
  248. package/front_end/models/persistence/FileSystemWorkspaceBinding.ts +1 -1
  249. package/front_end/models/source_map_scopes/FunctionCodeResolver.ts +6 -7
  250. package/front_end/models/workspace_diff/WorkspaceDiff.ts +13 -14
  251. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +15 -7
  252. package/front_end/panels/application/BackgroundServiceView.ts +18 -20
  253. package/front_end/panels/application/DOMStorageItemsView.ts +1 -2
  254. package/front_end/panels/application/KeyValueStorageItemsView.ts +12 -0
  255. package/front_end/panels/autofill/AutofillView.ts +17 -17
  256. package/front_end/panels/autofill/autofillView.css +7 -8
  257. package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +31 -31
  258. package/front_end/panels/browser_debugger/DOMBreakpointsSidebarPane.ts +15 -15
  259. package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +12 -12
  260. package/front_end/panels/browser_debugger/browser_debugger-meta.ts +27 -27
  261. package/front_end/panels/common/AiCodeCompletionDisclaimer.ts +14 -6
  262. package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +14 -6
  263. package/front_end/panels/common/AiCodeCompletionTeaser.ts +13 -6
  264. package/front_end/panels/common/GeminiRebrandPromoDialog.ts +1 -1
  265. package/front_end/panels/console/ConsoleInsightTeaser.ts +13 -6
  266. package/front_end/panels/console/ConsoleView.ts +6 -6
  267. package/front_end/panels/console_counters/WarningErrorCounter.ts +4 -4
  268. package/front_end/panels/coverage/CoverageModel.ts +11 -1
  269. package/front_end/panels/elements/StylePropertiesSection.ts +59 -10
  270. package/front_end/panels/elements/StylesAiCodeCompletionProvider.ts +18 -7
  271. package/front_end/panels/elements/StylesSidebarPane.ts +48 -0
  272. package/front_end/panels/emulation/AdvancedApp.ts +18 -8
  273. package/front_end/panels/emulation/DeviceModeToolbar.ts +0 -1
  274. package/front_end/panels/emulation/DeviceModeView.ts +289 -164
  275. package/front_end/panels/emulation/MediaQueryInspector.ts +10 -6
  276. package/front_end/panels/emulation/deviceModeView.css +1 -0
  277. package/front_end/panels/event_listeners/EventListenersView.ts +8 -8
  278. package/front_end/panels/explain/components/ConsoleInsight.ts +15 -7
  279. package/front_end/panels/lighthouse/LighthouseController.ts +1 -6
  280. package/front_end/panels/network/NetworkLogView.ts +13 -14
  281. package/front_end/panels/screencast/ScreencastApp.ts +12 -6
  282. package/front_end/panels/screencast/ScreencastView.ts +37 -11
  283. package/front_end/panels/sensors/locationsSettingsTab.css +4 -0
  284. package/front_end/panels/settings/AISettingsTab.ts +13 -6
  285. package/front_end/panels/sources/DebuggerPlugin.ts +13 -2
  286. package/front_end/panels/sources/breakpointEditDialog.css +2 -2
  287. package/front_end/panels/timeline/components/LiveMetricsView.ts +14 -1
  288. package/front_end/panels/timeline/components/cpuThrottlingSelector.css +4 -0
  289. package/front_end/panels/timeline/components/liveMetricsView.css +28 -0
  290. package/front_end/panels/timeline/timeline-meta.ts +13 -0
  291. package/front_end/third_party/chromium/README.chromium +1 -1
  292. package/front_end/ui/components/menus/menu.css +4 -0
  293. package/front_end/ui/components/menus/menuItem.css +4 -0
  294. package/front_end/ui/components/menus/selectMenu.css +4 -0
  295. package/front_end/ui/components/menus/selectMenuButton.css +4 -0
  296. package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +21 -10
  297. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +23 -12
  298. package/front_end/ui/components/text_editor/config.ts +7 -0
  299. package/front_end/ui/legacy/AppProvider.ts +2 -1
  300. package/front_end/ui/legacy/RootView.ts +8 -1
  301. package/front_end/ui/legacy/UniverseRequestEvent.ts +19 -0
  302. package/front_end/ui/legacy/Widget.ts +49 -6
  303. package/front_end/ui/legacy/inspectorCommon.css +1 -1
  304. package/front_end/ui/legacy/legacy.ts +2 -0
  305. package/front_end/ui/visual_logging/KnownContextValues.ts +2 -0
  306. package/package.json +1 -2
  307. package/front_end/models/issues_manager/descriptions/SameSiteExcludeContextDowngradeRead.md +0 -8
  308. package/front_end/models/issues_manager/descriptions/SameSiteExcludeContextDowngradeSet.md +0 -8
  309. package/front_end/models/issues_manager/descriptions/SameSiteExcludeNavigationContextDowngrade.md +0 -8
  310. package/front_end/models/issues_manager/descriptions/SameSiteWarnCrossDowngradeRead.md +0 -8
  311. package/front_end/models/issues_manager/descriptions/SameSiteWarnCrossDowngradeSet.md +0 -8
  312. package/front_end/models/issues_manager/descriptions/SameSiteWarnStrictLaxDowngradeStrict.md +0 -8
@@ -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
- private readonly topRuler: Ruler;
69
- private readonly leftRuler: Ruler;
70
- private responsivePresetsContainer!: HTMLElement;
71
- private screenArea!: HTMLElement;
72
- private pageArea!: HTMLElement;
73
- private outlineImage!: HTMLElement;
74
- private contentClip!: HTMLElement;
75
- private contentArea!: HTMLElement;
76
- private rightResizerElement!: HTMLElement;
77
- private leftResizerElement!: HTMLElement;
78
- private bottomResizerElement!: HTMLElement;
79
- private bottomRightResizerElement!: HTMLElement;
80
- private bottomLeftResizerElement!: HTMLElement;
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
- private mediaInspectorContainer!: HTMLElement;
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.topRuler = new Ruler();
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
- private createUI(): void {
133
- this.toolbar = new DeviceModeToolbar();
134
- this.toolbar.model = this.model;
135
- this.toolbar.show(this.contentElement);
136
- this.contentClip = this.contentElement.createChild('div', 'device-mode-content-clip vbox');
137
- this.responsivePresetsContainer = this.contentClip.createChild('div', 'device-mode-presets-container');
138
- this.responsivePresetsContainer.setAttribute('jslog', `${VisualLogging.responsivePresets()}`);
139
- this.renderPresets();
140
- this.mediaInspectorContainer = this.contentClip.createChild('div', 'device-mode-media-container');
141
- this.contentArea = this.contentClip.createChild('div', 'device-mode-content-area');
142
- this.outlineImage = this.contentArea.createChild('img', 'device-mode-outline-image hidden fill');
143
- this.outlineImage.addEventListener('load', this.onImageLoaded.bind(this, this.outlineImage, true), false);
144
- this.outlineImage.addEventListener('error', this.onImageLoaded.bind(this, this.outlineImage, false), false);
145
- this.screenArea = this.contentArea.createChild('div', 'device-mode-screen-area');
146
- this.screenImage = this.screenArea.createChild('img', 'device-mode-screen-image hidden');
147
- this.screenImage.addEventListener('load', this.onImageLoaded.bind(this, this.screenImage, true), false);
148
- this.screenImage.addEventListener('error', this.onImageLoaded.bind(this, this.screenImage, false), false);
149
- this.bottomRightResizerElement =
150
- this.screenArea.createChild('div', 'device-mode-resizer device-mode-bottom-right-resizer');
151
- this.bottomRightResizerElement.createChild('div', '');
152
- this.createResizer(this.bottomRightResizerElement, 2, 1);
153
- this.bottomLeftResizerElement =
154
- this.screenArea.createChild('div', 'device-mode-resizer device-mode-bottom-left-resizer');
155
- this.bottomLeftResizerElement.createChild('div', '');
156
- this.createResizer(this.bottomLeftResizerElement, -2, 1);
157
- this.rightResizerElement = this.screenArea.createChild('div', 'device-mode-resizer device-mode-right-resizer');
158
- this.rightResizerElement.createChild('div', '');
159
- this.createResizer(this.rightResizerElement, 2, 0);
160
- this.leftResizerElement = this.screenArea.createChild('div', 'device-mode-resizer device-mode-left-resizer');
161
- this.leftResizerElement.createChild('div', '');
162
- this.createResizer(this.leftResizerElement, -2, 0);
163
- this.bottomResizerElement = this.screenArea.createChild('div', 'device-mode-resizer device-mode-bottom-resizer');
164
- this.bottomResizerElement.createChild('div', '');
165
- this.createResizer(this.bottomResizerElement, 0, 1);
166
- this.bottomResizerElement.addEventListener('dblclick', this.model.setHeight.bind(this.model, 0), false);
167
- UI.Tooltip.Tooltip.install(this.bottomResizerElement, i18nString(UIStrings.doubleclickForFullHeight));
168
- this.pageArea = this.screenArea.createChild('div', 'device-mode-page-area');
169
- this.pageArea.createChild('slot');
170
- }
171
-
172
- private renderPresets(): void {
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
- // eslint-disable-next-line @devtools/no-lit-render-outside-of-view
192
- render(html`
193
- <div class="device-mode-presets-container-inner">
194
- ${sizes.map((size, idx) => html`
195
- <div class="fill device-mode-preset-bar-outer">
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 createResizer(element: HTMLElement, widthFactor: number, heightFactor: number):
210
- UI.ResizerWidget.ResizerWidget {
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 = this.contentArea.getBoundingClientRect();
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
- private scale: number;
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.scale = 1;
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
- setAxisTransform(scale: number): void {
221
- if (Math.abs(this.scale - scale) < 1e-8) {
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.scale = scale;
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.scale;
375
+ return UI.ZoomManager.ZoomManager.instance().zoomFactor() / this.#scale;
372
376
  }
373
377
 
374
378
  override wasShown(): void {
@@ -280,6 +280,7 @@ devtools-toolbar.device-mode-toolbar-options {
280
280
  }
281
281
 
282
282
  .device-mode-ruler {
283
+ display: block;
283
284
  position: absolute;
284
285
  overflow: visible;
285
286
  }
@@ -21,31 +21,31 @@ import eventListenersViewStyles from './eventListenersView.css.js';
21
21
 
22
22
  const UIStrings = {
23
23
  /**
24
- * @description Empty holder text content in Event Listeners View of the Event Listener Debugging pane in the Sources panel
24
+ * @description Empty holder text content in Event Listeners view of the Event Listeners sidebar in the Sources panel.
25
25
  */
26
26
  noEventListeners: 'No event listeners',
27
27
  /**
28
- * @description Empty holder text content in Event Listeners View of the Event Listener Debugging pane in the Elements panel
28
+ * @description Empty holder text content in Event Listeners view of the Event Listeners sidebar in the Elements panel.
29
29
  */
30
30
  eventListenersExplanation: 'On this page you will find registered event listeners',
31
31
  /**
32
- * @description Delete button title in Event Listeners View of the Event Listener Debugging pane in the Sources panel
32
+ * @description Delete button title in Event Listeners view of the Event Listeners sidebar in the Sources panel.
33
33
  */
34
34
  deleteEventListener: 'Delete event listener',
35
35
  /**
36
- * @description Passive button text content in Event Listeners View of the Event Listener Debugging pane in the Sources panel
36
+ * @description Passive button text content in Event Listeners view of the Event Listeners sidebar in the Sources panel.
37
37
  */
38
- togglePassive: 'Toggle Passive',
38
+ togglePassive: 'Toggle passive',
39
39
  /**
40
- * @description Passive button title in Event Listeners View of the Event Listener Debugging pane in the Sources panel
40
+ * @description Passive button title in Event Listeners view of the Event Listeners sidebar in the Sources panel.
41
41
  */
42
42
  toggleWhetherEventListenerIs: 'Toggle whether event listener is passive or blocking',
43
43
  /**
44
- * @description A context menu item to reveal a node in the DOM tree of the Elements Panel
44
+ * @description A context menu item to reveal a node in the DOM tree of the Elements panel.
45
45
  */
46
46
  openInElementsPanel: 'Open in Elements panel',
47
47
  /**
48
- * @description Text in Event Listeners Widget of the Elements panel
48
+ * @description Text in Event Listeners widget of the Elements panel.
49
49
  */
50
50
  passive: 'Passive',
51
51
  } as const;