brave-mcp 0.1.0
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/LICENSE +202 -0
- package/README.md +802 -0
- package/build/src/DevToolsConnectionAdapter.js +69 -0
- package/build/src/DevtoolsUtils.js +294 -0
- package/build/src/McpContext.js +676 -0
- package/build/src/McpPage.js +108 -0
- package/build/src/McpResponse.js +718 -0
- package/build/src/Mutex.js +37 -0
- package/build/src/PageCollector.js +310 -0
- package/build/src/SlimMcpResponse.js +18 -0
- package/build/src/WaitForHelper.js +153 -0
- package/build/src/bin/brave-devtools-cli-options.js +651 -0
- package/build/src/bin/brave-devtools-mcp-cli-options.js +312 -0
- package/build/src/bin/brave-devtools-mcp-main.js +35 -0
- package/build/src/bin/brave-devtools-mcp.js +22 -0
- package/build/src/bin/brave-devtools.js +190 -0
- package/build/src/bin/check-latest-version.js +25 -0
- package/build/src/bin/cliDefinitions.js +615 -0
- package/build/src/browser.js +295 -0
- package/build/src/daemon/client.js +152 -0
- package/build/src/daemon/daemon.js +202 -0
- package/build/src/daemon/types.js +6 -0
- package/build/src/daemon/utils.js +109 -0
- package/build/src/formatters/ConsoleFormatter.js +241 -0
- package/build/src/formatters/IssueFormatter.js +192 -0
- package/build/src/formatters/NetworkFormatter.js +218 -0
- package/build/src/formatters/SnapshotFormatter.js +134 -0
- package/build/src/index.js +216 -0
- package/build/src/issue-descriptions.js +39 -0
- package/build/src/logger.js +36 -0
- package/build/src/polyfill.js +7 -0
- package/build/src/telemetry/ClearcutLogger.js +234 -0
- package/build/src/telemetry/WatchdogClient.js +60 -0
- package/build/src/telemetry/flagUtils.js +45 -0
- package/build/src/telemetry/metricUtils.js +14 -0
- package/build/src/telemetry/persistence.js +53 -0
- package/build/src/telemetry/toolMetricsUtils.js +88 -0
- package/build/src/telemetry/types.js +38 -0
- package/build/src/telemetry/watchdog/ClearcutSender.js +203 -0
- package/build/src/telemetry/watchdog/main.js +127 -0
- package/build/src/third_party/devtools-formatter-worker.js +7 -0
- package/build/src/third_party/index.js +28 -0
- package/build/src/third_party/issue-descriptions/CoepCoopSandboxedIframeCannotNavigateToCoopPage.md +4 -0
- package/build/src/third_party/issue-descriptions/CoepCorpNotSameOrigin.md +8 -0
- package/build/src/third_party/issue-descriptions/CoepCorpNotSameOriginAfterDefaultedToSameOriginByCoep.md +18 -0
- package/build/src/third_party/issue-descriptions/CoepCorpNotSameSite.md +7 -0
- package/build/src/third_party/issue-descriptions/CoepFrameResourceNeedsCoepHeader.md +10 -0
- package/build/src/third_party/issue-descriptions/CompatibilityModeQuirks.md +5 -0
- package/build/src/third_party/issue-descriptions/CookieAttributeValueExceedsMaxSize.md +5 -0
- package/build/src/third_party/issue-descriptions/LowTextContrast.md +5 -0
- package/build/src/third_party/issue-descriptions/SameSiteExcludeContextDowngradeRead.md +8 -0
- package/build/src/third_party/issue-descriptions/SameSiteExcludeContextDowngradeSet.md +8 -0
- package/build/src/third_party/issue-descriptions/SameSiteExcludeNavigationContextDowngrade.md +8 -0
- package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureErrorRead.md +8 -0
- package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureErrorSet.md +8 -0
- package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureWarnRead.md +8 -0
- package/build/src/third_party/issue-descriptions/SameSiteNoneInsecureWarnSet.md +8 -0
- package/build/src/third_party/issue-descriptions/SameSiteUnspecifiedLaxAllowUnsafeRead.md +9 -0
- package/build/src/third_party/issue-descriptions/SameSiteUnspecifiedLaxAllowUnsafeSet.md +9 -0
- package/build/src/third_party/issue-descriptions/SameSiteWarnCrossDowngradeRead.md +8 -0
- package/build/src/third_party/issue-descriptions/SameSiteWarnCrossDowngradeSet.md +8 -0
- package/build/src/third_party/issue-descriptions/SameSiteWarnStrictLaxDowngradeStrict.md +8 -0
- package/build/src/third_party/issue-descriptions/arInsecureContext.md +7 -0
- package/build/src/third_party/issue-descriptions/arInvalidInfoHeader.md +5 -0
- package/build/src/third_party/issue-descriptions/arInvalidRegisterOsSourceHeader.md +5 -0
- package/build/src/third_party/issue-descriptions/arInvalidRegisterOsTriggerHeader.md +5 -0
- package/build/src/third_party/issue-descriptions/arInvalidRegisterSourceHeader.md +5 -0
- package/build/src/third_party/issue-descriptions/arInvalidRegisterTriggerHeader.md +5 -0
- package/build/src/third_party/issue-descriptions/arNavigationRegistrationUniqueScopeAlreadySet.md +5 -0
- package/build/src/third_party/issue-descriptions/arNavigationRegistrationWithoutTransientUserActivation.md +6 -0
- package/build/src/third_party/issue-descriptions/arNoRegisterOsSourceHeader.md +5 -0
- package/build/src/third_party/issue-descriptions/arNoRegisterOsTriggerHeader.md +5 -0
- package/build/src/third_party/issue-descriptions/arNoRegisterSourceHeader.md +5 -0
- package/build/src/third_party/issue-descriptions/arNoRegisterTriggerHeader.md +5 -0
- package/build/src/third_party/issue-descriptions/arNoWebOrOsSupport.md +4 -0
- package/build/src/third_party/issue-descriptions/arOsSourceIgnored.md +18 -0
- package/build/src/third_party/issue-descriptions/arOsTriggerIgnored.md +19 -0
- package/build/src/third_party/issue-descriptions/arPermissionPolicyDisabled.md +8 -0
- package/build/src/third_party/issue-descriptions/arSourceAndTriggerHeaders.md +9 -0
- package/build/src/third_party/issue-descriptions/arSourceIgnored.md +13 -0
- package/build/src/third_party/issue-descriptions/arTriggerIgnored.md +12 -0
- package/build/src/third_party/issue-descriptions/arUntrustworthyReportingOrigin.md +10 -0
- package/build/src/third_party/issue-descriptions/arWebAndOsHeaders.md +11 -0
- package/build/src/third_party/issue-descriptions/bounceTrackingMitigations.md +3 -0
- package/build/src/third_party/issue-descriptions/clientHintMetaTagAllowListInvalidOrigin.md +4 -0
- package/build/src/third_party/issue-descriptions/clientHintMetaTagModifiedHTML.md +4 -0
- package/build/src/third_party/issue-descriptions/connectionAllowlistInvalidAllowlistItemType.md +12 -0
- package/build/src/third_party/issue-descriptions/connectionAllowlistInvalidHeader.md +12 -0
- package/build/src/third_party/issue-descriptions/connectionAllowlistInvalidUrlPattern.md +8 -0
- package/build/src/third_party/issue-descriptions/connectionAllowlistItemNotInnerList.md +12 -0
- package/build/src/third_party/issue-descriptions/connectionAllowlistMoreThanOneList.md +7 -0
- package/build/src/third_party/issue-descriptions/connectionAllowlistReportingEndpointNotToken.md +10 -0
- package/build/src/third_party/issue-descriptions/cookieCrossSiteRedirectDowngrade.md +12 -0
- package/build/src/third_party/issue-descriptions/cookieExcludeBlockedWithinRelatedWebsiteSet.md +4 -0
- package/build/src/third_party/issue-descriptions/cookieExcludeDomainNonAscii.md +11 -0
- package/build/src/third_party/issue-descriptions/cookieExcludePortMismatch.md +8 -0
- package/build/src/third_party/issue-descriptions/cookieExcludeSchemeMismatch.md +7 -0
- package/build/src/third_party/issue-descriptions/cookieExcludeThirdPartyPhaseoutRead.md +6 -0
- package/build/src/third_party/issue-descriptions/cookieExcludeThirdPartyPhaseoutSet.md +6 -0
- package/build/src/third_party/issue-descriptions/cookieWarnDomainNonAscii.md +11 -0
- package/build/src/third_party/issue-descriptions/cookieWarnMetadataGrantRead.md +4 -0
- package/build/src/third_party/issue-descriptions/cookieWarnMetadataGrantSet.md +4 -0
- package/build/src/third_party/issue-descriptions/cookieWarnThirdPartyPhaseoutRead.md +6 -0
- package/build/src/third_party/issue-descriptions/cookieWarnThirdPartyPhaseoutSet.md +6 -0
- package/build/src/third_party/issue-descriptions/corsAllowCredentialsRequired.md +6 -0
- package/build/src/third_party/issue-descriptions/corsDisabledScheme.md +7 -0
- package/build/src/third_party/issue-descriptions/corsDisallowedByMode.md +7 -0
- package/build/src/third_party/issue-descriptions/corsHeaderDisallowedByPreflightResponse.md +5 -0
- package/build/src/third_party/issue-descriptions/corsInvalidHeaderValues.md +7 -0
- package/build/src/third_party/issue-descriptions/corsLocalNetworkAccessPermissionDenied.md +19 -0
- package/build/src/third_party/issue-descriptions/corsMethodDisallowedByPreflightResponse.md +5 -0
- package/build/src/third_party/issue-descriptions/corsNoCorsRedirectModeNotFollow.md +5 -0
- package/build/src/third_party/issue-descriptions/corsOriginMismatch.md +6 -0
- package/build/src/third_party/issue-descriptions/corsPreflightResponseInvalid.md +5 -0
- package/build/src/third_party/issue-descriptions/corsRedirectContainsCredentials.md +5 -0
- package/build/src/third_party/issue-descriptions/corsWildcardOriginNotAllowed.md +8 -0
- package/build/src/third_party/issue-descriptions/cspEvalViolation.md +9 -0
- package/build/src/third_party/issue-descriptions/cspInlineViolation.md +10 -0
- package/build/src/third_party/issue-descriptions/cspTrustedTypesPolicyViolation.md +5 -0
- package/build/src/third_party/issue-descriptions/cspTrustedTypesSinkViolation.md +8 -0
- package/build/src/third_party/issue-descriptions/cspURLViolation.md +10 -0
- package/build/src/third_party/issue-descriptions/deprecation.md +3 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestAccountsHttpNotFound.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestAccountsInvalidResponse.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestAccountsNoResponse.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestApprovalDeclined.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestCanceled.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestErrorFetchingSignin.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestErrorIdToken.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenHttpNotFound.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenInvalidRequest.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenInvalidResponse.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestIdTokenNoResponse.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestInvalidSigninResponse.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestManifestHttpNotFound.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestManifestInvalidResponse.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestManifestNoResponse.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthRequestTooManyRequests.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestInvalidAccountsResponse.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestInvalidConfigOrWellKnown.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNoAccountSharingPermission.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNoApiPermission.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNoReturningUserFromFetchedAccounts.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotIframe.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotPotentiallyTrustworthy.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotSameOrigin.md +1 -0
- package/build/src/third_party/issue-descriptions/federatedAuthUserInfoRequestNotSignedInWithIdp.md +1 -0
- package/build/src/third_party/issue-descriptions/fetchingPartitionedBlobURL.md +7 -0
- package/build/src/third_party/issue-descriptions/genericFormAriaLabelledByToNonExistingIdError.md +8 -0
- package/build/src/third_party/issue-descriptions/genericFormAutocompleteAttributeEmptyError.md +5 -0
- package/build/src/third_party/issue-descriptions/genericFormDuplicateIdForInputError.md +5 -0
- package/build/src/third_party/issue-descriptions/genericFormEmptyIdAndNameAttributesForInputError.md +5 -0
- package/build/src/third_party/issue-descriptions/genericFormInputAssignedAutocompleteValueToIdOrNameAttributeError.md +5 -0
- package/build/src/third_party/issue-descriptions/genericFormInputHasWrongButWellIntendedAutocompleteValueError.md +5 -0
- package/build/src/third_party/issue-descriptions/genericFormInputWithNoLabelError.md +5 -0
- package/build/src/third_party/issue-descriptions/genericFormLabelForMatchesNonExistingIdError.md +5 -0
- package/build/src/third_party/issue-descriptions/genericFormLabelForNameError.md +5 -0
- package/build/src/third_party/issue-descriptions/genericFormLabelHasNeitherForNorNestedInputError.md +5 -0
- package/build/src/third_party/issue-descriptions/genericNavigationEntryMarkedSkippable.md +7 -0
- package/build/src/third_party/issue-descriptions/genericResponseWasBlockedByORB.md +4 -0
- package/build/src/third_party/issue-descriptions/heavyAd.md +10 -0
- package/build/src/third_party/issue-descriptions/mixedContent.md +5 -0
- package/build/src/third_party/issue-descriptions/navigatingPartitionedBlobURL.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementActivationDisabled.md +7 -0
- package/build/src/third_party/issue-descriptions/permissionElementActivationDisabledWithOccluder.md +9 -0
- package/build/src/third_party/issue-descriptions/permissionElementActivationDisabledWithOccluderParent.md +9 -0
- package/build/src/third_party/issue-descriptions/permissionElementCspFrameAncestorsMissing.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementFencedFrameDisallowed.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementFontSizeTooLarge.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementFontSizeTooSmall.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementGeolocationDeprecated.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementInsetBoxShadowUnsupported.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementInvalidDisplayStyle.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementInvalidSizeValue.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementInvalidType.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementInvalidTypeActivation.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementLowContrast.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementNonOpaqueColor.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementPaddingBottomUnsupported.md +6 -0
- package/build/src/third_party/issue-descriptions/permissionElementPaddingRightUnsupported.md +6 -0
- package/build/src/third_party/issue-descriptions/permissionElementPermissionsPolicyBlocked.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementRegistrationFailed.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementRequestInProgress.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementSecurityChecksFailed.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementTypeNotSupported.md +5 -0
- package/build/src/third_party/issue-descriptions/permissionElementUntrustedEvent.md +7 -0
- package/build/src/third_party/issue-descriptions/placeholderDescriptionForInvisibleIssues.md +3 -0
- package/build/src/third_party/issue-descriptions/propertyRuleInvalidNameIssue.md +3 -0
- package/build/src/third_party/issue-descriptions/propertyRuleIssue.md +7 -0
- package/build/src/third_party/issue-descriptions/selectElementAccessibilityDisallowedOptGroupChild.md +7 -0
- package/build/src/third_party/issue-descriptions/selectElementAccessibilityDisallowedSelectChild.md +7 -0
- package/build/src/third_party/issue-descriptions/selectElementAccessibilityInteractiveContentAttributesSelectDescendant.md +3 -0
- package/build/src/third_party/issue-descriptions/selectElementAccessibilityInteractiveContentLegendChild.md +3 -0
- package/build/src/third_party/issue-descriptions/selectElementAccessibilityInteractiveContentOptionChild.md +3 -0
- package/build/src/third_party/issue-descriptions/selectElementAccessibilityNonPhrasingContentOptionChild.md +3 -0
- package/build/src/third_party/issue-descriptions/selectivePermissionsIntervention.md +7 -0
- package/build/src/third_party/issue-descriptions/sharedArrayBuffer.md +7 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryUseErrorCrossOriginNoCorsRequest.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryUseErrorDictionaryLoadFailure.md +3 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryUseErrorMatchingDictionaryNotUsed.md +3 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryUseErrorUnexpectedContentDictionaryHeader.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorCossOriginNoCorsRequest.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorDisallowedBySettings.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorExpiredResponse.md +3 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorFeatureDisabled.md +3 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorInsufficientResources.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorInvalidMatchField.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorInvalidStructuredHeader.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorInvalidTTLField.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNavigationRequest.md +3 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNoMatchField.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonIntegerTTLField.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonListMatchDestField.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonSecureContext.md +3 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonStringIdField.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonStringInMatchDestList.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonStringMatchField.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorNonTokenTypeField.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorRequestAborted.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorShuttingDown.md +1 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorTooLongIdField.md +3 -0
- package/build/src/third_party/issue-descriptions/sharedDictionaryWriteErrorUnsupportedType.md +3 -0
- package/build/src/third_party/issue-descriptions/sriInvalidSignatureHeader.md +14 -0
- package/build/src/third_party/issue-descriptions/sriInvalidSignatureInputHeader.md +15 -0
- package/build/src/third_party/issue-descriptions/sriMissingSignatureHeader.md +8 -0
- package/build/src/third_party/issue-descriptions/sriMissingSignatureInputHeader.md +7 -0
- package/build/src/third_party/issue-descriptions/sriSignatureHeaderValueIsIncorrectLength.md +11 -0
- package/build/src/third_party/issue-descriptions/sriSignatureHeaderValueIsNotByteSequence.md +14 -0
- package/build/src/third_party/issue-descriptions/sriSignatureHeaderValueIsParameterized.md +15 -0
- package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidComponentName.md +8 -0
- package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidComponentType.md +13 -0
- package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidDerivedComponentParameter.md +4 -0
- package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidHeaderComponentParameter.md +5 -0
- package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderInvalidParameter.md +11 -0
- package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderKeyIdLength.md +12 -0
- package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderMissingLabel.md +6 -0
- package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderMissingRequiredParameters.md +8 -0
- package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderValueMissingComponents.md +11 -0
- package/build/src/third_party/issue-descriptions/sriSignatureInputHeaderValueNotInnerList.md +11 -0
- package/build/src/third_party/issue-descriptions/sriValidationFailedIntegrityMismatch.md +10 -0
- package/build/src/third_party/issue-descriptions/sriValidationFailedInvalidLength.md +5 -0
- package/build/src/third_party/issue-descriptions/sriValidationFailedSignatureExpired.md +6 -0
- package/build/src/third_party/issue-descriptions/sriValidationFailedSignatureMismatch.md +11 -0
- package/build/src/third_party/issue-descriptions/stylesheetLateImport.md +4 -0
- package/build/src/third_party/issue-descriptions/stylesheetRequestFailed.md +3 -0
- package/build/src/third_party/issue-descriptions/summaryElementAccessibilityInteractiveContentSummaryDescendant.md +3 -0
- package/build/src/third_party/issue-descriptions/unencodedDigestIncorrectDigestLength.md +12 -0
- package/build/src/third_party/issue-descriptions/unencodedDigestIncorrectDigestType.md +17 -0
- package/build/src/third_party/issue-descriptions/unencodedDigestMalformedDictionary.md +14 -0
- package/build/src/third_party/issue-descriptions/unencodedDigestUnknownAlgorithm.md +15 -0
- package/build/src/third_party/lighthouse-devtools-mcp-bundle.js +59418 -0
- package/build/src/tools/ToolDefinition.js +72 -0
- package/build/src/tools/categories.js +26 -0
- package/build/src/tools/console.js +85 -0
- package/build/src/tools/emulation.js +55 -0
- package/build/src/tools/extensions.js +96 -0
- package/build/src/tools/inPage.js +105 -0
- package/build/src/tools/input.js +376 -0
- package/build/src/tools/lighthouse.js +123 -0
- package/build/src/tools/memory.js +28 -0
- package/build/src/tools/network.js +120 -0
- package/build/src/tools/pages.js +336 -0
- package/build/src/tools/performance.js +190 -0
- package/build/src/tools/screencast.js +79 -0
- package/build/src/tools/screenshot.js +84 -0
- package/build/src/tools/script.js +125 -0
- package/build/src/tools/slim/tools.js +81 -0
- package/build/src/tools/snapshot.js +56 -0
- package/build/src/tools/tools.js +53 -0
- package/build/src/trace-processing/parse.js +84 -0
- package/build/src/types.js +6 -0
- package/build/src/utils/ExtensionRegistry.js +35 -0
- package/build/src/utils/check-for-updates.js +72 -0
- package/build/src/utils/files.js +19 -0
- package/build/src/utils/keyboard.js +296 -0
- package/build/src/utils/pagination.js +49 -0
- package/build/src/utils/string.js +36 -0
- package/build/src/utils/types.js +6 -0
- package/build/src/version.js +6 -0
- package/package.json +87 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import crypto from 'node:crypto';
|
|
7
|
+
import { logger } from '../../logger.js';
|
|
8
|
+
const MAX_BUFFER_SIZE = 1000;
|
|
9
|
+
const DEFAULT_CLEARCUT_ENDPOINT = 'https://play.googleapis.com/log?format=json_proto';
|
|
10
|
+
const DEFAULT_FLUSH_INTERVAL_MS = 15 * 60 * 1000;
|
|
11
|
+
const LOG_SOURCE = 2839;
|
|
12
|
+
const CLIENT_TYPE = 47;
|
|
13
|
+
const MIN_RATE_LIMIT_WAIT_MS = 30_000;
|
|
14
|
+
const REQUEST_TIMEOUT_MS = 30_000;
|
|
15
|
+
const SHUTDOWN_TIMEOUT_MS = 5_000;
|
|
16
|
+
const SESSION_ROTATION_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
17
|
+
export class ClearcutSender {
|
|
18
|
+
#appVersion;
|
|
19
|
+
#osType;
|
|
20
|
+
#clearcutEndpoint;
|
|
21
|
+
#flushIntervalMs;
|
|
22
|
+
#includePidHeader;
|
|
23
|
+
#sessionId;
|
|
24
|
+
#sessionCreated;
|
|
25
|
+
#buffer = [];
|
|
26
|
+
#flushTimer = null;
|
|
27
|
+
#isFlushing = false;
|
|
28
|
+
#timerStarted = false;
|
|
29
|
+
constructor(config) {
|
|
30
|
+
this.#appVersion = config.appVersion;
|
|
31
|
+
this.#osType = config.osType;
|
|
32
|
+
this.#clearcutEndpoint =
|
|
33
|
+
config.clearcutEndpoint ?? DEFAULT_CLEARCUT_ENDPOINT;
|
|
34
|
+
this.#flushIntervalMs =
|
|
35
|
+
config.forceFlushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS;
|
|
36
|
+
this.#includePidHeader = config.includePidHeader ?? false;
|
|
37
|
+
this.#sessionId = crypto.randomUUID();
|
|
38
|
+
this.#sessionCreated = Date.now();
|
|
39
|
+
}
|
|
40
|
+
enqueueEvent(event) {
|
|
41
|
+
if (Date.now() - this.#sessionCreated > SESSION_ROTATION_INTERVAL_MS) {
|
|
42
|
+
this.#sessionId = crypto.randomUUID();
|
|
43
|
+
this.#sessionCreated = Date.now();
|
|
44
|
+
}
|
|
45
|
+
logger('Enqueing telemetry event', JSON.stringify(event, null, 2));
|
|
46
|
+
this.#addToBuffer({
|
|
47
|
+
...event,
|
|
48
|
+
session_id: this.#sessionId,
|
|
49
|
+
app_version: this.#appVersion,
|
|
50
|
+
os_type: this.#osType,
|
|
51
|
+
});
|
|
52
|
+
if (!this.#timerStarted) {
|
|
53
|
+
this.#timerStarted = true;
|
|
54
|
+
this.#scheduleFlush(this.#flushIntervalMs);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async sendShutdownEvent() {
|
|
58
|
+
if (this.#flushTimer) {
|
|
59
|
+
clearTimeout(this.#flushTimer);
|
|
60
|
+
this.#flushTimer = null;
|
|
61
|
+
}
|
|
62
|
+
const shutdownEvent = {
|
|
63
|
+
server_shutdown: {},
|
|
64
|
+
};
|
|
65
|
+
this.enqueueEvent(shutdownEvent);
|
|
66
|
+
try {
|
|
67
|
+
await Promise.race([
|
|
68
|
+
this.#finalFlush(),
|
|
69
|
+
new Promise(resolve => setTimeout(resolve, SHUTDOWN_TIMEOUT_MS)),
|
|
70
|
+
]);
|
|
71
|
+
logger('Final flush completed');
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
logger('Final flush failed:', error);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async #flush() {
|
|
78
|
+
if (this.#isFlushing) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (this.#buffer.length === 0) {
|
|
82
|
+
this.#scheduleFlush(this.#flushIntervalMs);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.#isFlushing = true;
|
|
86
|
+
let nextDelayMs = this.#flushIntervalMs;
|
|
87
|
+
// Optimistically remove events from buffer before sending.
|
|
88
|
+
// This prevents race conditions where a simultaneous #finalFlush would include these same events.
|
|
89
|
+
const eventsToSend = [...this.#buffer];
|
|
90
|
+
this.#buffer = [];
|
|
91
|
+
try {
|
|
92
|
+
const result = await this.#sendBatch(eventsToSend);
|
|
93
|
+
if (result.success) {
|
|
94
|
+
if (result.nextRequestWaitMs !== undefined) {
|
|
95
|
+
nextDelayMs = Math.max(result.nextRequestWaitMs, MIN_RATE_LIMIT_WAIT_MS);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else if (result.isPermanentError) {
|
|
99
|
+
logger('Permanent error, dropped batch of', eventsToSend.length, 'events');
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// Transient error: Requeue events at the front of the buffer
|
|
103
|
+
// to maintain order and retry them later.
|
|
104
|
+
this.#buffer = [...eventsToSend, ...this.#buffer];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
// Safety catch for unexpected errors, requeue events
|
|
109
|
+
this.#buffer = [...eventsToSend, ...this.#buffer];
|
|
110
|
+
logger('Flush failed unexpectedly:', error);
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
this.#isFlushing = false;
|
|
114
|
+
this.#scheduleFlush(nextDelayMs);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
#addToBuffer(event) {
|
|
118
|
+
if (this.#buffer.length >= MAX_BUFFER_SIZE) {
|
|
119
|
+
this.#buffer.shift();
|
|
120
|
+
logger('Telemetry buffer overflow: dropped oldest event');
|
|
121
|
+
}
|
|
122
|
+
this.#buffer.push({
|
|
123
|
+
event,
|
|
124
|
+
timestamp: Date.now(),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
#scheduleFlush(delayMs) {
|
|
128
|
+
logger(`Scheduling flush in ${delayMs}`);
|
|
129
|
+
if (this.#flushTimer) {
|
|
130
|
+
clearTimeout(this.#flushTimer);
|
|
131
|
+
}
|
|
132
|
+
this.#flushTimer = setTimeout(() => {
|
|
133
|
+
this.#flush().catch(err => {
|
|
134
|
+
logger('Flush error:', err);
|
|
135
|
+
});
|
|
136
|
+
}, delayMs);
|
|
137
|
+
}
|
|
138
|
+
async #sendBatch(events) {
|
|
139
|
+
logger(`Sending batch of ${events.length}`);
|
|
140
|
+
const requestBody = {
|
|
141
|
+
log_source: LOG_SOURCE,
|
|
142
|
+
request_time_ms: Date.now().toString(),
|
|
143
|
+
client_info: {
|
|
144
|
+
client_type: CLIENT_TYPE,
|
|
145
|
+
},
|
|
146
|
+
log_event: events.map(({ event, timestamp }) => ({
|
|
147
|
+
event_time_ms: timestamp.toString(),
|
|
148
|
+
source_extension_json: JSON.stringify(event),
|
|
149
|
+
})),
|
|
150
|
+
};
|
|
151
|
+
const controller = new AbortController();
|
|
152
|
+
const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
|
|
153
|
+
try {
|
|
154
|
+
const response = await fetch(this.#clearcutEndpoint, {
|
|
155
|
+
method: 'POST',
|
|
156
|
+
headers: {
|
|
157
|
+
'Content-Type': 'application/json',
|
|
158
|
+
// Used in E2E tests to confirm that the watchdog process is killed
|
|
159
|
+
...(this.#includePidHeader
|
|
160
|
+
? { 'X-Watchdog-Pid': process.pid.toString() }
|
|
161
|
+
: {}),
|
|
162
|
+
},
|
|
163
|
+
body: JSON.stringify(requestBody),
|
|
164
|
+
signal: controller.signal,
|
|
165
|
+
});
|
|
166
|
+
clearTimeout(timeoutId);
|
|
167
|
+
if (response.ok) {
|
|
168
|
+
const data = (await response.json());
|
|
169
|
+
return {
|
|
170
|
+
success: true,
|
|
171
|
+
nextRequestWaitMs: data.next_request_wait_millis,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
const status = response.status;
|
|
175
|
+
if (status >= 500 || status === 429) {
|
|
176
|
+
return { success: false };
|
|
177
|
+
}
|
|
178
|
+
logger('Telemetry permanent error:', status);
|
|
179
|
+
return { success: false, isPermanentError: true };
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
clearTimeout(timeoutId);
|
|
183
|
+
return { success: false };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async #finalFlush() {
|
|
187
|
+
if (this.#buffer.length === 0) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const eventsToSend = [...this.#buffer];
|
|
191
|
+
await this.#sendBatch(eventsToSend);
|
|
192
|
+
}
|
|
193
|
+
stopForTesting() {
|
|
194
|
+
if (this.#flushTimer) {
|
|
195
|
+
clearTimeout(this.#flushTimer);
|
|
196
|
+
this.#flushTimer = null;
|
|
197
|
+
}
|
|
198
|
+
this.#timerStarted = false;
|
|
199
|
+
}
|
|
200
|
+
get bufferSizeForTesting() {
|
|
201
|
+
return this.#buffer.length;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import process from 'node:process';
|
|
7
|
+
import readline from 'node:readline';
|
|
8
|
+
import { parseArgs } from 'node:util';
|
|
9
|
+
import { logger, flushLogs, saveLogsToFile } from '../../logger.js';
|
|
10
|
+
import { WatchdogMessageType } from '../types.js';
|
|
11
|
+
import { ClearcutSender } from './ClearcutSender.js';
|
|
12
|
+
function parseWatchdogArgs() {
|
|
13
|
+
const { values } = parseArgs({
|
|
14
|
+
options: {
|
|
15
|
+
'parent-pid': { type: 'string' },
|
|
16
|
+
'app-version': { type: 'string' },
|
|
17
|
+
'os-type': { type: 'string' },
|
|
18
|
+
'log-file': { type: 'string' },
|
|
19
|
+
'clearcut-endpoint': { type: 'string' },
|
|
20
|
+
'clearcut-force-flush-interval-ms': { type: 'string' },
|
|
21
|
+
'clearcut-include-pid-header': { type: 'boolean' },
|
|
22
|
+
},
|
|
23
|
+
strict: true,
|
|
24
|
+
});
|
|
25
|
+
// Verify required arguments
|
|
26
|
+
const parentPid = parseInt(values['parent-pid'] ?? '', 10);
|
|
27
|
+
const appVersion = values['app-version'];
|
|
28
|
+
const osType = parseInt(values['os-type'] ?? '', 10);
|
|
29
|
+
if (isNaN(parentPid) || !appVersion || isNaN(osType)) {
|
|
30
|
+
console.error('Invalid arguments provided for watchdog process: ', JSON.stringify({ parentPid, appVersion, osType }));
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
// Parse Optional Arguments
|
|
34
|
+
const logFile = values['log-file'];
|
|
35
|
+
const clearcutEndpoint = values['clearcut-endpoint'];
|
|
36
|
+
const clearcutIncludePidHeader = values['clearcut-include-pid-header'];
|
|
37
|
+
let clearcutForceFlushIntervalMs;
|
|
38
|
+
if (values['clearcut-force-flush-interval-ms']) {
|
|
39
|
+
const parsed = parseInt(values['clearcut-force-flush-interval-ms'], 10);
|
|
40
|
+
if (!isNaN(parsed)) {
|
|
41
|
+
clearcutForceFlushIntervalMs = parsed;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
parentPid,
|
|
46
|
+
appVersion,
|
|
47
|
+
osType,
|
|
48
|
+
logFile,
|
|
49
|
+
clearcutEndpoint,
|
|
50
|
+
clearcutForceFlushIntervalMs,
|
|
51
|
+
clearcutIncludePidHeader,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function main() {
|
|
55
|
+
const { parentPid, appVersion, osType, logFile, clearcutEndpoint, clearcutForceFlushIntervalMs, clearcutIncludePidHeader, } = parseWatchdogArgs();
|
|
56
|
+
let logStream;
|
|
57
|
+
if (logFile) {
|
|
58
|
+
logStream = saveLogsToFile(logFile);
|
|
59
|
+
}
|
|
60
|
+
const exit = (code) => {
|
|
61
|
+
if (!logStream) {
|
|
62
|
+
process.exit(code);
|
|
63
|
+
}
|
|
64
|
+
void flushLogs(logStream).finally(() => {
|
|
65
|
+
process.exit(code);
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
logger('Watchdog started', JSON.stringify({
|
|
69
|
+
pid: process.pid,
|
|
70
|
+
parentPid,
|
|
71
|
+
version: appVersion,
|
|
72
|
+
osType,
|
|
73
|
+
}, null, 2));
|
|
74
|
+
const sender = new ClearcutSender({
|
|
75
|
+
appVersion,
|
|
76
|
+
osType: osType,
|
|
77
|
+
clearcutEndpoint,
|
|
78
|
+
forceFlushIntervalMs: clearcutForceFlushIntervalMs,
|
|
79
|
+
includePidHeader: clearcutIncludePidHeader,
|
|
80
|
+
});
|
|
81
|
+
let isShuttingDown = false;
|
|
82
|
+
function onParentDeath(reason) {
|
|
83
|
+
if (isShuttingDown) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
isShuttingDown = true;
|
|
87
|
+
logger(`Parent death detected (${reason}). Sending shutdown event...`);
|
|
88
|
+
sender
|
|
89
|
+
.sendShutdownEvent()
|
|
90
|
+
.then(() => {
|
|
91
|
+
logger('Shutdown event sent. Exiting.');
|
|
92
|
+
exit(0);
|
|
93
|
+
})
|
|
94
|
+
.catch(err => {
|
|
95
|
+
logger('Failed to send shutdown event', err);
|
|
96
|
+
exit(1);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
process.stdin.on('end', () => onParentDeath('stdin end'));
|
|
100
|
+
process.stdin.on('close', () => onParentDeath('stdin close'));
|
|
101
|
+
process.on('disconnect', () => onParentDeath('ipc disconnect'));
|
|
102
|
+
const rl = readline.createInterface({
|
|
103
|
+
input: process.stdin,
|
|
104
|
+
terminal: false,
|
|
105
|
+
});
|
|
106
|
+
rl.on('line', line => {
|
|
107
|
+
try {
|
|
108
|
+
if (!line.trim()) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const msg = JSON.parse(line);
|
|
112
|
+
if (msg.type === WatchdogMessageType.LOG_EVENT && msg.payload) {
|
|
113
|
+
sender.enqueueEvent(msg.payload);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
logger('Failed to parse IPC message', err);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
main();
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
console.error('Watchdog fatal error:', err);
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
// eslint-disable-next-line no-restricted-imports
|
|
7
|
+
import '../../node_modules/chrome-devtools-frontend/front_end/entrypoints/formatter_worker/formatter_worker-entrypoint.js';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import 'core-js/modules/es.promise.with-resolvers.js';
|
|
7
|
+
import 'core-js/modules/es.set.union.v2.js';
|
|
8
|
+
import 'core-js/proposals/iterator-helpers.js';
|
|
9
|
+
export { default as yargs } from 'yargs';
|
|
10
|
+
export { hideBin } from 'yargs/helpers';
|
|
11
|
+
export { default as debug } from 'debug';
|
|
12
|
+
export { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
13
|
+
export { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
14
|
+
export { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
15
|
+
export { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
16
|
+
export { SetLevelRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
17
|
+
export { z as zod } from 'zod';
|
|
18
|
+
export { default as ajv } from 'ajv';
|
|
19
|
+
export { Locator, PredefinedNetworkConditions, KnownDevices, CDPSessionEvent, } from 'puppeteer-core';
|
|
20
|
+
export { default as puppeteer } from 'puppeteer-core';
|
|
21
|
+
export { PipeTransport } from 'puppeteer-core/internal/node/PipeTransport.js';
|
|
22
|
+
export { resolveDefaultUserDataDir, detectBrowserPlatform, Browser as BrowserEnum, } from '@puppeteer/browsers';
|
|
23
|
+
import { snapshot as snapshotImpl, navigation as navigationImpl, generateReport as generateReportImpl, } from './lighthouse-devtools-mcp-bundle.js';
|
|
24
|
+
export const snapshot = snapshotImpl;
|
|
25
|
+
export const navigation = navigationImpl;
|
|
26
|
+
export const generateReport = generateReportImpl;
|
|
27
|
+
import * as DevTools_1 from '../../node_modules/chrome-devtools-frontend/mcp/mcp.js';
|
|
28
|
+
export { DevTools_1 as DevTools };
|
package/build/src/third_party/issue-descriptions/CoepCoopSandboxedIframeCannotNavigateToCoopPage.md
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# An iframe navigation to a document with a Cross-Origin Opener Policy was blocked
|
|
2
|
+
|
|
3
|
+
A document with a Cross-Origin Opener Policy (COOP) was blocked from loading in an iframe, because the iframe specifies a sandbox attribute.
|
|
4
|
+
This protects COOP-enabled documents from inheriting properties from its opener.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Specify a more permissive Cross-Origin Resource Policy to prevent a resource from being blocked
|
|
2
|
+
|
|
3
|
+
Your site tries to access an external resource that only allows same-origin usage.
|
|
4
|
+
This behavior prevents a document from loading any non-same-origin resources which don’t explicitly grant permission to be loaded.
|
|
5
|
+
|
|
6
|
+
To solve this, add the following to the resource’s HTML response header:
|
|
7
|
+
* `Cross-Origin-Resource-Policy: same-site` if the resource and your site are served from the same site.
|
|
8
|
+
* `Cross-Origin-Resource-Policy: cross-origin` if the resource is served from another location than your website. ⚠️If you set this header, any website can embed this resource.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Specify a Cross-Origin Resource Policy to prevent a resource from being blocked
|
|
2
|
+
|
|
3
|
+
Because your site has the Cross-Origin Embedder Policy (COEP) enabled, each
|
|
4
|
+
resource must specify a suitable Cross-Origin Resource Policy (CORP). This
|
|
5
|
+
behavior prevents a document from loading cross-origin resources which don’t
|
|
6
|
+
explicitly grant permission to be loaded.
|
|
7
|
+
|
|
8
|
+
To solve this, add the following to the resource’ response header:
|
|
9
|
+
* `Cross-Origin-Resource-Policy: same-site` if the resource and your site are
|
|
10
|
+
served from the same site.
|
|
11
|
+
* `Cross-Origin-Resource-Policy: cross-origin` if the resource is served from
|
|
12
|
+
another location than your website. ⚠️If you set this header, any website can
|
|
13
|
+
embed this resource.
|
|
14
|
+
|
|
15
|
+
Alternatively, the document can use the variant: `Cross-Origin-Embedder-Policy:
|
|
16
|
+
credentialless` instead of `require-corp`. It allows loading the resource,
|
|
17
|
+
despite the missing CORP header, at the cost of requesting it without
|
|
18
|
+
credentials like Cookies.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Specify a more permissive Cross-Origin Resource Policy to prevent a resource from being blocked
|
|
2
|
+
|
|
3
|
+
Your site tries to access an external resource that only allows same-site usage.
|
|
4
|
+
This behavior prevents a document from loading any non-same-site resources which don’t explicitly grant permission to be loaded.
|
|
5
|
+
|
|
6
|
+
To solve this, add the following to the resource’s HTML response header: `Cross-Origin-Resource-Policy: cross-origin`
|
|
7
|
+
⚠️If you set this header, any website can embed this resource.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Specify a Cross-Origin Embedder Policy to prevent this frame from being blocked
|
|
2
|
+
|
|
3
|
+
Because your site has the Cross-Origin Embedder Policy (COEP) enabled, each
|
|
4
|
+
embedded iframe must also specify this policy. This behavior protects private
|
|
5
|
+
data from being exposed to untrusted third party sites.
|
|
6
|
+
|
|
7
|
+
To solve this, add one of following to the embedded frame’s HTML response
|
|
8
|
+
header:
|
|
9
|
+
* `Cross-Origin-Embedder-Policy: require-corp`
|
|
10
|
+
* `Cross-Origin-Embedder-Policy: credentialless` (Chrome > 96)
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Page layout may be unexpected due to Quirks Mode
|
|
2
|
+
|
|
3
|
+
One or more documents in this page is in Quirks Mode, which will render the affected document(s) with quirks incompatible with the current HTML and CSS specifications.
|
|
4
|
+
|
|
5
|
+
Quirks Mode exists mostly due to historical reasons. If this is not intentional, you can [add or modify the DOCTYPE to be `<!DOCTYPE html>`](issueQuirksModeDoctype) to render the page in No Quirks Mode.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Ensure cookie attribute values don’t exceed 1024 characters
|
|
2
|
+
|
|
3
|
+
Cookie attribute values exceeding 1024 characters in size will result in the attribute being ignored. This could lead to unexpected behavior since the cookie will be processed as if the offending attribute / attribute value pair were not present.
|
|
4
|
+
|
|
5
|
+
Resolve this issue by ensuring that cookie attribute values don’t exceed 1024 characters.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Users may have difficulties reading text content due to insufficient color contrast
|
|
2
|
+
|
|
3
|
+
Low-contrast text is difficult or impossible for users to read. A [minimum contrast ratio (AA) of 4.5](issuesContrastWCAG21AA) is recommended for all text. Since font size and weight affect color perception, an exception is made for very large or bold text — in this case, a contrast ratio of 3.0 is allowed. The [enhanced conformance level (AAA)](issuesContrastWCAG21AAA) requires the contrast ratio to be above 7.0 for regular text and 4.5 for large text.
|
|
4
|
+
|
|
5
|
+
Update colors or change the font size or weight to achieve sufficient contrast. You can use the [“Suggest color” feature](issuesContrastSuggestColor) in the DevTools color picker to automatically select a better text color.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Migrate entirely to HTTPS to have cookies sent to same-site subresources
|
|
2
|
+
|
|
3
|
+
A cookie was not sent to {PLACEHOLDER_destination} origin from {PLACEHOLDER_origin} context.
|
|
4
|
+
Because this cookie would have been sent across schemes on the same site, it was not sent.
|
|
5
|
+
This behavior enhances the `SameSite` attribute’s protection of user data from request forgery by network attackers.
|
|
6
|
+
|
|
7
|
+
Resolve this issue by migrating your site (as defined by the eTLD+1) entirely to HTTPS.
|
|
8
|
+
It is also recommended to mark the cookie with the `Secure` attribute if that is not already the case.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Migrate entirely to HTTPS to allow cookies to be set by same-site subresources
|
|
2
|
+
|
|
3
|
+
A cookie was not set by {PLACEHOLDER_origin} origin in {PLACEHOLDER_destination} context.
|
|
4
|
+
Because this cookie would have been set across schemes on the same site, it was blocked.
|
|
5
|
+
This behavior enhances the `SameSite` attribute’s protection of user data from request forgery by network attackers.
|
|
6
|
+
|
|
7
|
+
Resolve this issue by migrating your site (as defined by the eTLD+1) entirely to HTTPS.
|
|
8
|
+
It is also recommended to mark the cookie with the `Secure` attribute if that is not already the case.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Migrate entirely to HTTPS to have cookies sent on same-site requests
|
|
2
|
+
|
|
3
|
+
A cookie was not sent to {PLACEHOLDER_destination} origin from {PLACEHOLDER_origin} context on a navigation.
|
|
4
|
+
Because this cookie would have been sent across schemes on the same site, it was not sent.
|
|
5
|
+
This behavior enhances the `SameSite` attribute’s protection of user data from request forgery by network attackers.
|
|
6
|
+
|
|
7
|
+
Resolve this issue by migrating your site (as defined by the eTLD+1) entirely to HTTPS.
|
|
8
|
+
It is also recommended to mark the cookie with the `Secure` attribute if that is not already the case.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Mark cross-site cookies as Secure to allow them to be sent in cross-site requests
|
|
2
|
+
|
|
3
|
+
Cookies marked with `SameSite=None` must also be marked with `Secure` to get sent in cross-site requests.
|
|
4
|
+
This behavior protects user data from being sent over an insecure connection.
|
|
5
|
+
|
|
6
|
+
Resolve this issue by updating the attributes of the cookie:
|
|
7
|
+
* Specify `SameSite=None` and `Secure` if the cookie should be sent in cross-site requests. This enables third-party use.
|
|
8
|
+
* Specify `SameSite=Strict` or `SameSite=Lax` if the cookie should not be sent in cross-site requests.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Mark cross-site cookies as Secure to allow setting them in cross-site contexts
|
|
2
|
+
|
|
3
|
+
Cookies marked with `SameSite=None` must also be marked with `Secure` to allow setting them in a cross-site context.
|
|
4
|
+
This behavior protects user data from being sent over an insecure connection.
|
|
5
|
+
|
|
6
|
+
Resolve this issue by updating the attributes of the cookie:
|
|
7
|
+
* Specify `SameSite=None` and `Secure` if the cookie is intended to be set in cross-site contexts. Note that only cookies sent over HTTPS may use the `Secure` attribute.
|
|
8
|
+
* Specify `SameSite=Strict` or `SameSite=Lax` if the cookie should not be set by cross-site requests.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Mark cross-site cookies as Secure to allow them to be sent in cross-site requests
|
|
2
|
+
|
|
3
|
+
In a future version of the browser, cookies marked with `SameSite=None` must also be marked with `Secure` to get sent in cross-site requests.
|
|
4
|
+
This behavior protects user data from being sent over an insecure connection.
|
|
5
|
+
|
|
6
|
+
Resolve this issue by updating the attributes of the cookie:
|
|
7
|
+
* Specify `SameSite=None` and `Secure` if the cookie should be sent in cross-site requests. This enables third-party use.
|
|
8
|
+
* Specify `SameSite=Strict` or `SameSite=Lax` if the cookie should not be sent in cross-site requests.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Mark cross-site cookies as Secure to allow setting them in cross-site contexts
|
|
2
|
+
|
|
3
|
+
In a future version of the browser, cookies marked with `SameSite=None` must also be marked with `Secure` to allow setting them in a cross-site context.
|
|
4
|
+
This behavior protects user data from being sent over an insecure connection.
|
|
5
|
+
|
|
6
|
+
Resolve this issue by updating the attributes of the cookie:
|
|
7
|
+
* Specify `SameSite=None` and `Secure` if the cookie is intended to be set in cross-site contexts. Note that only cookies sent over HTTPS may use the `Secure` attribute.
|
|
8
|
+
* Specify `SameSite=Strict` or `SameSite=Lax` if the cookie should not be set by cross-site requests.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Indicate whether to send a cookie in a cross-site request by specifying its SameSite attribute
|
|
2
|
+
|
|
3
|
+
Because a cookie’s `SameSite` attribute was not set or is invalid, it defaults to `SameSite=Lax`,
|
|
4
|
+
which will prevent the cookie from being sent in a cross-site request in a future version of the browser.
|
|
5
|
+
This behavior protects user data from accidentally leaking to third parties and cross-site request forgery.
|
|
6
|
+
|
|
7
|
+
Resolve this issue by updating the attributes of the cookie:
|
|
8
|
+
* Specify `SameSite=None` and `Secure` if the cookie should be sent in cross-site requests. This enables third-party use.
|
|
9
|
+
* Specify `SameSite=Strict` or `SameSite=Lax` if the cookie should not be sent in cross-site requests.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Indicate whether a cookie is intended to be set in cross-site context by specifying its SameSite attribute
|
|
2
|
+
|
|
3
|
+
Because a cookie’s `SameSite` attribute was not set or is invalid, it defaults to `SameSite=Lax`,
|
|
4
|
+
which will prevents the cookie from being set in a cross-site context in a future version of the browser.
|
|
5
|
+
This behavior protects user data from accidentally leaking to third parties and cross-site request forgery.
|
|
6
|
+
|
|
7
|
+
Resolve this issue by updating the attributes of the cookie:
|
|
8
|
+
* Specify `SameSite=None` and `Secure` if the cookie is intended to be set in cross-site contexts. Note that only cookies sent over HTTPS may use the `Secure` attribute.
|
|
9
|
+
* Specify `SameSite=Strict` or `SameSite=Lax` if the cookie should not be set by cross-site requests.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Migrate entirely to HTTPS to continue having cookies sent to same-site subresources
|
|
2
|
+
|
|
3
|
+
A cookie is being sent to {PLACEHOLDER_destination} origin from {PLACEHOLDER_origin} context.
|
|
4
|
+
Because this cookie is being sent across schemes on the same site, it will not be sent in a future version of Chrome.
|
|
5
|
+
This behavior enhances the `SameSite` attribute’s protection of user data from request forgery by network attackers.
|
|
6
|
+
|
|
7
|
+
Resolve this issue by migrating your site (as defined by the eTLD+1) entirely to HTTPS.
|
|
8
|
+
It is also recommended to mark the cookie with the `Secure` attribute if that is not already the case.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Migrate entirely to HTTPS to continue allowing cookies to be set by same-site subresources
|
|
2
|
+
|
|
3
|
+
A cookie is being set by {PLACEHOLDER_origin} origin in {PLACEHOLDER_destination} context.
|
|
4
|
+
Because this cookie is being set across schemes on the same site, it will be blocked in a future version of Chrome.
|
|
5
|
+
This behavior enhances the `SameSite` attribute’s protection of user data from request forgery by network attackers.
|
|
6
|
+
|
|
7
|
+
Resolve this issue by migrating your site (as defined by the eTLD+1) entirely to HTTPS.
|
|
8
|
+
It is also recommended to mark the cookie with the `Secure` attribute if that is not already the case.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Migrate entirely to HTTPS to continue having cookies sent on same-site requests
|
|
2
|
+
|
|
3
|
+
A cookie is being sent to {PLACEHOLDER_destination} origin from {PLACEHOLDER_origin} context on a navigation.
|
|
4
|
+
Because this cookie is being sent across schemes on the same site, it will not be sent in a future version of Chrome.
|
|
5
|
+
This behavior enhances the `SameSite` attribute’s protection of user data from request forgery by network attackers.
|
|
6
|
+
|
|
7
|
+
Resolve this issue by migrating your site (as defined by the eTLD+1) entirely to HTTPS.
|
|
8
|
+
It is also recommended to mark the cookie with the `Secure` attribute if that is not already the case.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Ensure that the attribution registration context is secure
|
|
2
|
+
|
|
3
|
+
This page tried to register a source or trigger using the Attribution Reporting
|
|
4
|
+
API but failed because the page that initiated the registration was not secure.
|
|
5
|
+
|
|
6
|
+
The registration context must use HTTPS unless it is `localhost` or
|
|
7
|
+
`127.0.0.1`.
|
package/build/src/third_party/issue-descriptions/arNavigationRegistrationUniqueScopeAlreadySet.md
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Ensure that multiple sources associated with the same navigation have the same attribution scopes
|
|
2
|
+
|
|
3
|
+
The page tried to register a source using Attribution Reporting API, but the
|
|
4
|
+
source was rejected because a previous source associated with the same
|
|
5
|
+
navigation and reporting origin used a different set of attribution scopes.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# Ensure that navigation-source registrations are initiated by a user gesture
|
|
2
|
+
|
|
3
|
+
This page tried to register a navigation source using the Attribution Reporting
|
|
4
|
+
API but failed because the navigation was not initiated by a user gesture.
|
|
5
|
+
Compared to event sources, navigation sources can release more cross-site
|
|
6
|
+
information, and are therefore subject to this additional privacy control.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# OS attribution source expected but corresponding header not found
|
|
2
|
+
|
|
3
|
+
The page indicated, via the `Attribution-Reporting-Info` header, that it
|
|
4
|
+
intended to register an OS source using the Attribution Reporting API, but the
|
|
5
|
+
corresponding `Attribution-Reporting-Register-OS-Source` header was missing.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# OS attribution trigger expected but corresponding header not found
|
|
2
|
+
|
|
3
|
+
The page indicated, via the `Attribution-Reporting-Info` header, that it
|
|
4
|
+
intended to register an OS trigger using the Attribution Reporting API, but the
|
|
5
|
+
corresponding `Attribution-Reporting-Register-OS-Trigger` header was missing.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Web attribution source expected but corresponding header not found
|
|
2
|
+
|
|
3
|
+
The page indicated, via the `Attribution-Reporting-Info` header, that it
|
|
4
|
+
intended to register a web source using the Attribution Reporting API, but the
|
|
5
|
+
corresponding `Attribution-Reporting-Register-Source` header was missing.
|