chrome-devtools-mcp 0.10.2 → 0.11.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.
Files changed (121) hide show
  1. package/README.md +67 -9
  2. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/common.js +1 -3
  3. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/AidaClient.js +1 -1
  4. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHost.js +31 -449
  5. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostStub.js +430 -0
  6. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/ResourceLoader.js +10 -22
  7. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +2 -5
  8. package/build/node_modules/chrome-devtools-frontend/front_end/core/i18n/collect-ui-strings.js +1 -1
  9. package/build/node_modules/chrome-devtools-frontend/front_end/core/i18n/generate-locales-js.js +1 -1
  10. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/HostRuntime.js +19 -0
  11. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/StringUtilities.js +1 -1
  12. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/api/HostRuntime.js +4 -0
  13. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/api/api.js +5 -0
  14. package/build/node_modules/chrome-devtools-frontend/front_end/core/{common/Worker.js → platform/browser/HostRuntime.js} +18 -7
  15. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/browser/browser.js +5 -0
  16. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/node/HostRuntime.js +72 -0
  17. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/node/node.js +5 -0
  18. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/platform.js +2 -2
  19. package/build/node_modules/chrome-devtools-frontend/front_end/core/root/DevToolsContext.js +4 -0
  20. package/build/node_modules/chrome-devtools-frontend/front_end/core/root/Runtime.js +7 -0
  21. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AnimationModel.js +1 -1
  22. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +2 -2
  23. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMetadata.js +17 -5
  24. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSModel.js +3 -3
  25. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSProperty.js +1 -1
  26. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParserMatchers.js +10 -10
  27. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ConsoleModel.js +1 -1
  28. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Cookie.js +1 -1
  29. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMModel.js +5 -2
  30. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DebuggerModel.js +1 -1
  31. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +46 -34
  32. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +3 -0
  33. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageResourceLoader.js +43 -33
  34. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PreloadingModel.js +1 -1
  35. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RemoteObject.js +1 -1
  36. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ResourceTreeModel.js +1 -1
  37. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Script.js +26 -1
  38. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMap.js +4 -0
  39. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapCache.js +16 -0
  40. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapManager.js +11 -5
  41. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopesInfo.js +129 -20
  42. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Target.js +4 -13
  43. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TargetManager.js +35 -4
  44. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk-meta.js +72 -0
  45. package/build/node_modules/chrome-devtools-frontend/front_end/foundation/Universe.js +5 -1
  46. package/build/node_modules/chrome-devtools-frontend/front_end/generated/Deprecation.js +48 -4
  47. package/build/node_modules/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +45 -42
  48. package/build/node_modules/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +56 -77
  49. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.js +21 -6
  50. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AICallTree.js +9 -3
  51. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CSSWorkspaceBinding.js +4 -3
  52. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CompilerScriptMapping.js +34 -0
  53. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/DebuggerWorkspaceBinding.js +15 -0
  54. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceMapping.js +59 -0
  55. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceScriptMapping.js +38 -0
  56. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/SASSSourceMapping.js +5 -4
  57. package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/CPUProfileDataModel.js +9 -7
  58. package/build/node_modules/chrome-devtools-frontend/front_end/models/crux-manager/CrUXManager.js +5 -3
  59. package/build/node_modules/chrome-devtools-frontend/front_end/models/formatter/FormatterWorkerPool.js +2 -2
  60. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/AttributionReportingIssue.js +5 -6
  61. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/BounceTrackingIssue.js +3 -11
  62. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/ClientHintIssue.js +4 -9
  63. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/ContentSecurityPolicyIssue.js +4 -9
  64. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/ContrastCheckTrigger.js +1 -1
  65. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/CookieDeprecationMetadataIssue.js +5 -11
  66. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/CookieIssue.js +26 -25
  67. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/CorsIssue.js +7 -14
  68. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/CrossOriginEmbedderPolicyIssue.js +4 -6
  69. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/DeprecationIssue.js +6 -11
  70. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/ElementAccessibilityIssue.js +6 -11
  71. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/FederatedAuthRequestIssue.js +3 -8
  72. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/FederatedAuthUserInfoRequestIssue.js +3 -8
  73. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/GenericIssue.js +36 -21
  74. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/HeavyAdIssue.js +3 -8
  75. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/Issue.js +6 -1
  76. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/IssueAggregator.js +6 -1
  77. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/LowTextContrastIssue.js +2 -7
  78. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/MixedContentIssue.js +6 -10
  79. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/PartitioningBlobURLIssue.js +3 -8
  80. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/PropertyRuleIssue.js +5 -10
  81. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/QuirksModeIssue.js +2 -7
  82. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/SRIMessageSignatureIssue.js +6 -10
  83. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/SharedArrayBufferIssue.js +3 -8
  84. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/SharedDictionaryIssue.js +5 -10
  85. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/StylesheetLoadingIssue.js +7 -11
  86. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/UnencodedDigestIssue.js +1 -6
  87. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/genericNavigationEntryMarkedSkippable.md +7 -0
  88. package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/FunctionCodeResolver.js +192 -0
  89. package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/source_map_scopes.js +2 -1
  90. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/SamplesHandler.js +3 -0
  91. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Trace.js +10 -0
  92. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace_source_maps_resolver/SourceMapsResolver.js +23 -0
  93. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/IgnoreListManager.js +1 -1
  94. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/UISourceCode.js +38 -0
  95. package/build/node_modules/chrome-devtools-frontend/mcp/HostBindings.js +222 -0
  96. package/build/node_modules/chrome-devtools-frontend/mcp/mcp.js +15 -1
  97. package/build/src/DevToolsConnectionAdapter.js +56 -19
  98. package/build/src/DevtoolsUtils.js +143 -1
  99. package/build/src/McpContext.js +33 -11
  100. package/build/src/McpResponse.js +18 -26
  101. package/build/src/PageCollector.js +4 -11
  102. package/build/src/browser.js +4 -0
  103. package/build/src/cli.js +11 -3
  104. package/build/src/formatters/consoleFormatter.js +81 -3
  105. package/build/src/formatters/snapshotFormatter.js +18 -4
  106. package/build/src/issue-descriptions.js +4 -0
  107. package/build/src/main.js +20 -49
  108. package/build/src/third_party/THIRD_PARTY_NOTICES +1973 -27
  109. package/build/src/third_party/index.js +58356 -18839
  110. package/build/src/tools/console.js +0 -4
  111. package/build/src/tools/emulation.js +29 -6
  112. package/build/src/tools/screenshot.js +4 -2
  113. package/build/src/tools/snapshot.js +1 -1
  114. package/build/src/tools/tools.js +29 -0
  115. package/build/src/utils/keyboard.js +5 -0
  116. package/package.json +7 -7
  117. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Linkifier.js +0 -34
  118. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DOMUtilities.js +0 -122
  119. package/build/src/features.js +0 -14
  120. /package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/{genericFormAriaLabelledByToNonExistingId.md → genericFormAriaLabelledByToNonExistingIdError.md} +0 -0
  121. /package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/{genericFormLabelHasNeitherForNorNestedInput.md → genericFormLabelHasNeitherForNorNestedInputError.md} +0 -0
