@mcp-b/chrome-devtools-mcp 1.7.0 → 1.7.2
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/README.md +120 -10
- package/build/src/McpContext.js +50 -3
- package/build/src/browser.js +157 -51
- package/build/src/cli.js +6 -1
- package/build/src/formatters/IssueFormatter.js +190 -0
- package/build/src/main.js +83 -2
- package/build/src/telemetry/clearcut-logger.js +102 -0
- package/build/src/telemetry/flag-utils.js +45 -0
- package/build/src/telemetry/metric-utils.js +14 -0
- package/build/src/telemetry/persistence.js +53 -0
- package/build/src/telemetry/types.js +33 -0
- package/build/src/telemetry/watchdog/clearcut-sender.js +201 -0
- package/build/src/telemetry/watchdog/main.js +127 -0
- package/build/src/telemetry/watchdog-client.js +60 -0
- package/build/src/third_party/devtools-formatter-worker.js +7 -0
- package/build/src/tools/browser.js +92 -0
- package/build/src/tools/extension.js +31 -0
- package/build/src/tools/extensions.js +79 -0
- package/build/src/tools/input.js +6 -1
- package/build/src/tools/pages.js +0 -1
- package/build/src/tools/tools.js +4 -0
- package/build/src/transports/WebMCPBridgeScript.js +11 -2
- package/build/src/utils/ExtensionRegistry.js +35 -0
- package/build/src/utils/string.js +36 -0
- package/build/vendor/chrome-devtools-frontend/front_end/core/common/Base64.js +20 -2
- package/build/vendor/chrome-devtools-frontend/front_end/core/common/Debouncer.js +8 -1
- package/build/vendor/chrome-devtools-frontend/front_end/core/common/Gzip.js +11 -0
- package/build/vendor/chrome-devtools-frontend/front_end/core/common/Object.js +6 -1
- package/build/vendor/chrome-devtools-frontend/front_end/core/common/ParsedURL.js +3 -0
- package/build/vendor/chrome-devtools-frontend/front_end/core/common/ResourceType.js +6 -0
- package/build/vendor/chrome-devtools-frontend/front_end/core/common/Revealer.js +0 -5
- package/build/vendor/chrome-devtools-frontend/front_end/core/common/Settings.js +18 -8
- package/build/vendor/chrome-devtools-frontend/front_end/core/host/AidaClient.js +24 -0
- package/build/vendor/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostStub.js +11 -3
- package/build/vendor/chrome-devtools-frontend/front_end/core/host/ResourceLoader.js +1 -1
- package/build/vendor/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +27 -20
- package/build/vendor/chrome-devtools-frontend/front_end/core/i18n/collect-ui-strings.js +7 -8
- package/build/vendor/chrome-devtools-frontend/front_end/core/i18n/generate-locales-js.js +4 -5
- package/build/vendor/chrome-devtools-frontend/front_end/core/platform/ArrayUtilities.js +10 -0
- package/build/vendor/chrome-devtools-frontend/front_end/core/platform/StringUtilities.js +63 -12
- package/build/vendor/chrome-devtools-frontend/front_end/core/protocol_client/CDPConnection.js +1 -0
- package/build/vendor/chrome-devtools-frontend/front_end/core/protocol_client/InspectorBackend.js +4 -1
- package/build/vendor/chrome-devtools-frontend/front_end/core/root/ExperimentNames.js +30 -0
- package/build/vendor/chrome-devtools-frontend/front_end/core/root/root.js +2 -1
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/AnimationModel.js +0 -4
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +69 -9
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSMetadata.js +6 -6
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSModel.js +28 -13
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSProperty.js +1 -1
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParserMatchers.js +6 -0
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/ConsoleModel.js +0 -2
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CookieModel.js +1 -1
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/DOMModel.js +170 -13
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/DebuggerModel.js +5 -39
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/HeapProfilerModel.js +8 -1
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +20 -5
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +12 -21
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/OverlayModel.js +19 -6
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/RehydratingConnection.js +5 -1
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/ResourceTreeModel.js +8 -5
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/SourceMap.js +15 -10
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/SourceMapManager.js +1 -1
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopesInfo.js +13 -27
- package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/Target.js +3 -1
- package/build/vendor/chrome-devtools-frontend/front_end/generated/ARIAProperties.js +1 -7
- package/build/vendor/chrome-devtools-frontend/front_end/generated/Deprecation.js +1 -16
- package/build/vendor/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +82 -22
- package/build/vendor/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +265 -123
- package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.js +2 -1
- package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.js +10 -16
- package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.js +97 -26
- package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AICallTree.js +35 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/annotations/AnnotationRepository.js +163 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/annotations/AnnotationType.js +10 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/annotations/annotations.js +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/bindings/CompilerScriptMapping.js +5 -3
- package/build/vendor/chrome-devtools-frontend/front_end/models/bindings/DebuggerLanguagePlugins.js +29 -58
- package/build/vendor/chrome-devtools-frontend/front_end/models/bindings/DebuggerWorkspaceBinding.js +7 -45
- package/build/vendor/chrome-devtools-frontend/front_end/models/emulation/DeviceModeModel.js +1 -1
- package/build/vendor/chrome-devtools-frontend/front_end/models/emulation/EmulatedDevices.js +14 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/formatter/FormatterWorkerPool.js +8 -5
- package/build/vendor/chrome-devtools-frontend/front_end/models/greendev/Prototypes.js +33 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/greendev/greendev.js +4 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/ContrastCheckTrigger.js +2 -2
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/CookieIssue.js +0 -21
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/CorsIssue.js +1 -38
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/IssueAggregator.js +8 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/IssuesManager.js +6 -12
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/PermissionElementIssue.js +243 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementActivationDisabled.md +7 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluder.md +9 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluderParent.md +9 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementCspFrameAncestorsMissing.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementFencedFrameDisallowed.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooLarge.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooSmall.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementGeolocationDeprecated.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInsetBoxShadowUnsupported.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidDisplayStyle.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidSizeValue.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidType.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidTypeActivation.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementLowContrast.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementNonOpaqueColor.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementPaddingBottomUnsupported.md +6 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementPaddingRightUnsupported.md +6 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementPermissionsPolicyBlocked.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementRegistrationFailed.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementRequestInProgress.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementSecurityChecksFailed.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementTypeNotSupported.md +5 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementUntrustedEvent.md +7 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/issues_manager.js +2 -1
- package/build/vendor/chrome-devtools-frontend/front_end/models/logs/NetworkLog.js +0 -8
- package/build/vendor/chrome-devtools-frontend/front_end/models/source_map_scopes/NamesResolver.js +4 -8
- package/build/vendor/chrome-devtools-frontend/front_end/models/stack_trace/StackTrace.js +30 -1
- package/build/vendor/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceImpl.js +70 -1
- package/build/vendor/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceModel.js +82 -30
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/EventsSerializer.js +10 -2
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/LanternComputationData.js +2 -2
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/ModelImpl.js +0 -3
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/Processor.js +18 -19
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/Styles.js +12 -4
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/extras/Initiators.js +46 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/extras/TraceTree.js +4 -3
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/extras/extras.js +1 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/LargestImagePaintHandler.js +2 -2
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/LayoutShiftsHandler.js +1 -1
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/MetaHandler.js +6 -0
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/NetworkRequestsHandler.js +10 -1
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/PageLoadMetricsHandler.js +44 -27
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/helpers/Timing.js +9 -2
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/Common.js +1 -6
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/LCPBreakdown.js +2 -2
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/LCPDiscovery.js +2 -4
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/NetworkDependencyTree.js +3 -2
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/RenderBlocking.js +1 -1
- package/build/vendor/chrome-devtools-frontend/front_end/models/trace/types/TraceEvents.js +33 -11
- package/build/vendor/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js +51 -18
- package/build/vendor/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js +1 -1
- package/build/vendor/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/scopes.js +4 -0
- package/build/vendor/chrome-devtools-frontend/mcp/HostBindings.js +4 -0
- package/build/vendor/chrome-devtools-frontend/mcp/mcp.js +4 -0
- package/package.json +17 -10
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/SameSiteInvalidSameParty.md +0 -8
- package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/SameSiteSamePartyCrossPartyContextSet.md +0 -10
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs/promises';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
export class ExtensionRegistry {
|
|
9
|
+
#extensions = new Map();
|
|
10
|
+
async registerExtension(id, extensionPath) {
|
|
11
|
+
const manifestPath = path.join(extensionPath, 'manifest.json');
|
|
12
|
+
const manifestContent = await fs.readFile(manifestPath, 'utf-8');
|
|
13
|
+
const manifest = JSON.parse(manifestContent);
|
|
14
|
+
const name = manifest.name ?? 'Unknown';
|
|
15
|
+
const version = manifest.version ?? 'Unknown';
|
|
16
|
+
const extension = {
|
|
17
|
+
id,
|
|
18
|
+
name,
|
|
19
|
+
version,
|
|
20
|
+
isEnabled: true,
|
|
21
|
+
path: extensionPath,
|
|
22
|
+
};
|
|
23
|
+
this.#extensions.set(extension.id, extension);
|
|
24
|
+
return extension;
|
|
25
|
+
}
|
|
26
|
+
remove(id) {
|
|
27
|
+
this.#extensions.delete(id);
|
|
28
|
+
}
|
|
29
|
+
list() {
|
|
30
|
+
return Array.from(this.#extensions.values());
|
|
31
|
+
}
|
|
32
|
+
getById(id) {
|
|
33
|
+
return this.#extensions.get(id);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Converts a given string to snake_case.
|
|
8
|
+
* This function handles camelCase, PascalCase, and acronyms, including transitions between letters and numbers.
|
|
9
|
+
* It uses Unicode-aware regular expressions (`\p{L}`, `\p{N}`, `\p{Lu}`, `\p{Ll}` with the `u` flag)
|
|
10
|
+
* to correctly process letters and numbers from various languages.
|
|
11
|
+
*
|
|
12
|
+
* @param text The input string to convert to snake_case.
|
|
13
|
+
* @returns The snake_case version of the input string.
|
|
14
|
+
*/
|
|
15
|
+
export function toSnakeCase(text) {
|
|
16
|
+
if (!text) {
|
|
17
|
+
return '';
|
|
18
|
+
}
|
|
19
|
+
// First, handle case-based transformations to insert underscores correctly.
|
|
20
|
+
// 1. Add underscore between a letter and a number.
|
|
21
|
+
// e.g., "version2" -> "version_2"
|
|
22
|
+
// 2. Add underscore between an uppercase letter sequence and a following uppercase+lowercase sequence.
|
|
23
|
+
// e.g., "APIFlags" -> "API_Flags"
|
|
24
|
+
// 3. Add underscore between a lowercase/number and an uppercase letter.
|
|
25
|
+
// e.g., "lastName" -> "last_Name", "version_2Update" -> "version_2_Update"
|
|
26
|
+
// 4. Replace sequences of non-alphanumeric with a single underscore
|
|
27
|
+
// 5. Remove any leading or trailing underscores.
|
|
28
|
+
const result = text
|
|
29
|
+
.replace(/(\p{L})(\p{N})/gu, '$1_$2') // 1
|
|
30
|
+
.replace(/(\p{Lu}+)(\p{Lu}\p{Ll})/gu, '$1_$2') // 2
|
|
31
|
+
.replace(/(\p{Ll}|\p{N})(\p{Lu})/gu, '$1_$2') // 3
|
|
32
|
+
.toLowerCase()
|
|
33
|
+
.replace(/[^\p{L}\p{N}]+/gu, '_') // 4
|
|
34
|
+
.replace(/^_|_$/g, ''); // 5
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
@@ -29,13 +29,31 @@ export function decode(input) {
|
|
|
29
29
|
}
|
|
30
30
|
return bytes;
|
|
31
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Note: if input can be very large (larger than the max string size), callers should
|
|
34
|
+
* expect this to throw an error.
|
|
35
|
+
*/
|
|
32
36
|
export function encode(input) {
|
|
33
37
|
return new Promise((resolve, reject) => {
|
|
34
38
|
const reader = new FileReader();
|
|
35
|
-
reader.onerror = () => reject(new Error('failed to convert to base64'));
|
|
39
|
+
reader.onerror = () => reject(new Error('failed to convert to base64: internal error'));
|
|
36
40
|
reader.onload = () => {
|
|
41
|
+
// The input was too large to encode as a string. The caller should anticipate
|
|
42
|
+
// this and use a workaround. See TimelinePanel.ts innerSaveToFile for an example.
|
|
43
|
+
// For more information, see crbug.com/436482118.
|
|
44
|
+
if (reader.result === '') {
|
|
45
|
+
reject(new Error('failed to convert to base64: input too large to encode as base64 string'));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// This string can be very large, so take care to not double memory. `split`
|
|
49
|
+
// was used here before, which always results in new strings in V8. By using
|
|
50
|
+
// slice instead, we leverage the sliced string optimization in V8 and avoid
|
|
51
|
+
// doubling the memory requirement (even if temporarily: that is a potential
|
|
52
|
+
// source of OOM crashes given large enough input, such as is common with
|
|
53
|
+
// Performance traces).
|
|
37
54
|
const blobAsUrl = reader.result;
|
|
38
|
-
const
|
|
55
|
+
const index = blobAsUrl.indexOf(',');
|
|
56
|
+
const base64 = blobAsUrl.slice(index + 1);
|
|
39
57
|
resolve(base64);
|
|
40
58
|
};
|
|
41
59
|
reader.readAsDataURL(new Blob([input]));
|
|
@@ -8,7 +8,14 @@ export const debounce = function (func, delay) {
|
|
|
8
8
|
let timer;
|
|
9
9
|
const debounced = (...args) => {
|
|
10
10
|
clearTimeout(timer);
|
|
11
|
-
timer = setTimeout(() => func(...args), delay);
|
|
11
|
+
timer = setTimeout(() => func(...args), testDebounceOverride ? 0 : delay);
|
|
12
12
|
};
|
|
13
13
|
return debounced;
|
|
14
14
|
};
|
|
15
|
+
let testDebounceOverride = false;
|
|
16
|
+
export function enableTestOverride() {
|
|
17
|
+
testDebounceOverride = true;
|
|
18
|
+
}
|
|
19
|
+
export function disableTestOverride() {
|
|
20
|
+
testDebounceOverride = false;
|
|
21
|
+
}
|
|
@@ -64,3 +64,14 @@ export function compressStream(stream) {
|
|
|
64
64
|
const cs = new CompressionStream('gzip');
|
|
65
65
|
return stream.pipeThrough(cs);
|
|
66
66
|
}
|
|
67
|
+
export function createMonitoredStream(stream, onProgress) {
|
|
68
|
+
let bytesRead = 0;
|
|
69
|
+
const progressTransformer = new TransformStream({
|
|
70
|
+
transform(chunk, controller) {
|
|
71
|
+
bytesRead += chunk.byteLength;
|
|
72
|
+
onProgress(bytesRead);
|
|
73
|
+
controller.enqueue(chunk);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
return stream.pipeThrough(progressTransformer);
|
|
77
|
+
}
|
|
@@ -57,7 +57,12 @@ export class ObjectWrapper {
|
|
|
57
57
|
// new listeners.
|
|
58
58
|
for (const listener of [...listeners]) {
|
|
59
59
|
if (!listener.disposed) {
|
|
60
|
-
|
|
60
|
+
try {
|
|
61
|
+
listener.listener.call(listener.thisObject, event);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
console.error(`Event listener for ${String(eventType)} throw an error:`, err);
|
|
65
|
+
}
|
|
61
66
|
}
|
|
62
67
|
}
|
|
63
68
|
}
|
|
@@ -263,6 +263,9 @@ export class ParsedURL {
|
|
|
263
263
|
return '';
|
|
264
264
|
}
|
|
265
265
|
static extractName(url) {
|
|
266
|
+
if (url.endsWith('/')) {
|
|
267
|
+
url = url.slice(0, -1);
|
|
268
|
+
}
|
|
266
269
|
let index = url.lastIndexOf('/');
|
|
267
270
|
const pathAndQuery = index !== -1 ? url.substr(index + 1) : url;
|
|
268
271
|
index = pathAndQuery.indexOf('?');
|
|
@@ -229,6 +229,12 @@ export class ResourceType {
|
|
|
229
229
|
const regex = new RegExp('^application(.*json$|\/json\+.*)');
|
|
230
230
|
return regex.test(contentType) ? 'application/json' : contentType;
|
|
231
231
|
}
|
|
232
|
+
/**
|
|
233
|
+
* Checks whether the given MIME type represents JavaScript content.
|
|
234
|
+
*/
|
|
235
|
+
static isJavaScriptMimeType(mimeType) {
|
|
236
|
+
return mimeType === 'application/javascript' || mimeType === 'text/javascript';
|
|
237
|
+
}
|
|
232
238
|
/**
|
|
233
239
|
* Adds suffixes iff the mimeType is 'text/javascript' to denote whether the JS is minified or from
|
|
234
240
|
* a source map.
|
|
@@ -31,10 +31,6 @@ const UIStrings = {
|
|
|
31
31
|
* @description The UI destination when right clicking an item that can be revealed
|
|
32
32
|
*/
|
|
33
33
|
applicationPanel: 'Application panel',
|
|
34
|
-
/**
|
|
35
|
-
* @description The UI destination when right clicking an item that can be revealed
|
|
36
|
-
*/
|
|
37
|
-
securityPanel: 'Security panel',
|
|
38
34
|
/**
|
|
39
35
|
* @description The UI destination when right clicking an item that can be revealed
|
|
40
36
|
*/
|
|
@@ -158,7 +154,6 @@ export const RevealerDestination = {
|
|
|
158
154
|
TIMELINE_PANEL: i18nLazyString(UIStrings.timelinePanel),
|
|
159
155
|
APPLICATION_PANEL: i18nLazyString(UIStrings.applicationPanel),
|
|
160
156
|
SOURCES_PANEL: i18nLazyString(UIStrings.sourcesPanel),
|
|
161
|
-
SECURITY_PANEL: i18nLazyString(UIStrings.securityPanel),
|
|
162
157
|
MEMORY_INSPECTOR_PANEL: i18nLazyString(UIStrings.memoryInspectorPanel),
|
|
163
158
|
ANIMATIONS_PANEL: i18nLazyString(UIStrings.animationsPanel),
|
|
164
159
|
};
|
|
@@ -162,18 +162,28 @@ export class Settings {
|
|
|
162
162
|
return this.#registry;
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
|
-
export
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
}
|
|
165
|
+
export class InMemoryStorage {
|
|
166
|
+
#store = new Map();
|
|
167
|
+
register(_setting) {
|
|
168
|
+
}
|
|
169
|
+
set(key, value) {
|
|
170
|
+
this.#store.set(key, value);
|
|
171
|
+
}
|
|
172
|
+
get(key) {
|
|
173
|
+
return this.#store.get(key);
|
|
174
|
+
}
|
|
175
|
+
remove(key) {
|
|
176
|
+
this.#store.delete(key);
|
|
177
|
+
}
|
|
178
|
+
clear() {
|
|
179
|
+
this.#store.clear();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
172
182
|
export class SettingsStorage {
|
|
173
183
|
object;
|
|
174
184
|
backingStore;
|
|
175
185
|
storagePrefix;
|
|
176
|
-
constructor(object, backingStore =
|
|
186
|
+
constructor(object, backingStore = new InMemoryStorage(), storagePrefix = '') {
|
|
177
187
|
this.object = object;
|
|
178
188
|
this.backingStore = backingStore;
|
|
179
189
|
this.storagePrefix = storagePrefix;
|
|
@@ -194,6 +194,12 @@ export class AidaClient {
|
|
|
194
194
|
if (!InspectorFrontendHostInstance.doAidaConversation) {
|
|
195
195
|
throw new Error('doAidaConversation is not available');
|
|
196
196
|
}
|
|
197
|
+
// Disable logging for now.
|
|
198
|
+
// For context, see b/454563259#comment35.
|
|
199
|
+
// We should be able to remove this ~end of April.
|
|
200
|
+
if (Root.Runtime.hostConfig.devToolsGeminiRebranding?.enabled) {
|
|
201
|
+
request.metadata.disable_user_content_logging = true;
|
|
202
|
+
}
|
|
197
203
|
const stream = (() => {
|
|
198
204
|
let { promise, resolve, reject } = Promise.withResolvers();
|
|
199
205
|
options?.signal?.addEventListener('abort', () => {
|
|
@@ -316,6 +322,12 @@ export class AidaClient {
|
|
|
316
322
|
};
|
|
317
323
|
}
|
|
318
324
|
registerClientEvent(clientEvent) {
|
|
325
|
+
// Disable logging for now.
|
|
326
|
+
// For context, see b/454563259#comment35.
|
|
327
|
+
// We should be able to remove this ~end of April.
|
|
328
|
+
if (Root.Runtime.hostConfig.devToolsGeminiRebranding?.enabled) {
|
|
329
|
+
clientEvent.disable_user_content_logging = true;
|
|
330
|
+
}
|
|
319
331
|
const { promise, resolve } = Promise.withResolvers();
|
|
320
332
|
InspectorFrontendHostInstance.registerAidaClientEvent(JSON.stringify({
|
|
321
333
|
client: CLIENT_NAME,
|
|
@@ -328,6 +340,12 @@ export class AidaClient {
|
|
|
328
340
|
if (!InspectorFrontendHostInstance.aidaCodeComplete) {
|
|
329
341
|
throw new Error('aidaCodeComplete is not available');
|
|
330
342
|
}
|
|
343
|
+
// Disable logging for now.
|
|
344
|
+
// For context, see b/454563259#comment35.
|
|
345
|
+
// We should be able to remove this ~end of April.
|
|
346
|
+
if (Root.Runtime.hostConfig.devToolsGeminiRebranding?.enabled) {
|
|
347
|
+
request.metadata.disable_user_content_logging = true;
|
|
348
|
+
}
|
|
331
349
|
const { promise, resolve } = Promise.withResolvers();
|
|
332
350
|
InspectorFrontendHostInstance.aidaCodeComplete(JSON.stringify(request), resolve);
|
|
333
351
|
const completeCodeResult = await promise;
|
|
@@ -369,6 +387,12 @@ export class AidaClient {
|
|
|
369
387
|
return { generatedSamples, metadata };
|
|
370
388
|
}
|
|
371
389
|
async generateCode(request, options) {
|
|
390
|
+
// Disable logging for now.
|
|
391
|
+
// For context, see b/454563259#comment35.
|
|
392
|
+
// We should be able to remove this ~end of April.
|
|
393
|
+
if (Root.Runtime.hostConfig.devToolsGeminiRebranding?.enabled) {
|
|
394
|
+
request.metadata.disable_user_content_logging = true;
|
|
395
|
+
}
|
|
372
396
|
const response = await DispatchHttpRequestClient.makeHttpRequest({
|
|
373
397
|
service: SERVICE_NAME,
|
|
374
398
|
path: '/v1/aida:generateCode',
|
package/build/vendor/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostStub.js
CHANGED
|
@@ -87,6 +87,9 @@ export class InspectorFrontendHostStub {
|
|
|
87
87
|
setInjectedScriptForOrigin(_origin, _script) {
|
|
88
88
|
}
|
|
89
89
|
inspectedURLChanged(url) {
|
|
90
|
+
if (!('document' in globalThis)) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
90
93
|
document.title = i18nString(UIStrings.devtoolsS, { PH1: url.replace(/^https?:\/\//, '') });
|
|
91
94
|
}
|
|
92
95
|
copyText(text) {
|
|
@@ -175,6 +178,12 @@ export class InspectorFrontendHostStub {
|
|
|
175
178
|
}
|
|
176
179
|
this.recordedPerformanceHistograms.push({ histogramName, duration });
|
|
177
180
|
}
|
|
181
|
+
recordPerformanceHistogramMedium(histogramName, duration) {
|
|
182
|
+
if (this.recordedPerformanceHistograms.length >= MAX_RECORDED_HISTOGRAMS_SIZE) {
|
|
183
|
+
this.recordedPerformanceHistograms.shift();
|
|
184
|
+
}
|
|
185
|
+
this.recordedPerformanceHistograms.push({ histogramName, duration });
|
|
186
|
+
}
|
|
178
187
|
recordUserMetricsAction(_umaName) {
|
|
179
188
|
}
|
|
180
189
|
recordNewBadgeUsage(_featureName) {
|
|
@@ -297,9 +306,6 @@ export class InspectorFrontendHostStub {
|
|
|
297
306
|
devToolsFlexibleLayout: {
|
|
298
307
|
verticalDrawerEnabled: true,
|
|
299
308
|
},
|
|
300
|
-
devToolsStartingStyleDebugging: {
|
|
301
|
-
enabled: false,
|
|
302
|
-
},
|
|
303
309
|
};
|
|
304
310
|
if ('hostConfigForTesting' in globalThis) {
|
|
305
311
|
const { hostConfigForTesting } = globalThis;
|
|
@@ -427,4 +433,6 @@ export class InspectorFrontendHostStub {
|
|
|
427
433
|
}
|
|
428
434
|
recordFunctionCall(_event) {
|
|
429
435
|
}
|
|
436
|
+
setChromeFlag(_flagName, _value) {
|
|
437
|
+
}
|
|
430
438
|
}
|
|
@@ -169,7 +169,7 @@ async function fetchToString(url) {
|
|
|
169
169
|
}
|
|
170
170
|
function canBeRemoteFilePath(url) {
|
|
171
171
|
try {
|
|
172
|
-
const urlObject = new URL(url);
|
|
172
|
+
const urlObject = new URL(new URL(url).toString()); // Normalize first.
|
|
173
173
|
return urlObject.protocol === 'file:' && urlObject.host !== '';
|
|
174
174
|
}
|
|
175
175
|
catch {
|
|
@@ -159,33 +159,15 @@ export class UserMetrics {
|
|
|
159
159
|
InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.SyncSetting" /* EnumeratedHistogram.SyncSetting */, settingValue, 5 /* SyncSetting.MAX_VALUE */);
|
|
160
160
|
});
|
|
161
161
|
}
|
|
162
|
-
recordingAssertion(value) {
|
|
163
|
-
InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingAssertion" /* EnumeratedHistogram.RecordingAssertion */, value, 4 /* RecordingAssertion.MAX_VALUE */);
|
|
164
|
-
}
|
|
165
162
|
recordingToggled(value) {
|
|
166
163
|
InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingToggled" /* EnumeratedHistogram.RecordingToggled */, value, 3 /* RecordingToggled.MAX_VALUE */);
|
|
167
164
|
}
|
|
168
165
|
recordingReplayFinished(value) {
|
|
169
166
|
InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingReplayFinished" /* EnumeratedHistogram.RecordingReplayFinished */, value, 5 /* RecordingReplayFinished.MAX_VALUE */);
|
|
170
167
|
}
|
|
171
|
-
recordingReplaySpeed(value) {
|
|
172
|
-
InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingReplaySpeed" /* EnumeratedHistogram.RecordingReplaySpeed */, value, 5 /* RecordingReplaySpeed.MAX_VALUE */);
|
|
173
|
-
}
|
|
174
168
|
recordingReplayStarted(value) {
|
|
175
169
|
InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingReplayStarted" /* EnumeratedHistogram.RecordingReplayStarted */, value, 4 /* RecordingReplayStarted.MAX_VALUE */);
|
|
176
170
|
}
|
|
177
|
-
recordingEdited(value) {
|
|
178
|
-
InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingEdited" /* EnumeratedHistogram.RecordingEdited */, value, 11 /* RecordingEdited.MAX_VALUE */);
|
|
179
|
-
}
|
|
180
|
-
recordingExported(value) {
|
|
181
|
-
InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingExported" /* EnumeratedHistogram.RecordingExported */, value, 6 /* RecordingExported.MAX_VALUE */);
|
|
182
|
-
}
|
|
183
|
-
recordingCodeToggled(value) {
|
|
184
|
-
InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingCodeToggled" /* EnumeratedHistogram.RecordingCodeToggled */, value, 3 /* RecordingCodeToggled.MAX_VALUE */);
|
|
185
|
-
}
|
|
186
|
-
recordingCopiedToClipboard(value) {
|
|
187
|
-
InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.RecordingCopiedToClipboard" /* EnumeratedHistogram.RecordingCopiedToClipboard */, value, 9 /* RecordingCopiedToClipboard.MAX_VALUE */);
|
|
188
|
-
}
|
|
189
171
|
lighthouseModeRun(type) {
|
|
190
172
|
InspectorFrontendHostInstance.recordEnumeratedHistogram("DevTools.LighthouseModeRun" /* EnumeratedHistogram.LighthouseModeRun */, type, 4 /* LighthouseModeRun.MAX_VALUE */);
|
|
191
173
|
}
|
|
@@ -222,9 +204,30 @@ export class UserMetrics {
|
|
|
222
204
|
consoleInsightTeaserGenerated(timeInMilliseconds) {
|
|
223
205
|
InspectorFrontendHostInstance.recordPerformanceHistogram('DevTools.Insights.TeaserGenerationTime', timeInMilliseconds);
|
|
224
206
|
}
|
|
207
|
+
consoleInsightTeaserGeneratedMedium(timeInMilliseconds) {
|
|
208
|
+
InspectorFrontendHostInstance.recordPerformanceHistogramMedium('DevTools.Insights.TeaserGenerationTimeMedium', timeInMilliseconds);
|
|
209
|
+
}
|
|
225
210
|
consoleInsightTeaserFirstChunkGenerated(timeInMilliseconds) {
|
|
226
211
|
InspectorFrontendHostInstance.recordPerformanceHistogram('DevTools.Insights.TeaserFirstChunkGenerationTime', timeInMilliseconds);
|
|
227
212
|
}
|
|
213
|
+
consoleInsightTeaserFirstChunkGeneratedMedium(timeInMilliseconds) {
|
|
214
|
+
InspectorFrontendHostInstance.recordPerformanceHistogramMedium('DevTools.Insights.TeaserFirstChunkGenerationTimeMedium', timeInMilliseconds);
|
|
215
|
+
}
|
|
216
|
+
consoleInsightTeaserChunkToEndMedium(timeInMilliseconds) {
|
|
217
|
+
InspectorFrontendHostInstance.recordPerformanceHistogramMedium('DevTools.Insights.TeaserChunkToEndMedium', timeInMilliseconds);
|
|
218
|
+
}
|
|
219
|
+
consoleInsightTeaserAbortedAfterFirstCharacter(timeInMilliseconds) {
|
|
220
|
+
InspectorFrontendHostInstance.recordPerformanceHistogram('DevTools.Insights.TeaserAfterFirstCharacterAbortionTime', timeInMilliseconds);
|
|
221
|
+
}
|
|
222
|
+
consoleInsightTeaserAbortedBeforeFirstCharacter(timeInMilliseconds) {
|
|
223
|
+
InspectorFrontendHostInstance.recordPerformanceHistogram('DevTools.Insights.TeaserBeforeFirstCharacterAbortionTime', timeInMilliseconds);
|
|
224
|
+
}
|
|
225
|
+
consoleInsightLongTeaserGenerated(timeInMilliseconds) {
|
|
226
|
+
InspectorFrontendHostInstance.recordPerformanceHistogram('DevTools.Insights.LongTeaserGenerationTime', timeInMilliseconds);
|
|
227
|
+
}
|
|
228
|
+
consoleInsightShortTeaserGenerated(timeInMilliseconds) {
|
|
229
|
+
InspectorFrontendHostInstance.recordPerformanceHistogram('DevTools.Insights.ShortTeaserGenerationTime', timeInMilliseconds);
|
|
230
|
+
}
|
|
228
231
|
}
|
|
229
232
|
/**
|
|
230
233
|
* The numeric enum values are not necessarily continuous! It is possible that
|
|
@@ -436,7 +439,11 @@ export var Action;
|
|
|
436
439
|
Action[Action["InsightTeaserGenerationErrored"] = 194] = "InsightTeaserGenerationErrored";
|
|
437
440
|
Action[Action["AiCodeGenerationSuggestionDisplayed"] = 195] = "AiCodeGenerationSuggestionDisplayed";
|
|
438
441
|
Action[Action["AiCodeGenerationSuggestionAccepted"] = 196] = "AiCodeGenerationSuggestionAccepted";
|
|
439
|
-
Action[Action["
|
|
442
|
+
Action[Action["InsightTeaserModelDownloadStarted"] = 197] = "InsightTeaserModelDownloadStarted";
|
|
443
|
+
Action[Action["InsightTeaserModelDownloadCompleted"] = 198] = "InsightTeaserModelDownloadCompleted";
|
|
444
|
+
Action[Action["AiCodeGenerationError"] = 199] = "AiCodeGenerationError";
|
|
445
|
+
Action[Action["AiCodeGenerationRequestTriggered"] = 200] = "AiCodeGenerationRequestTriggered";
|
|
446
|
+
Action[Action["MAX_VALUE"] = 201] = "MAX_VALUE";
|
|
440
447
|
/* eslint-enable @typescript-eslint/naming-convention */
|
|
441
448
|
})(Action || (Action = {}));
|
|
442
449
|
export var PanelCodes;
|
|
@@ -698,7 +705,7 @@ export var DevtoolsExperiments;
|
|
|
698
705
|
DevtoolsExperiments[DevtoolsExperiments["live-heap-profile"] = 11] = "live-heap-profile";
|
|
699
706
|
DevtoolsExperiments[DevtoolsExperiments["protocol-monitor"] = 13] = "protocol-monitor";
|
|
700
707
|
DevtoolsExperiments[DevtoolsExperiments["sampling-heap-profiler-timeline"] = 17] = "sampling-heap-profiler-timeline";
|
|
701
|
-
DevtoolsExperiments[DevtoolsExperiments["show-option-
|
|
708
|
+
DevtoolsExperiments[DevtoolsExperiments["show-option-to-expose-internals-in-heap-snapshot"] = 18] = "show-option-to-expose-internals-in-heap-snapshot";
|
|
702
709
|
DevtoolsExperiments[DevtoolsExperiments["timeline-invalidation-tracking"] = 26] = "timeline-invalidation-tracking";
|
|
703
710
|
DevtoolsExperiments[DevtoolsExperiments["timeline-show-all-events"] = 27] = "timeline-show-all-events";
|
|
704
711
|
DevtoolsExperiments[DevtoolsExperiments["timeline-v8-runtime-call-stats"] = 28] = "timeline-v8-runtime-call-stats";
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2022 The Chromium Authors
|
|
3
2
|
// Use of this source code is governed by a BSD-style license that can be
|
|
4
3
|
// found in the LICENSE file.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
import glob from 'glob';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import yargs from 'yargs';
|
|
7
|
+
import { hideBin } from 'yargs/helpers';
|
|
8
|
+
import { writeIfChanged } from '../../../scripts/build/ninja/write-if-changed.js';
|
|
9
|
+
import { bakePlaceholders } from '../../../third_party/i18n/bake-ctc-to-lhl.js';
|
|
10
|
+
import { collectAllStringsInDir, createPsuedoLocaleStrings, IGNORED_PATH_COMPONENTS, } from '../../../third_party/i18n/collect-strings.js';
|
|
12
11
|
/** @typedef {import('../../../third_party/i18n/bake-ctc-to-lhl.js').CtcMessage} CtcMessage */
|
|
13
12
|
const yargsObject = yargs(hideBin(process.argv))
|
|
14
13
|
.option('input-directories', {
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2022 The Chromium Authors
|
|
3
2
|
// Use of this source code is governed by a BSD-style license that can be
|
|
4
3
|
// found in the LICENSE file.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import yargs from 'yargs';
|
|
6
|
+
import { hideBin } from 'yargs/helpers';
|
|
7
|
+
import { writeIfChanged } from '../../../scripts/build/ninja/write-if-changed.js';
|
|
9
8
|
const yargsObject = yargs(hideBin(process.argv))
|
|
10
9
|
.option('target-gen-dir', {
|
|
11
10
|
type: 'string',
|
|
@@ -197,3 +197,13 @@ export function nearestIndexFromEnd(arr, predicate) {
|
|
|
197
197
|
export function arrayDoesNotContainNullOrUndefined(arr) {
|
|
198
198
|
return !arr.includes(null) && !arr.includes(undefined);
|
|
199
199
|
}
|
|
200
|
+
export function assertArrayIsSorted(arr, compareFn) {
|
|
201
|
+
const comparator = compareFn || DEFAULT_COMPARATOR;
|
|
202
|
+
for (let i = 0; i < arr.length - 1; i++) {
|
|
203
|
+
const current = arr[i];
|
|
204
|
+
const next = arr[i + 1];
|
|
205
|
+
if (comparator(current, next) > 0) {
|
|
206
|
+
throw new Error(`Array is not sorted at index ${i}: ${JSON.stringify(current)} > ${JSON.stringify(next)}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
@@ -325,26 +325,77 @@ export const compare = (a, b) => {
|
|
|
325
325
|
}
|
|
326
326
|
return 0;
|
|
327
327
|
};
|
|
328
|
+
/** Returns a string that has no more than maxLength characters. Actual graphemes are used, not bytes. */
|
|
328
329
|
export const trimMiddle = (str, maxLength) => {
|
|
330
|
+
// Early return for the case where there are fewer bytes than the character limit.
|
|
329
331
|
if (str.length <= maxLength) {
|
|
330
|
-
return
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
332
|
+
return str;
|
|
333
|
+
}
|
|
334
|
+
const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
|
|
335
|
+
// If the max length is so small it can't fit the ellipsis, just return the ellipsis.
|
|
336
|
+
const ellipsis = '…';
|
|
337
|
+
const ellipsisLength = 1;
|
|
338
|
+
if (maxLength <= ellipsisLength) {
|
|
339
|
+
return ellipsis;
|
|
340
|
+
}
|
|
341
|
+
// Calculate how many graphemes to keep on each side.
|
|
342
|
+
const freeSpace = maxLength - ellipsisLength;
|
|
343
|
+
const leftCount = Math.ceil(freeSpace / 2);
|
|
344
|
+
const rightCount = Math.floor(freeSpace / 2);
|
|
345
|
+
let currentGraphemeCount = 0;
|
|
346
|
+
let leftEndIndex = 0;
|
|
347
|
+
// Sliding Window Buffer
|
|
348
|
+
// We need to know where the "Right Half" starts. Since we can't iterate backwards,
|
|
349
|
+
// we keep track of the start index of the last N graphemes we've seen.
|
|
350
|
+
const rightIndexBuffer = [];
|
|
351
|
+
// This function would be significantly simpler if we created an array of all the
|
|
352
|
+
// segments upfront, but could result in poor performance for large input strings.
|
|
353
|
+
for (const { segment, index } of segmenter.segment(str)) {
|
|
354
|
+
currentGraphemeCount++;
|
|
355
|
+
// Mark the byte index where the "Left Half" ends
|
|
356
|
+
if (currentGraphemeCount === leftCount) {
|
|
357
|
+
leftEndIndex = index + segment.length;
|
|
358
|
+
}
|
|
359
|
+
// Maintain the buffer for the "Right Half"
|
|
360
|
+
if (rightCount > 0) {
|
|
361
|
+
rightIndexBuffer.push(index);
|
|
362
|
+
if (rightIndexBuffer.length > rightCount) {
|
|
363
|
+
rightIndexBuffer.shift(); // Remove the oldest index to keep buffer size constant.
|
|
364
|
+
}
|
|
365
|
+
}
|
|
337
366
|
}
|
|
338
|
-
|
|
339
|
-
|
|
367
|
+
// If the total grapheme count didn't exceed the limit, return the original string.
|
|
368
|
+
if (currentGraphemeCount <= maxLength) {
|
|
369
|
+
return str;
|
|
340
370
|
}
|
|
341
|
-
|
|
371
|
+
// The first item in our buffer is exactly 'rightCount' graphemes away from the end.
|
|
372
|
+
const rightStartIndex = rightCount > 0 ? rightIndexBuffer[0] : str.length;
|
|
373
|
+
return str.slice(0, leftEndIndex) + ellipsis + str.slice(rightStartIndex);
|
|
342
374
|
};
|
|
375
|
+
/** Returns a string that has no more than maxLength characters. Actual graphemes are used, not bytes. */
|
|
343
376
|
export const trimEndWithMaxLength = (str, maxLength) => {
|
|
377
|
+
// Early return for the case where there are fewer bytes than the character limit.
|
|
344
378
|
if (str.length <= maxLength) {
|
|
345
|
-
return
|
|
379
|
+
return str;
|
|
380
|
+
}
|
|
381
|
+
const ellipsis = '…';
|
|
382
|
+
const ellipsisLength = 1;
|
|
383
|
+
const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
|
|
384
|
+
const iterator = segmenter.segment(str)[Symbol.iterator]();
|
|
385
|
+
let lastSegmentIndex = 0;
|
|
386
|
+
for (let i = 0; i <= maxLength - ellipsisLength; i++) {
|
|
387
|
+
const result = iterator.next();
|
|
388
|
+
if (result.done) {
|
|
389
|
+
return str;
|
|
390
|
+
}
|
|
391
|
+
lastSegmentIndex = result.value.index;
|
|
392
|
+
}
|
|
393
|
+
for (let i = 0; i < ellipsisLength; i++) {
|
|
394
|
+
if (iterator.next().done) {
|
|
395
|
+
return str;
|
|
396
|
+
}
|
|
346
397
|
}
|
|
347
|
-
return str.
|
|
398
|
+
return str.slice(0, lastSegmentIndex) + ellipsis;
|
|
348
399
|
};
|
|
349
400
|
export const escapeForRegExp = (str) => {
|
|
350
401
|
return escapeCharacters(str, SPECIAL_REGEX_CHARACTERS);
|
package/build/vendor/chrome-devtools-frontend/front_end/core/protocol_client/CDPConnection.js
CHANGED
|
@@ -14,4 +14,5 @@ export var CDPErrorStatus;
|
|
|
14
14
|
CDPErrorStatus[CDPErrorStatus["SERVER_ERROR"] = -32000] = "SERVER_ERROR";
|
|
15
15
|
CDPErrorStatus[CDPErrorStatus["SESSION_NOT_FOUND"] = -32001] = "SESSION_NOT_FOUND";
|
|
16
16
|
CDPErrorStatus[CDPErrorStatus["DEVTOOLS_STUB_ERROR"] = -32015] = "DEVTOOLS_STUB_ERROR";
|
|
17
|
+
CDPErrorStatus[CDPErrorStatus["DEVTOOLS_REHYDRATION_ERROR"] = -32016] = "DEVTOOLS_REHYDRATION_ERROR";
|
|
17
18
|
})(CDPErrorStatus || (CDPErrorStatus = {}));
|
package/build/vendor/chrome-devtools-frontend/front_end/core/protocol_client/InspectorBackend.js
CHANGED
|
@@ -444,6 +444,7 @@ export class TargetBase {
|
|
|
444
444
|
}
|
|
445
445
|
/** These are not logged as console.error */
|
|
446
446
|
const IGNORED_ERRORS = new Set([
|
|
447
|
+
CDPErrorStatus.DEVTOOLS_REHYDRATION_ERROR,
|
|
447
448
|
CDPErrorStatus.DEVTOOLS_STUB_ERROR,
|
|
448
449
|
CDPErrorStatus.SERVER_ERROR,
|
|
449
450
|
CDPErrorStatus.SESSION_NOT_FOUND,
|
|
@@ -491,7 +492,9 @@ class AgentPrototype {
|
|
|
491
492
|
if ('result' in response) {
|
|
492
493
|
return { ...response.result, getError: () => undefined };
|
|
493
494
|
}
|
|
494
|
-
return {
|
|
495
|
+
return {
|
|
496
|
+
getError: () => `Command ${method} returned neither result nor an error, params: ${JSON.stringify(request, undefined, 2)}`,
|
|
497
|
+
};
|
|
495
498
|
});
|
|
496
499
|
}
|
|
497
500
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Copyright 2026 The Chromium Authors
|
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
|
3
|
+
// found in the LICENSE file.
|
|
4
|
+
export var ExperimentName;
|
|
5
|
+
(function (ExperimentName) {
|
|
6
|
+
ExperimentName["ALL"] = "*";
|
|
7
|
+
ExperimentName["CAPTURE_NODE_CREATION_STACKS"] = "capture-node-creation-stacks";
|
|
8
|
+
ExperimentName["LIVE_HEAP_PROFILE"] = "live-heap-profile";
|
|
9
|
+
ExperimentName["PROTOCOL_MONITOR"] = "protocol-monitor";
|
|
10
|
+
ExperimentName["SAMPLING_HEAP_PROFILER_TIMELINE"] = "sampling-heap-profiler-timeline";
|
|
11
|
+
ExperimentName["SHOW_OPTION_TO_EXPOSE_INTERNALS_IN_HEAP_SNAPSHOT"] = "show-option-to-expose-internals-in-heap-snapshot";
|
|
12
|
+
ExperimentName["TIMELINE_INVALIDATION_TRACKING"] = "timeline-invalidation-tracking";
|
|
13
|
+
ExperimentName["TIMELINE_SHOW_ALL_EVENTS"] = "timeline-show-all-events";
|
|
14
|
+
ExperimentName["TIMELINE_V8_RUNTIME_CALL_STATS"] = "timeline-v8-runtime-call-stats";
|
|
15
|
+
ExperimentName["APCA"] = "apca";
|
|
16
|
+
ExperimentName["FONT_EDITOR"] = "font-editor";
|
|
17
|
+
ExperimentName["FULL_ACCESSIBILITY_TREE"] = "full-accessibility-tree";
|
|
18
|
+
ExperimentName["CONTRAST_ISSUES"] = "contrast-issues";
|
|
19
|
+
ExperimentName["EXPERIMENTAL_COOKIE_FEATURES"] = "experimental-cookie-features";
|
|
20
|
+
ExperimentName["INSTRUMENTATION_BREAKPOINTS"] = "instrumentation-breakpoints";
|
|
21
|
+
ExperimentName["AUTHORED_DEPLOYED_GROUPING"] = "authored-deployed-grouping";
|
|
22
|
+
ExperimentName["JUST_MY_CODE"] = "just-my-code";
|
|
23
|
+
ExperimentName["USE_SOURCE_MAP_SCOPES"] = "use-source-map-scopes";
|
|
24
|
+
ExperimentName["TIMELINE_SHOW_POST_MESSAGE_EVENTS"] = "timeline-show-postmessage-events";
|
|
25
|
+
ExperimentName["TIMELINE_DEBUG_MODE"] = "timeline-debug-mode";
|
|
26
|
+
// Adding or removing an entry from this enum?
|
|
27
|
+
// You will need to update:
|
|
28
|
+
// 1. DevToolsExperiments enum in host/UserMetrics.ts
|
|
29
|
+
// 2. Maybe REGISTERED_EXPERIMENTS in EnvironmentHelpers.ts (to create this experiment in the test env)
|
|
30
|
+
})(ExperimentName || (ExperimentName = {}));
|
|
@@ -2,5 +2,6 @@
|
|
|
2
2
|
// Use of this source code is governed by a BSD-style license that can be
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
import * as DevToolsContext from './DevToolsContext.js';
|
|
5
|
+
import * as ExperimentNames from './ExperimentNames.js';
|
|
5
6
|
import * as Runtime from './Runtime.js';
|
|
6
|
-
export { DevToolsContext, Runtime, };
|
|
7
|
+
export { DevToolsContext, ExperimentNames, Runtime, };
|