@@ -0,0 +1,72 @@
1
+ // Copyright 2025 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
+ import * as WorkerThreads from 'node:worker_threads';
5
+ class NodeWorkerScope {
6
+ postMessage(message) {
7
+ WorkerThreads.parentPort?.postMessage(message);
8
+ }
9
+ set onmessage(listener) {
10
+ WorkerThreads.parentPort?.on('message', data => {
11
+ listener({ data });
12
+ });
13
+ }
14
+ }
15
+ class NodeWorker {
16
+ #workerPromise;
17
+ #disposed = false;
18
+ #rejectWorkerPromise;
19
+ constructor(url) {
20
+ this.#workerPromise = new Promise((resolve, reject) => {
21
+ this.#rejectWorkerPromise = reject;
22
+ const worker = new WorkerThreads.Worker(new URL(url));
23
+ worker.once('message', (message) => {
24
+ if (message === 'workerReady') {
25
+ resolve(worker);
26
+ }
27
+ });
28
+ worker.on('error', reject);
29
+ });
30
+ }
31
+ postMessage(message) {
32
+ void this.#workerPromise.then(worker => {
33
+ if (!this.#disposed) {
34
+ worker.postMessage(message);
35
+ }
36
+ });
37
+ }
38
+ dispose() {
39
+ this.#disposed = true;
40
+ void this.#workerPromise.then(worker => worker.terminate());
41
+ }
42
+ terminate(immediately) {
43
+ if (immediately) {
44
+ this.#rejectWorkerPromise?.(new Error('Worker terminated'));
45
+ }
46
+ this.dispose();
47
+ }
48
+ set onmessage(listener) {
49
+ void this.#workerPromise.then(worker => {
50
+ worker.on('message', data => {
51
+ if (!this.#disposed) {
52
+ listener({ data });
53
+ }
54
+ });
55
+ });
56
+ }
57
+ set onerror(listener) {
58
+ void this.#workerPromise.then(worker => {
59
+ worker.on('error', (error) => {
60
+ if (!this.#disposed) {
61
+ listener({ type: 'error', ...error });
62
+ }
63
+ });
64
+ });
65
+ }
66
+ }
67
+ export const HOST_RUNTIME = {
68
+ createWorker(url) {
69
+ return new NodeWorker(url);
70
+ },
71
+ workerScope: new NodeWorkerScope(),
72
+ };
@@ -0,0 +1,5 @@
1
+ // Copyright 2025 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
+ import * as HostRuntime from './HostRuntime.js';
5
+ export { HostRuntime };
@@ -6,7 +6,7 @@ import * as Brand from './Brand.js';
6
6
  import * as Constructor from './Constructor.js';
7
7
  import * as DateUtilities from './DateUtilities.js';
8
8
  import * as DevToolsPath from './DevToolsPath.js';
9
- import * as DOMUtilities from './DOMUtilities.js';
9
+ import * as HostRuntime from './HostRuntime.js';
10
10
  import * as KeyboardUtilities from './KeyboardUtilities.js';
11
11
  import * as MapUtilities from './MapUtilities.js';
12
12
  import * as MimeType from './MimeType.js';
@@ -23,4 +23,4 @@ import * as UserVisibleError from './UserVisibleError.js';
23
23
  * error).
24
24
  */
25
25
  export { assertNever, assertNotNullOrUndefined, assertUnhandled } from './TypescriptUtilities.js';
26
- export { ArrayUtilities, Brand, Constructor, DateUtilities, DevToolsPath, DOMUtilities, KeyboardUtilities, MapUtilities, MimeType, NumberUtilities, StringUtilities, Timing, TypedArrayUtilities, TypeScriptUtilities, UIString, UserVisibleError, };
26
+ export { ArrayUtilities, Brand, Constructor, DateUtilities, DevToolsPath, HostRuntime, KeyboardUtilities, MapUtilities, MimeType, NumberUtilities, StringUtilities, Timing, TypedArrayUtilities, TypeScriptUtilities, UIString, UserVisibleError, };
@@ -3,6 +3,10 @@
3
3
  // found in the LICENSE file.
4
4
  /**
5
5
  * Container for singletons scoped to a single DevTools universe.
6
+ *
7
+ * When wiring up dependencies, strongly prefer to pass all direct dependencies
8
+ * via constructor, and not just pass a {@link DevToolsContext} around. That would hide
9
+ * dependencies and we want to be explicit.
6
10
  */
7
11
  export class DevToolsContext {
8
12
  #instances = new Map();
@@ -1,4 +1,11 @@
1
1
 
2
2
  export function getChromeVersion() { return ''; };
3
3
  export const hostConfig = {};
4
+ export const Runtime = {
5
+ isDescriptorEnabled: () => true,
6
+ queryParam: () => null,
7
+ }
8
+ export const experiments = {
9
+ isEnabled: () => false,
10
+ }
4
11
 
@@ -302,7 +302,7 @@ export class AnimationModel extends SDKModel {
302
302
  const animation = await AnimationImpl.parsePayload(this, payload);
303
303
  // Ignore Web Animations custom effects & groups.
304
304
  const keyframesRule = animation.source().keyframesRule();
305
- if (animation.type() === 'WebAnimation' && keyframesRule && keyframesRule.keyframes().length === 0) {
305
+ if (animation.type() === 'WebAnimation' && keyframesRule?.keyframes().length === 0) {
306
306
  this.#pendingAnimations.delete(animation.id());
307
307
  }
308
308
  else {
@@ -5,7 +5,7 @@ import * as Platform from '../platform/platform.js';
5
5
  import { CSSMetadata, cssMetadata } from './CSSMetadata.js';
6
6
  import { CSSProperty } from './CSSProperty.js';
7
7
  import * as PropertyParser from './CSSPropertyParser.js';
8
- import { AnchorFunctionMatcher, AngleMatcher, AttributeMatcher, AutoBaseMatcher, BaseVariableMatcher, BezierMatcher, BinOpMatcher, ColorMatcher, ColorMixMatcher, CustomFunctionMatcher, defaultValueForCSSType, EnvFunctionMatcher, FlexGridMasonryMatcher, GridTemplateMatcher, LengthMatcher, LightDarkColorMatcher, LinearGradientMatcher, LinkableNameMatcher, localEvalCSS, MathFunctionMatcher, PositionAnchorMatcher, PositionTryMatcher, RelativeColorChannelMatcher, ShadowMatcher, StringMatcher, URLMatcher, VariableMatcher } from './CSSPropertyParserMatchers.js';
8
+ import { AnchorFunctionMatcher, AngleMatcher, AttributeMatcher, AutoBaseMatcher, BaseVariableMatcher, BezierMatcher, BinOpMatcher, ColorMatcher, ColorMixMatcher, CustomFunctionMatcher, defaultValueForCSSType, EnvFunctionMatcher, FlexGridGridLanesMatcher, GridTemplateMatcher, LengthMatcher, LightDarkColorMatcher, LinearGradientMatcher, LinkableNameMatcher, localEvalCSS, MathFunctionMatcher, PositionAnchorMatcher, PositionTryMatcher, RelativeColorChannelMatcher, ShadowMatcher, StringMatcher, URLMatcher, VariableMatcher } from './CSSPropertyParserMatchers.js';
9
9
  import { CSSAtRule, CSSFunctionRule, CSSKeyframeRule, CSSKeyframesRule, CSSPositionTryRule, CSSPropertyRule, CSSStyleRule, } from './CSSRule.js';
10
10
  import { CSSStyleDeclaration, Type } from './CSSStyleDeclaration.js';
11
11
  function containsStyle(styles, query) {
@@ -713,7 +713,7 @@ export class CSSMatchedStyles {
713
713
  new LinearGradientMatcher(),
714
714
  new AnchorFunctionMatcher(),
715
715
  new PositionAnchorMatcher(),
716
- new FlexGridMasonryMatcher(),
716
+ new FlexGridGridLanesMatcher(),
717
717
  new PositionTryMatcher(),
718
718
  new LengthMatcher(),
719
719
  new MathFunctionMatcher(),
@@ -346,11 +346,8 @@ const cornerShapeValuePresetMap = new Map([
346
346
  ['superellipse(infinity)', 'superellipse(|infinity|)'],
347
347
  ]);
348
348
  const valuePresets = new Map([
349
- ['filter', filterValuePresetMap],
350
- ['backdrop-filter', filterValuePresetMap],
351
- ['background', imageValuePresetMap],
352
- ['background-image', imageValuePresetMap],
353
- ['-webkit-mask-image', imageValuePresetMap],
349
+ ['filter', filterValuePresetMap], ['backdrop-filter', filterValuePresetMap], ['background', imageValuePresetMap],
350
+ ['background-image', imageValuePresetMap], ['-webkit-mask-image', imageValuePresetMap],
354
351
  [
355
352
  'transform',
356
353
  new Map([
@@ -377,6 +374,17 @@ const valuePresets = new Map([
377
374
  ]),
378
375
  ],
379
376
  ['corner-shape', cornerShapeValuePresetMap],
377
+ [
378
+ 'font-variant-alternates',
379
+ new Map([
380
+ ['stylistic', 'stylistic(||)'],
381
+ ['styleset', 'styleset(||)'],
382
+ ['character-variant', 'character-variant(||)'],
383
+ ['swash', 'swash(||)'],
384
+ ['ornaments', 'ornaments(||)'],
385
+ ['annotation', 'annotation(||)'],
386
+ ]),
387
+ ]
380
388
  ]);
381
389
  const distanceProperties = new Set([
382
390
  'background-position',
@@ -648,6 +656,10 @@ const extraPropertyValues = new Map([
648
656
  'ruby',
649
657
  ]),
650
658
  ],
659
+ [
660
+ 'font-variant-alternates',
661
+ new Set(['historical-forms', 'stylistic', 'styleset', 'character-variant', 'swash', 'ornaments', 'annotation'])
662
+ ],
651
663
  ['vertical-align', new Set(['top', 'bottom', '-webkit-baseline-middle'])],
652
664
  ['page-break-after', new Set(['left', 'right', 'always', 'avoid'])],
653
665
  ['text-emphasis-style', textEmphasisStyle],
@@ -138,7 +138,7 @@ export class CSSModel extends SDKModel {
138
138
  try {
139
139
  await this.ensureOriginalStyleSheetText(styleSheetId);
140
140
  const { styles } = await this.agent.invoke_setStyleTexts({ edits: [{ styleSheetId, range: range.serializeToObject(), text }] });
141
- if (!styles || styles.length !== 1) {
141
+ if (styles?.length !== 1) {
142
142
  return false;
143
143
  }
144
144
  this.#domModel.markUndoableState(!majorChange);
@@ -308,7 +308,7 @@ export class CSSModel extends SDKModel {
308
308
  (styles.get('grid-template-columns')?.startsWith('subgrid') ||
309
309
  styles.get('grid-template-rows')?.startsWith('subgrid'))) ??
310
310
  false;
311
- const isMasonry = display === 'masonry' || display === 'inline-masonry';
311
+ const isGridLanes = display === 'grid-lanes' || display === 'inline-grid-lanes';
312
312
  const containerType = styles.get('container-type');
313
313
  const isContainer = Boolean(containerType) && containerType !== '' && containerType !== 'normal';
314
314
  const hasScroll = Boolean(styles.get('scroll-snap-type')) && styles.get('scroll-snap-type') !== 'none';
@@ -316,7 +316,7 @@ export class CSSModel extends SDKModel {
316
316
  isFlex,
317
317
  isGrid,
318
318
  isSubgrid,
319
- isMasonry,
319
+ isGridLanes,
320
320
  isContainer,
321
321
  hasScroll,
322
322
  };
@@ -231,7 +231,7 @@ export class CSSProperty extends Common.ObjectWrapper.ObjectWrapper {
231
231
  }
232
232
  if (cssMetadata().isGridAreaDefiningProperty(propertyName)) {
233
233
  const rowResult = GridAreaRowRegex.exec(token);
234
- if (rowResult && rowResult.index === 0 && !propertyText.trimEnd().endsWith(']')) {
234
+ if (rowResult?.index === 0 && !propertyText.trimEnd().endsWith(']')) {
235
235
  propertyText = propertyText.trimEnd() + '\n' + doubleIndent;
236
236
  }
237
237
  }
@@ -993,7 +993,7 @@ export class CustomFunctionMatcher extends matcherBase(CustomFunctionMatch) {
993
993
  return new CustomFunctionMatch(text, node, callee, args);
994
994
  }
995
995
  }
996
- export class FlexGridMasonryMatch {
996
+ export class FlexGridGridLanesMatch {
997
997
  text;
998
998
  node;
999
999
  layoutType;
@@ -1004,11 +1004,11 @@ export class FlexGridMasonryMatch {
1004
1004
  }
1005
1005
  }
1006
1006
  // clang-format off
1007
- export class FlexGridMasonryMatcher extends matcherBase(FlexGridMasonryMatch) {
1007
+ export class FlexGridGridLanesMatcher extends matcherBase(FlexGridGridLanesMatch) {
1008
1008
  // clang-format on
1009
1009
  static FLEX = ['flex', 'inline-flex', 'block flex', 'inline flex'];
1010
1010
  static GRID = ['grid', 'inline-grid', 'block grid', 'inline grid'];
1011
- static MASONRY = ['masonry', 'inline-masonry', 'block masonry', 'inline masonry'];
1011
+ static GRID_LANES = ['grid-lanes', 'inline-grid-lanes', 'block grid-lanes', 'inline grid-lanes'];
1012
1012
  accepts(propertyName) {
1013
1013
  return propertyName === 'display';
1014
1014
  }
@@ -1024,14 +1024,14 @@ export class FlexGridMasonryMatcher extends matcherBase(FlexGridMasonryMatch) {
1024
1024
  .map(node => matching.getComputedText(node).trim())
1025
1025
  .filter(value => value);
1026
1026
  const text = values.join(' ');
1027
- if (FlexGridMasonryMatcher.FLEX.includes(text)) {
1028
- return new FlexGridMasonryMatch(matching.ast.text(node), node, "flex" /* LayoutType.FLEX */);
1027
+ if (FlexGridGridLanesMatcher.FLEX.includes(text)) {
1028
+ return new FlexGridGridLanesMatch(matching.ast.text(node), node, "flex" /* LayoutType.FLEX */);
1029
1029
  }
1030
- if (FlexGridMasonryMatcher.GRID.includes(text)) {
1031
- return new FlexGridMasonryMatch(matching.ast.text(node), node, "grid" /* LayoutType.GRID */);
1030
+ if (FlexGridGridLanesMatcher.GRID.includes(text)) {
1031
+ return new FlexGridGridLanesMatch(matching.ast.text(node), node, "grid" /* LayoutType.GRID */);
1032
1032
  }
1033
- if (FlexGridMasonryMatcher.MASONRY.includes(text)) {
1034
- return new FlexGridMasonryMatch(matching.ast.text(node), node, "masonry" /* LayoutType.MASONRY */);
1033
+ if (FlexGridGridLanesMatcher.GRID_LANES.includes(text)) {
1034
+ return new FlexGridGridLanesMatch(matching.ast.text(node), node, "grid-lanes" /* LayoutType.GRID_LANES */);
1035
1035
  }
1036
1036
  return null;
1037
1037
  }
@@ -1169,7 +1169,7 @@ export class AnchorFunctionMatcher extends matcherBase(AnchorFunctionMatch) {
1169
1169
  if (node.name === 'VariableName') {
1170
1170
  // Double-dashed anchor reference to be rendered with a link to its matching anchor.
1171
1171
  let parent = node.parent;
1172
- if (!parent || parent.name !== 'ArgList') {
1172
+ if (parent?.name !== 'ArgList') {
1173
1173
  return null;
1174
1174
  }
1175
1175
  parent = parent.parent;
@@ -340,7 +340,7 @@ export class ConsoleModel extends SDKModel {
340
340
  const globalObject = result.object;
341
341
  const callFunctionResult = await globalObject.callFunction(saveVariable, [RemoteObject.toCallArgument(remoteObject)]);
342
342
  globalObject.release();
343
- if (callFunctionResult.wasThrown || !callFunctionResult.object || callFunctionResult.object.type !== 'string') {
343
+ if (callFunctionResult.wasThrown || callFunctionResult.object?.type !== 'string') {
344
344
  failedToSave(callFunctionResult.object || null);
345
345
  }
346
346
  else {
@@ -227,7 +227,7 @@ export class Cookie {
227
227
  // extension cookie tests currently use the funtionality, and if we
228
228
  // ever decide to implement that it should be done by preventing
229
229
  // such cookies from being set.
230
- if (!domain || domain[0] !== '.') {
230
+ if (domain?.[0] !== '.') {
231
231
  return false;
232
232
  }
233
233
  // The host with a "." prefixed.
@@ -607,7 +607,7 @@ export class DOMNode {
607
607
  continue;
608
608
  }
609
609
  const oldAttribute = oldAttributesMap.get(name);
610
- if (!oldAttribute || oldAttribute.value !== value) {
610
+ if (oldAttribute?.value !== value) {
611
611
  attributesChanged = true;
612
612
  }
613
613
  }
@@ -1416,7 +1416,7 @@ export class DOMModel extends SDKModel {
1416
1416
  return null;
1417
1417
  }
1418
1418
  const { nodeIds } = await this.agent.invoke_getSearchResults({ searchId: this.#searchId, fromIndex: index, toIndex: index + 1 });
1419
- return nodeIds && nodeIds.length === 1 ? this.nodeForId(nodeIds[0]) : null;
1419
+ return nodeIds?.length === 1 ? this.nodeForId(nodeIds[0]) : null;
1420
1420
  }
1421
1421
  cancelSearch() {
1422
1422
  if (!this.#searchId) {
@@ -1506,6 +1506,9 @@ class DOMDispatcher {
1506
1506
  constructor(domModel) {
1507
1507
  this.#domModel = domModel;
1508
1508
  }
1509
+ adoptedStyleSheetsModified(_params) {
1510
+ // TODO: implementation
1511
+ }
1509
1512
  documentUpdated() {
1510
1513
  this.#domModel.documentUpdated();
1511
1514
  }
@@ -719,7 +719,7 @@ export class DebuggerModel extends SDKModel {
719
719
  let functionName = null;
720
720
  if (response.properties) {
721
721
  for (const prop of response.properties) {
722
- if (prop.name === 'name' && prop.value && prop.value.type === 'string') {
722
+ if (prop.name === 'name' && prop.value?.type === 'string') {
723
723
  functionName = prop.value;
724
724
  }
725
725
  }
@@ -4,7 +4,6 @@
4
4
  var _a;
5
5
  import * as TextUtils from '../../models/text_utils/text_utils.js';
6
6
  import * as Common from '../common/common.js';
7
- import * as Host from '../host/host.js';
8
7
  import * as i18n from '../i18n/i18n.js';
9
8
  import * as Platform from '../platform/platform.js';
10
9
  import * as Root from '../root/root.js';
@@ -328,13 +327,6 @@ export class NetworkManager extends SDKModel {
328
327
  }
329
328
  return result.status;
330
329
  }
331
- async getIpProtectionProxyStatus() {
332
- const result = await this.#networkAgent.invoke_getIPProtectionProxyStatus();
333
- if (result.getError()) {
334
- return null;
335
- }
336
- return result.status;
337
- }
338
330
  async enableReportingApi(enable = true) {
339
331
  return await this.#networkAgent.invoke_enableReportingApi({ enable });
340
332
  }
@@ -839,6 +831,11 @@ export class NetworkDispatcher {
839
831
  appliedNetworkConditionsId,
840
832
  };
841
833
  this.getExtraInfoBuilder(requestId).addRequestExtraInfo(extraRequestInfo);
834
+ const networkRequest = this.#requestsById.get(requestId);
835
+ if (appliedNetworkConditionsId && networkRequest) {
836
+ networkRequest.setAppliedNetworkConditions(appliedNetworkConditionsId);
837
+ this.updateNetworkRequest(networkRequest);
838
+ }
842
839
  }
843
840
  responseReceivedEarlyHints({ requestId, headers, }) {
844
841
  this.getExtraInfoBuilder(requestId).setEarlyHintsHeaders(this.headersMapToHeadersArray(headers));
@@ -1142,7 +1139,11 @@ export class NetworkDispatcher {
1142
1139
  sendBufferSize: event.options.sendBufferSize,
1143
1140
  receiveBufferSize: event.options.receiveBufferSize,
1144
1141
  dnsQueryType: event.options.dnsQueryType,
1145
- }
1142
+ multicastLoopback: event.options.multicastLoopback,
1143
+ multicastTimeToLive: event.options.multicastTimeToLive,
1144
+ multicastAllowAddressSharing: event.options.multicastAllowAddressSharing,
1145
+ },
1146
+ joinedMulticastGroups: new Set(),
1146
1147
  };
1147
1148
  networkRequest.setResourceType(Common.ResourceType.resourceTypes.DirectSocket);
1148
1149
  networkRequest.setIssueTime(event.timestamp, event.timestamp);
@@ -1228,6 +1229,28 @@ export class NetworkDispatcher {
1228
1229
  networkRequest.responseReceivedTime = event.timestamp;
1229
1230
  this.updateNetworkRequest(networkRequest);
1230
1231
  }
1232
+ directUDPSocketJoinedMulticastGroup(event) {
1233
+ const networkRequest = this.#requestsById.get(event.identifier);
1234
+ if (!networkRequest?.directSocketInfo) {
1235
+ return;
1236
+ }
1237
+ if (!networkRequest.directSocketInfo.joinedMulticastGroups) {
1238
+ networkRequest.directSocketInfo.joinedMulticastGroups = new Set();
1239
+ }
1240
+ if (!networkRequest.directSocketInfo.joinedMulticastGroups.has(event.IPAddress)) {
1241
+ networkRequest.directSocketInfo.joinedMulticastGroups.add(event.IPAddress);
1242
+ this.updateNetworkRequest(networkRequest);
1243
+ }
1244
+ }
1245
+ directUDPSocketLeftMulticastGroup(event) {
1246
+ const networkRequest = this.#requestsById.get(event.identifier);
1247
+ if (!networkRequest?.directSocketInfo?.joinedMulticastGroups) {
1248
+ return;
1249
+ }
1250
+ if (networkRequest.directSocketInfo.joinedMulticastGroups.delete(event.IPAddress)) {
1251
+ this.updateNetworkRequest(networkRequest);
1252
+ }
1253
+ }
1231
1254
  trustTokenOperationDone(event) {
1232
1255
  const request = this.#requestsById.get(event.requestId);
1233
1256
  if (!request) {
@@ -1549,8 +1572,10 @@ export class RequestConditions extends Common.ObjectWrapper.ObjectWrapper {
1549
1572
  promises.push(agent.invoke_overrideNetworkState({
1550
1573
  offline,
1551
1574
  latency: globalConditions?.latency ?? 0,
1552
- downloadThroughput: !globalConditions || globalConditions.download < 0 ? 0 : globalConditions.download,
1553
- uploadThroughput: !globalConditions || globalConditions.upload < 0 ? 0 : globalConditions.upload,
1575
+ downloadThroughput: globalConditions?.download ?? -1,
1576
+ uploadThroughput: globalConditions?.upload ?? -1,
1577
+ connectionType: globalConditions ? NetworkManager.connectionType(globalConditions) :
1578
+ "none" /* Protocol.Network.ConnectionType.None */,
1554
1579
  }));
1555
1580
  }
1556
1581
  this.#conditionsAppliedForTestPromise = this.#conditionsAppliedForTestPromise.then(() => Promise.all(promises));
@@ -1578,7 +1603,6 @@ export class RequestConditions extends Common.ObjectWrapper.ObjectWrapper {
1578
1603
  }
1579
1604
  }
1580
1605
  _a = RequestConditions;
1581
- let multiTargetNetworkManagerInstance;
1582
1606
  export class AppliedNetworkConditions {
1583
1607
  conditions;
1584
1608
  appliedNetworkConditionsId;
@@ -1590,6 +1614,7 @@ export class AppliedNetworkConditions {
1590
1614
  }
1591
1615
  }
1592
1616
  export class MultitargetNetworkManager extends Common.ObjectWrapper.ObjectWrapper {
1617
+ #targetManager;
1593
1618
  #userAgentOverride = '';
1594
1619
  #userAgentMetadataOverride = null;
1595
1620
  #customAcceptedEncodings = null;
@@ -1603,8 +1628,9 @@ export class MultitargetNetworkManager extends Common.ObjectWrapper.ObjectWrappe
1603
1628
  #extraHeaders;
1604
1629
  #customUserAgent;
1605
1630
  #isBlocking = false;
1606
- constructor() {
1631
+ constructor(targetManager) {
1607
1632
  super();
1633
+ this.#targetManager = targetManager;
1608
1634
  // TODO(allada) Remove these and merge it with request interception.
1609
1635
  const blockedPatternChanged = () => {
1610
1636
  this.updateBlockedPatterns();
@@ -1612,17 +1638,17 @@ export class MultitargetNetworkManager extends Common.ObjectWrapper.ObjectWrappe
1612
1638
  };
1613
1639
  this.#requestConditions.addEventListener("request-conditions-changed" /* RequestConditions.Events.REQUEST_CONDITIONS_CHANGED */, blockedPatternChanged);
1614
1640
  this.updateBlockedPatterns();
1615
- TargetManager.instance().observeModels(NetworkManager, this);
1641
+ this.#targetManager.observeModels(NetworkManager, this);
1616
1642
  }
1617
1643
  static instance(opts = { forceNew: null }) {
1618
- const { forceNew } = opts;
1619
- if (!multiTargetNetworkManagerInstance || forceNew) {
1620
- multiTargetNetworkManagerInstance = new MultitargetNetworkManager();
1644
+ const { forceNew, targetManager } = opts;
1645
+ if (!Root.DevToolsContext.globalInstance().has(MultitargetNetworkManager) || forceNew) {
1646
+ Root.DevToolsContext.globalInstance().set(MultitargetNetworkManager, new MultitargetNetworkManager(targetManager ?? TargetManager.instance()));
1621
1647
  }
1622
- return multiTargetNetworkManagerInstance;
1648
+ return Root.DevToolsContext.globalInstance().get(MultitargetNetworkManager);
1623
1649
  }
1624
1650
  static dispose() {
1625
- multiTargetNetworkManagerInstance = null;
1651
+ Root.DevToolsContext.globalInstance().delete(MultitargetNetworkManager);
1626
1652
  }
1627
1653
  static patchUserAgentWithChromeVersion(uaString) {
1628
1654
  // Patches Chrome/ChrOS version from user #agent ("1.2.3.4" when user #agent is: "Chrome/1.2.3.4").
@@ -1873,7 +1899,7 @@ export class MultitargetNetworkManager extends Common.ObjectWrapper.ObjectWrappe
1873
1899
  }
1874
1900
  }
1875
1901
  async getCertificate(origin) {
1876
- const target = TargetManager.instance().primaryPageTarget();
1902
+ const target = this.#targetManager.primaryPageTarget();
1877
1903
  if (!target) {
1878
1904
  return [];
1879
1905
  }
@@ -1883,20 +1909,6 @@ export class MultitargetNetworkManager extends Common.ObjectWrapper.ObjectWrappe
1883
1909
  }
1884
1910
  return certificate.tableNames;
1885
1911
  }
1886
- async loadResource(url) {
1887
- const headers = {};
1888
- const currentUserAgent = this.currentUserAgent();
1889
- if (currentUserAgent) {
1890
- headers['User-Agent'] = currentUserAgent;
1891
- }
1892
- if (Common.Settings.Settings.instance().moduleSetting('cache-disabled').get()) {
1893
- headers['Cache-Control'] = 'no-cache';
1894
- }
1895
- const allowRemoteFilePaths = Common.Settings.Settings.instance().moduleSetting('network.enable-remote-file-loading').get();
1896
- return await new Promise(resolve => Host.ResourceLoader.load(url, headers, (success, _responseHeaders, content, errorDescription) => {
1897
- resolve({ success, content, errorDescription });
1898
- }, allowRemoteFilePaths));
1899
- }
1900
1912
  appliedRequestConditions(requestInternal) {
1901
1913
  if (!requestInternal.appliedNetworkConditionsId) {
1902
1914
  return undefined;
@@ -1260,6 +1260,9 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
1260
1260
  this.#siteHasCookieInOtherPartition = extraRequestInfo.siteHasCookieInOtherPartition ?? false;
1261
1261
  this.#hasThirdPartyCookiePhaseoutIssue = this.#blockedRequestCookies.some(item => item.blockedReasons.includes("ThirdPartyPhaseout" /* Protocol.Network.CookieBlockedReason.ThirdPartyPhaseout */));
1262
1262
  }
1263
+ setAppliedNetworkConditions(appliedNetworkConditionsId) {
1264
+ this.#appliedNetworkConditionsId = appliedNetworkConditionsId;
1265
+ }
1263
1266
  hasExtraRequestInfo() {
1264
1267
  return this.#hasExtraRequestInfo;
1265
1268
  }