chrome-devtools-mcp-for-extension 0.19.2 → 0.20.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 (153) hide show
  1. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Color.js +13 -9
  2. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ColorConverter.js +9 -7
  3. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Console.js +1 -8
  4. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Debouncer.js +2 -2
  5. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Gzip.js +9 -7
  6. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/MapWithDefault.js +5 -3
  7. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ParsedURL.js +10 -20
  8. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ResourceType.js +0 -11
  9. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ReturnToPanel.js +6 -4
  10. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Revealer.js +5 -0
  11. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SegmentedRange.js +1 -2
  12. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Settings.js +110 -99
  13. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/StringOutputStream.js +1 -4
  14. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Throttler.js +2 -2
  15. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/common.js +1 -4
  16. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/AidaClient.js +21 -2
  17. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/DispatchHttpRequestClient.js +66 -0
  18. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/GdpClient.js +102 -86
  19. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHost.js +32 -450
  20. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostAPI.js +32 -29
  21. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostStub.js +430 -0
  22. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/Platform.js +5 -3
  23. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/ResourceLoader.js +10 -22
  24. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +26 -15
  25. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/host.js +2 -1
  26. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/ArrayUtilities.js +2 -2
  27. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/HostRuntime.js +19 -0
  28. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/StringUtilities.js +34 -32
  29. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/api/HostRuntime.js +4 -0
  30. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/api/api.js +5 -0
  31. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/browser/HostRuntime.js +63 -0
  32. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/browser/browser.js +5 -0
  33. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/node/HostRuntime.js +72 -0
  34. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/node/node.js +5 -0
  35. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/platform.js +2 -2
  36. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/CDPConnection.js +17 -0
  37. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/ConnectionTransport.js +12 -0
  38. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/DevToolsCDPConnection.js +138 -0
  39. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/InspectorBackend.js +49 -312
  40. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/protocol_client.js +4 -9
  41. package/build/node_modules/chrome-devtools-frontend/front_end/core/root/DevToolsContext.js +54 -0
  42. package/build/node_modules/chrome-devtools-frontend/front_end/core/root/root.js +2 -1
  43. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AnimationModel.js +2 -3
  44. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CPUThrottlingManager.js +0 -3
  45. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +51 -17
  46. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMetadata.js +21 -7
  47. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSModel.js +11 -5
  48. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSProperty.js +4 -7
  49. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParser.js +11 -9
  50. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParserMatchers.js +34 -24
  51. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSRule.js +52 -10
  52. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStartingStyle.js +21 -0
  53. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStyleDeclaration.js +4 -4
  54. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ChildTargetManager.js +39 -35
  55. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Connections.js +10 -47
  56. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ConsoleModel.js +1 -1
  57. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Cookie.js +1 -1
  58. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMModel.js +29 -4
  59. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DebuggerModel.js +5 -20
  60. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EnhancedTracesParser.js +17 -3
  61. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EventBreakpointsModel.js +4 -2
  62. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/HttpReasonPhraseStrings.js +4 -2
  63. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IOModel.js +1 -4
  64. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +428 -121
  65. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +8 -22
  66. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageResourceLoader.js +44 -34
  67. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PreloadingModel.js +64 -19
  68. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RehydratingConnection.js +139 -12
  69. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RemoteObject.js +5 -2
  70. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ResourceTreeModel.js +3 -2
  71. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ScopeTreeCache.js +36 -0
  72. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ScreenCaptureModel.js +20 -18
  73. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Script.js +26 -1
  74. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerSentEventsProtocol.js +3 -0
  75. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMap.js +54 -14
  76. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapCache.js +16 -0
  77. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapManager.js +19 -7
  78. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopesInfo.js +240 -8
  79. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Target.js +12 -17
  80. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TargetManager.js +38 -29
  81. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TraceObject.js +11 -8
  82. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk-meta.js +80 -31
  83. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk.js +4 -2
  84. package/build/node_modules/chrome-devtools-frontend/front_end/generated/ARIAProperties.js +1301 -174
  85. package/build/node_modules/chrome-devtools-frontend/front_end/generated/Deprecation.js +67 -22
  86. package/build/node_modules/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +62 -91
  87. package/build/node_modules/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +188 -100
  88. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.js +30 -3
  89. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.js +50 -34
  90. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.js +152 -101
  91. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AICallTree.js +11 -6
  92. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AIContext.js +25 -26
  93. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AIQueries.js +46 -2
  94. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CSSWorkspaceBinding.js +10 -8
  95. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CompilerScriptMapping.js +82 -3
  96. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/DebuggerWorkspaceBinding.js +33 -15
  97. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceMapping.js +105 -14
  98. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceScriptMapping.js +38 -0
  99. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/SASSSourceMapping.js +5 -4
  100. package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/CPUProfileDataModel.js +9 -7
  101. package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/ProfileTreeModel.js +6 -7
  102. package/build/node_modules/chrome-devtools-frontend/front_end/models/crux-manager/CrUXManager.js +6 -4
  103. package/build/node_modules/chrome-devtools-frontend/front_end/models/formatter/FormatterWorkerPool.js +16 -2
  104. package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/RequestTimeRanges.js +6 -4
  105. package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/FunctionCodeResolver.js +192 -0
  106. package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/NamesResolver.js +12 -16
  107. package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/source_map_scopes.js +2 -2
  108. package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceModel.js +1 -1
  109. package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/Trie.js +8 -0
  110. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/LanternComputationData.js +1 -0
  111. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/ModelImpl.js +6 -3
  112. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Processor.js +4 -4
  113. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Styles.js +1 -1
  114. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/TraceTree.js +11 -4
  115. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/FramesHandler.js +7 -5
  116. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LayoutShiftsHandler.js +8 -4
  117. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/MetaHandler.js +4 -1
  118. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/NetworkRequestsHandler.js +29 -3
  119. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/SamplesHandler.js +59 -6
  120. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ScriptsHandler.js +26 -1
  121. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/UserTimingsHandler.js +1 -1
  122. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/helpers.js +1 -1
  123. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Timing.js +4 -2
  124. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Trace.js +18 -4
  125. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/CLSCulprits.js +2 -1
  126. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Cache.js +2 -1
  127. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DOMSize.js +2 -1
  128. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DocumentLatency.js +12 -11
  129. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DuplicatedJavaScript.js +2 -1
  130. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/FontDisplay.js +2 -1
  131. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ForcedReflow.js +3 -2
  132. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/INPBreakdown.js +14 -2
  133. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ImageDelivery.js +2 -1
  134. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPBreakdown.js +13 -2
  135. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPDiscovery.js +2 -1
  136. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LegacyJavaScript.js +4 -2
  137. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ModernHTTP.js +2 -1
  138. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/NetworkDependencyTree.js +4 -3
  139. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/RenderBlocking.js +2 -1
  140. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/SlowCSSSelector.js +2 -1
  141. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ThirdParties.js +2 -1
  142. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Viewport.js +2 -1
  143. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/TraceEvents.js +9 -3
  144. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace_source_maps_resolver/SourceMapsResolver.js +25 -2
  145. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/IgnoreListManager.js +41 -48
  146. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/UISourceCode.js +38 -0
  147. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/WorkspaceImpl.js +5 -8
  148. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/workspace-meta.js +34 -0
  149. package/build/src/McpContext.js +8 -1
  150. package/build/src/tools/bookmarks.js +0 -1
  151. package/build/src/tools/gemini-web.js +17 -25
  152. package/build/src/tools/snapshot.js +9 -2
  153. package/package.json +3 -3
@@ -2,441 +2,17 @@
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 Common from '../common/common.js';
5
- import * as i18n from '../i18n/i18n.js';
6
- import * as Platform from '../platform/platform.js';
7
5
  import * as Root from '../root/root.js';
8
- import { EventDescriptors, Events, } from './InspectorFrontendHostAPI.js';
6
+ import { EventDescriptors, } from './InspectorFrontendHostAPI.js';
7
+ import { InspectorFrontendHostStub } from './InspectorFrontendHostStub.js';
9
8
  import { streamWrite as resourceLoaderStreamWrite } from './ResourceLoader.js';
10
- const UIStrings = {
11
- /**
12
- * @description Document title in Inspector Frontend Host of the DevTools window
13
- * @example {example.com} PH1
14
- */
15
- devtoolsS: 'DevTools - {PH1}',
16
- };
17
- const str_ = i18n.i18n.registerUIStrings('core/host/InspectorFrontendHost.ts', UIStrings);
18
- const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
19
- const MAX_RECORDED_HISTOGRAMS_SIZE = 100;
20
- const OVERRIDES_FILE_SYSTEM_PATH = '/overrides';
21
- /**
22
- * The `InspectorFrontendHostStub` is a stub interface used the frontend is loaded like a webpage. Examples:
23
- * - devtools://devtools/bundled/devtools_app.html
24
- * - https://chrome-devtools-frontend.appspot.com/serve_rev/@030cc140435b0152645522b9864b75cac6c0a854/worker_app.html
25
- * - http://localhost:9222/devtools/inspector.html?ws=localhost:9222/devtools/page/xTARGET_IDx
26
- *
27
- * When the frontend runs within the native embedder, then the InspectorFrontendHostAPI methods are provided
28
- * by devtools_compatibility.js. Those leverage `DevToolsAPI.sendMessageToEmbedder()` which match up with
29
- * the embedder API defined here: https://source.chromium.org/search?q=f:devtools%20f:dispatcher%20f:cc%20symbol:CreateForDevToolsFrontend&sq=&ss=chromium%2Fchromium%2Fsrc
30
- * The native implementations live in devtools_ui_bindings.cc: https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/devtools/devtools_ui_bindings.cc
31
- */
32
- export class InspectorFrontendHostStub {
33
- #urlsBeingSaved = new Map();
34
- #fileSystem = null;
35
- recordedCountHistograms = [];
36
- recordedEnumeratedHistograms = [];
37
- recordedPerformanceHistograms = [];
38
- constructor() {
39
- // Guard against errors should this file ever be imported at the top level
40
- // within a worker - in which case this constructor is run. If there's no
41
- // document, we can early exit.
42
- if (typeof document === 'undefined') {
43
- return;
44
- }
45
- function stopEventPropagation(event) {
46
- // Let browser handle Ctrl+/Ctrl- shortcuts in hosted mode.
47
- const zoomModifier = this.platform() === 'mac' ? event.metaKey : event.ctrlKey;
48
- if (zoomModifier && (event.key === '+' || event.key === '-')) {
49
- event.stopPropagation();
50
- }
51
- }
52
- document.addEventListener('keydown', event => {
53
- stopEventPropagation.call(this, (event));
54
- }, true);
55
- }
56
- platform() {
57
- const userAgent = navigator.userAgent;
58
- if (userAgent.includes('Windows NT')) {
59
- return 'windows';
60
- }
61
- if (userAgent.includes('Mac OS X')) {
62
- return 'mac';
63
- }
64
- return 'linux';
65
- }
66
- loadCompleted() {
67
- }
68
- bringToFront() {
69
- }
70
- closeWindow() {
71
- }
72
- setIsDocked(_isDocked, callback) {
73
- window.setTimeout(callback, 0);
74
- }
75
- showSurvey(_trigger, callback) {
76
- window.setTimeout(() => callback({ surveyShown: false }), 0);
77
- }
78
- canShowSurvey(_trigger, callback) {
79
- window.setTimeout(() => callback({ canShowSurvey: false }), 0);
80
- }
81
- /**
82
- * Requests inspected page to be placed atop of the inspector frontend with specified bounds.
83
- */
84
- setInspectedPageBounds(_bounds) {
85
- }
86
- inspectElementCompleted() {
87
- }
88
- setInjectedScriptForOrigin(_origin, _script) {
89
- }
90
- inspectedURLChanged(url) {
91
- document.title = i18nString(UIStrings.devtoolsS, { PH1: url.replace(/^https?:\/\//, '') });
92
- }
93
- copyText(text) {
94
- if (text === undefined || text === null) {
95
- return;
96
- }
97
- void navigator.clipboard.writeText(text);
98
- }
99
- openInNewTab(url) {
100
- if (Common.ParsedURL.schemeIs(url, 'javascript:')) {
101
- return;
102
- }
103
- window.open(url, '_blank');
104
- }
105
- openSearchResultsInNewTab(_query) {
106
- Common.Console.Console.instance().error('Search is not enabled in hosted mode. Please inspect using chrome://inspect');
107
- }
108
- showItemInFolder(_fileSystemPath) {
109
- Common.Console.Console.instance().error('Show item in folder is not enabled in hosted mode. Please inspect using chrome://inspect');
110
- }
111
- // Reminder: the methods in this class belong to InspectorFrontendHostStub and are typically not executed.
112
- // InspectorFrontendHostStub is ONLY used in the uncommon case of devtools not being embedded. For example: trace.cafe or http://localhost:9222/devtools/inspector.html?ws=localhost:9222/devtools/page/xTARGET_IDx
113
- save(url, content, _forceSaveAs, isBase64) {
114
- let buffer = this.#urlsBeingSaved.get(url)?.buffer;
115
- if (!buffer) {
116
- buffer = [];
117
- this.#urlsBeingSaved.set(url, { isBase64, buffer });
118
- }
119
- buffer.push(content);
120
- this.events.dispatchEventToListeners(Events.SavedURL, { url, fileSystemPath: url });
121
- }
122
- append(url, content) {
123
- const buffer = this.#urlsBeingSaved.get(url)?.buffer;
124
- if (buffer) {
125
- buffer.push(content);
126
- this.events.dispatchEventToListeners(Events.AppendedToURL, url);
127
- }
128
- }
129
- close(url) {
130
- const { isBase64, buffer } = this.#urlsBeingSaved.get(url) || { isBase64: false, buffer: [] };
131
- this.#urlsBeingSaved.delete(url);
132
- let fileName = '';
133
- if (url) {
134
- try {
135
- const trimmed = Platform.StringUtilities.trimURL(url);
136
- fileName = Platform.StringUtilities.removeURLFragment(trimmed);
137
- }
138
- catch {
139
- // If url is not a valid URL, it is probably a filename.
140
- fileName = url;
141
- }
142
- }
143
- /* eslint-disable-next-line rulesdir/no-imperative-dom-api */
144
- const link = document.createElement('a');
145
- link.download = fileName;
146
- let blob;
147
- if (isBase64) {
148
- const bytes = Common.Base64.decode(buffer.join(''));
149
- blob = new Blob([bytes], { type: 'application/gzip' });
150
- }
151
- else {
152
- blob = new Blob(buffer, { type: 'text/plain' });
153
- }
154
- const blobUrl = URL.createObjectURL(blob);
155
- link.href = blobUrl;
156
- link.click();
157
- URL.revokeObjectURL(blobUrl);
158
- }
159
- sendMessageToBackend(_message) {
160
- }
161
- recordCountHistogram(histogramName, sample, min, exclusiveMax, bucketSize) {
162
- if (this.recordedCountHistograms.length >= MAX_RECORDED_HISTOGRAMS_SIZE) {
163
- this.recordedCountHistograms.shift();
164
- }
165
- this.recordedCountHistograms.push({ histogramName, sample, min, exclusiveMax, bucketSize });
166
- }
167
- recordEnumeratedHistogram(actionName, actionCode, _bucketSize) {
168
- if (this.recordedEnumeratedHistograms.length >= MAX_RECORDED_HISTOGRAMS_SIZE) {
169
- this.recordedEnumeratedHistograms.shift();
170
- }
171
- this.recordedEnumeratedHistograms.push({ actionName, actionCode });
172
- }
173
- recordPerformanceHistogram(histogramName, duration) {
174
- if (this.recordedPerformanceHistograms.length >= MAX_RECORDED_HISTOGRAMS_SIZE) {
175
- this.recordedPerformanceHistograms.shift();
176
- }
177
- this.recordedPerformanceHistograms.push({ histogramName, duration });
178
- }
179
- recordUserMetricsAction(_umaName) {
180
- }
181
- recordNewBadgeUsage(_featureName) {
182
- }
183
- connectAutomaticFileSystem(_fileSystemPath, _fileSystemUUID, _addIfMissing, callback) {
184
- queueMicrotask(() => callback({ success: false }));
185
- }
186
- disconnectAutomaticFileSystem(_fileSystemPath) {
187
- }
188
- requestFileSystems() {
189
- this.events.dispatchEventToListeners(Events.FileSystemsLoaded, []);
190
- }
191
- addFileSystem(_type) {
192
- const onFileSystem = (fs) => {
193
- this.#fileSystem = fs;
194
- const fileSystem = {
195
- fileSystemName: 'sandboxedRequestedFileSystem',
196
- fileSystemPath: OVERRIDES_FILE_SYSTEM_PATH,
197
- rootURL: 'filesystem:devtools://devtools/isolated/',
198
- type: 'overrides',
199
- };
200
- this.events.dispatchEventToListeners(Events.FileSystemAdded, { fileSystem });
201
- };
202
- window.webkitRequestFileSystem(window.TEMPORARY, 1024 * 1024, onFileSystem);
203
- }
204
- removeFileSystem(_fileSystemPath) {
205
- const removalCallback = (entries) => {
206
- entries.forEach(entry => {
207
- if (entry.isDirectory) {
208
- entry.removeRecursively(() => { });
209
- }
210
- else if (entry.isFile) {
211
- entry.remove(() => { });
212
- }
213
- });
214
- };
215
- if (this.#fileSystem) {
216
- this.#fileSystem.root.createReader().readEntries(removalCallback);
217
- }
218
- this.#fileSystem = null;
219
- this.events.dispatchEventToListeners(Events.FileSystemRemoved, OVERRIDES_FILE_SYSTEM_PATH);
220
- }
221
- isolatedFileSystem(_fileSystemId, _registeredName) {
222
- return this.#fileSystem;
223
- }
224
- loadNetworkResource(url, _headers, streamId, callback) {
225
- fetch(url)
226
- .then(async (result) => {
227
- const respBuffer = await result.arrayBuffer();
228
- const text = await Common.Gzip.arrayBufferToString(respBuffer);
229
- return text;
230
- })
231
- .then(function (text) {
232
- resourceLoaderStreamWrite(streamId, text);
233
- callback({
234
- statusCode: 200,
235
- headers: undefined,
236
- messageOverride: undefined,
237
- netError: undefined,
238
- netErrorName: undefined,
239
- urlValid: undefined,
240
- });
241
- })
242
- .catch(function () {
243
- callback({
244
- statusCode: 404,
245
- headers: undefined,
246
- messageOverride: undefined,
247
- netError: undefined,
248
- netErrorName: undefined,
249
- urlValid: undefined,
250
- });
251
- });
252
- }
253
- registerPreference(_name, _options) {
254
- }
255
- getPreferences(callback) {
256
- const prefs = {};
257
- for (const name in window.localStorage) {
258
- prefs[name] = window.localStorage[name];
259
- }
260
- callback(prefs);
261
- }
262
- getPreference(name, callback) {
263
- callback(window.localStorage[name]);
264
- }
265
- setPreference(name, value) {
266
- window.localStorage[name] = value;
267
- }
268
- removePreference(name) {
269
- delete window.localStorage[name];
270
- }
271
- clearPreferences() {
272
- window.localStorage.clear();
273
- }
274
- getSyncInformation(callback) {
275
- if ('getSyncInformationForTesting' in globalThis) {
276
- // @ts-expect-error for testing
277
- return callback(globalThis.getSyncInformationForTesting());
278
- }
279
- callback({
280
- isSyncActive: false,
281
- arePreferencesSynced: false,
282
- });
283
- }
284
- getHostConfig(callback) {
285
- // This HostConfig config is used in the hosted mode (see the
286
- // comment on top of this class). Only add non-default config params
287
- // here that you want to also apply in the hosted mode. For tests
288
- // use the hostConfigForTesting override.
289
- const hostConfigForHostedMode = {
290
- devToolsVeLogging: {
291
- enabled: true,
292
- },
293
- thirdPartyCookieControls: {
294
- thirdPartyCookieMetadataEnabled: true,
295
- thirdPartyCookieHeuristicsEnabled: true,
296
- managedBlockThirdPartyCookies: 'Unset',
297
- },
298
- devToolsIpProtectionPanelInDevTools: {
299
- enabled: false,
300
- },
301
- devToolsFlexibleLayout: {
302
- verticalDrawerEnabled: true,
303
- },
304
- };
305
- if ('hostConfigForTesting' in globalThis) {
306
- const { hostConfigForTesting } = globalThis;
307
- for (const key of Object.keys(hostConfigForTesting)) {
308
- const mergeEntry = (key) => {
309
- if (typeof hostConfigForHostedMode[key] === 'object' && typeof hostConfigForTesting[key] === 'object') {
310
- // If the config is an object, merge the settings, but preferring
311
- // the hostConfigForTesting values over the result values.
312
- hostConfigForHostedMode[key] = { ...hostConfigForHostedMode[key], ...hostConfigForTesting[key] };
313
- }
314
- else {
315
- // Override with the testing config if the value is present + not null/undefined.
316
- hostConfigForHostedMode[key] = hostConfigForTesting[key] ?? hostConfigForHostedMode[key];
317
- }
318
- };
319
- mergeEntry(key);
320
- }
321
- }
322
- callback(hostConfigForHostedMode);
323
- }
324
- upgradeDraggedFileSystemPermissions(_fileSystem) {
325
- }
326
- indexPath(_requestId, _fileSystemPath, _excludedFolders) {
327
- }
328
- stopIndexing(_requestId) {
329
- }
330
- searchInPath(_requestId, _fileSystemPath, _query) {
331
- }
332
- zoomFactor() {
333
- return 1;
334
- }
335
- zoomIn() {
336
- }
337
- zoomOut() {
338
- }
339
- resetZoom() {
340
- }
341
- setWhitelistedShortcuts(_shortcuts) {
342
- }
343
- setEyeDropperActive(_active) {
344
- }
345
- showCertificateViewer(_certChain) {
346
- }
347
- reattach(_callback) {
348
- }
349
- readyForTest() {
350
- }
351
- connectionReady() {
352
- }
353
- setOpenNewWindowForPopups(_value) {
354
- }
355
- setDevicesDiscoveryConfig(_config) {
356
- }
357
- setDevicesUpdatesEnabled(_enabled) {
358
- }
359
- openRemotePage(_browserId, _url) {
360
- }
361
- openNodeFrontend() {
362
- }
363
- showContextMenuAtPoint(_x, _y, _items, _document) {
364
- throw new Error('Soft context menu should be used');
365
- }
366
- /**
367
- * Think of **Hosted mode** as "non-embedded" mode; you can see a devtools frontend URL as the tab's URL. It's an atypical way that DevTools is run.
368
- * Whereas in **Non-hosted** (aka "embedded"), DevTools is embedded and fully dockable. It's the common way DevTools is run.
369
- *
370
- * **Hosted mode** == we're using the `InspectorFrontendHostStub`. impl. (@see `InspectorFrontendHostStub` class comment)
371
- * Whereas with **non-hosted** mode, native `DevToolsEmbedderMessageDispatcher` is used for CDP and more.
372
- *
373
- * Relationships to other signals:
374
- * - Hosted-ness does not indicate whether the frontend is _connected to a valid CDP target_.
375
- * - Being _"dockable"_ (aka `canDock`) is typically aligned but technically orthogonal.
376
- * - It's unrelated to the _tab's (main frame's) URL_. Though in non-hosted, the devtools frame origin will always be `devtools://devtools`.
377
- *
378
- * | Example case | Mode | Example devtools |
379
- * | :--------------------------------------------------- | :------------- | :---------------------------------------------------------------------------- |
380
- * | tab URL: anything. embedded DevTools w/ native CDP bindings | **NOT Hosted** | `devtools://devtools/bundled/devtools_app.html?targetType=tab&...` |
381
- * | tab URL: `devtools://…?ws=…` | **Hosted** | `devtools://devtools/bundled/devtools_app.html?ws=localhost:9228/...` |
382
- * | tab URL: `devtools://…` but no connection | **Hosted** | `devtools://devtools/bundled/devtools_app.html` |
383
- * | tab URL: `https://…` but no connection | **Hosted** | `https://chrome-devtools-frontend.appspot.com/serve_rev/@.../worker_app.html` |
384
- * | tab URL: `http://…?ws=` (connected) | **Hosted** | `http://localhost:9222/devtools/inspector.html?ws=localhost:9222/...` |
385
- */
386
- isHostedMode() {
387
- return true;
388
- }
389
- setAddExtensionCallback(_callback) {
390
- // Extensions are not supported in hosted mode.
391
- }
392
- async initialTargetId() {
393
- return null;
394
- }
395
- doAidaConversation(_request, _streamId, callback) {
396
- callback({
397
- error: 'Not implemented',
398
- });
399
- }
400
- registerAidaClientEvent(_request, callback) {
401
- callback({
402
- error: 'Not implemented',
403
- });
404
- }
405
- aidaCodeComplete(_request, callback) {
406
- callback({
407
- error: 'Not implemented',
408
- });
409
- }
410
- dispatchHttpRequest(_request, callback) {
411
- callback({ error: 'Not implemented' });
412
- }
413
- recordImpression(_event) {
414
- }
415
- recordResize(_event) {
416
- }
417
- recordClick(_event) {
418
- }
419
- recordHover(_event) {
420
- }
421
- recordDrag(_event) {
422
- }
423
- recordChange(_event) {
424
- }
425
- recordKeyDown(_event) {
426
- }
427
- recordSettingAccess(_event) {
428
- }
429
- recordFunctionCall(_event) {
430
- }
431
- }
432
- // @ts-expect-error Global injected by devtools_compatibility.js
433
9
  // eslint-disable-next-line @typescript-eslint/naming-convention
434
- export let InspectorFrontendHostInstance = globalThis.InspectorFrontendHost;
10
+ export let InspectorFrontendHostInstance;
435
11
  class InspectorFrontendAPIImpl {
436
12
  constructor() {
437
13
  for (const descriptor of EventDescriptors) {
438
14
  // @ts-expect-error Dispatcher magic
439
- this[descriptor[1]] = this.dispatch.bind(this, descriptor[0], descriptor[2], descriptor[3]);
15
+ this[descriptor[0]] = this.dispatch.bind(this, descriptor[0], descriptor[1], descriptor[2]);
440
16
  }
441
17
  }
442
18
  dispatch(name, signature, _runOnceLoaded, ...params) {
@@ -467,33 +43,37 @@ class InspectorFrontendAPIImpl {
467
43
  resourceLoaderStreamWrite(id, chunk);
468
44
  }
469
45
  }
470
- (function () {
471
- function initializeInspectorFrontendHost() {
472
- if (!InspectorFrontendHostInstance) {
473
- // Instantiate stub for web-hosted mode if necessary.
474
- // @ts-expect-error Global injected by devtools_compatibility.js
475
- globalThis.InspectorFrontendHost = InspectorFrontendHostInstance = new InspectorFrontendHostStub();
476
- }
477
- else {
478
- // Otherwise add stubs for missing methods that are declared in the interface.
479
- const proto = InspectorFrontendHostStub.prototype;
480
- for (const name of Object.getOwnPropertyNames(proto)) {
481
- const stub = proto[name];
482
- if (typeof stub !== 'function' || InspectorFrontendHostInstance[name]) {
483
- continue;
484
- }
485
- console.error(`Incompatible embedder: method Host.InspectorFrontendHost.${name} is missing. Using stub instead.`);
486
- // @ts-expect-error Global injected by devtools_compatibility.js
487
- InspectorFrontendHostInstance[name] = stub;
46
+ /**
47
+ * Installs the provided host bindings implementation as the globally used one by DevTools.
48
+ *
49
+ * - In non-hosted mode this is provided by `devtools_compatibility.js`.
50
+ * - In hosted mode this tends to be the {@link InspectorFrontendHostStub}.
51
+ * - For the MCP server this is a custom node.js specific implementation.
52
+ *
53
+ * Note that missing methods will be copied over from the stub.
54
+ */
55
+ export function installInspectorFrontendHost(instance) {
56
+ globalThis.InspectorFrontendHost = InspectorFrontendHostInstance = instance;
57
+ if (!(instance instanceof InspectorFrontendHostStub)) {
58
+ // Add stubs for missing methods.
59
+ const proto = InspectorFrontendHostStub.prototype;
60
+ for (const name of Object.getOwnPropertyNames(proto)) {
61
+ const stub = proto[name];
62
+ if (typeof stub !== 'function' || InspectorFrontendHostInstance[name]) {
63
+ continue;
488
64
  }
65
+ console.error(`Incompatible embedder: method Host.InspectorFrontendHost.${name} is missing. Using stub instead.`);
66
+ // @ts-expect-error Global injected by devtools_compatibility.js
67
+ InspectorFrontendHostInstance[name] = stub;
489
68
  }
490
- // Attach the events object.
491
- InspectorFrontendHostInstance.events = new Common.ObjectWrapper.ObjectWrapper();
492
69
  }
70
+ // Attach the events object.
71
+ InspectorFrontendHostInstance.events = new Common.ObjectWrapper.ObjectWrapper();
72
+ }
73
+ (function () {
493
74
  // FIXME: This file is included into both apps, since the devtools_app needs the InspectorFrontendHostAPI only,
494
75
  // so the host instance should not be initialized there.
495
- initializeInspectorFrontendHost();
496
- // @ts-expect-error Global injected by devtools_compatibility.js
76
+ installInspectorFrontendHost(globalThis.InspectorFrontendHost ?? new InspectorFrontendHostStub());
497
77
  globalThis.InspectorFrontendAPI = new InspectorFrontendAPIImpl();
498
78
  })();
499
79
  export function isUnderTest(prefs) {
@@ -508,3 +88,5 @@ export function isUnderTest(prefs) {
508
88
  return Common.Settings.Settings.hasInstance() &&
509
89
  Common.Settings.Settings.instance().createSetting('isUnderTest', false).get();
510
90
  }
91
+ // The stub class used to be declared here so for backwards compatibility we re-export it from here.
92
+ export { InspectorFrontendHostStub };
@@ -1,6 +1,9 @@
1
1
  // Copyright 2015 The Chromium Authors
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
+ /**
5
+ * This values should match the one getting called from Chromium
6
+ */
4
7
  export var Events;
5
8
  (function (Events) {
6
9
  /* eslint-disable @typescript-eslint/naming-convention -- Accessed from web_tests */
@@ -20,7 +23,7 @@ export var Events;
20
23
  Events["FileSystemsLoaded"] = "fileSystemsLoaded";
21
24
  Events["FileSystemRemoved"] = "fileSystemRemoved";
22
25
  Events["FileSystemAdded"] = "fileSystemAdded";
23
- Events["FileSystemFilesChangedAddedRemoved"] = "FileSystemFilesChangedAddedRemoved";
26
+ Events["FileSystemFilesChangedAddedRemoved"] = "fileSystemFilesChangedAddedRemoved";
24
27
  Events["IndexingTotalWorkCalculated"] = "indexingTotalWorkCalculated";
25
28
  Events["IndexingWorked"] = "indexingWorked";
26
29
  Events["IndexingDone"] = "indexingDone";
@@ -35,32 +38,32 @@ export var Events;
35
38
  /* eslint-enable @typescript-eslint/naming-convention */
36
39
  })(Events || (Events = {}));
37
40
  export const EventDescriptors = [
38
- [Events.AppendedToURL, 'appendedToURL', ['url']],
39
- [Events.CanceledSaveURL, 'canceledSaveURL', ['url']],
40
- [Events.ColorThemeChanged, 'colorThemeChanged', []],
41
- [Events.ContextMenuCleared, 'contextMenuCleared', []],
42
- [Events.ContextMenuItemSelected, 'contextMenuItemSelected', ['id']],
43
- [Events.DeviceCountUpdated, 'deviceCountUpdated', ['count']],
44
- [Events.DevicesDiscoveryConfigChanged, 'devicesDiscoveryConfigChanged', ['config']],
45
- [Events.DevicesPortForwardingStatusChanged, 'devicesPortForwardingStatusChanged', ['status']],
46
- [Events.DevicesUpdated, 'devicesUpdated', ['devices']],
47
- [Events.DispatchMessage, 'dispatchMessage', ['messageObject']],
48
- [Events.DispatchMessageChunk, 'dispatchMessageChunk', ['messageChunk', 'messageSize']],
49
- [Events.EnterInspectElementMode, 'enterInspectElementMode', []],
50
- [Events.EyeDropperPickedColor, 'eyeDropperPickedColor', ['color']],
51
- [Events.FileSystemsLoaded, 'fileSystemsLoaded', ['fileSystems']],
52
- [Events.FileSystemRemoved, 'fileSystemRemoved', ['fileSystemPath']],
53
- [Events.FileSystemAdded, 'fileSystemAdded', ['errorMessage', 'fileSystem']],
54
- [Events.FileSystemFilesChangedAddedRemoved, 'fileSystemFilesChangedAddedRemoved', ['changed', 'added', 'removed']],
55
- [Events.IndexingTotalWorkCalculated, 'indexingTotalWorkCalculated', ['requestId', 'fileSystemPath', 'totalWork']],
56
- [Events.IndexingWorked, 'indexingWorked', ['requestId', 'fileSystemPath', 'worked']],
57
- [Events.IndexingDone, 'indexingDone', ['requestId', 'fileSystemPath']],
58
- [Events.KeyEventUnhandled, 'keyEventUnhandled', ['event']],
59
- [Events.ReloadInspectedPage, 'reloadInspectedPage', ['hard']],
60
- [Events.RevealSourceLine, 'revealSourceLine', ['url', 'lineNumber', 'columnNumber']],
61
- [Events.SavedURL, 'savedURL', ['url', 'fileSystemPath']],
62
- [Events.SearchCompleted, 'searchCompleted', ['requestId', 'fileSystemPath', 'files']],
63
- [Events.SetInspectedTabId, 'setInspectedTabId', ['tabId']],
64
- [Events.SetUseSoftMenu, 'setUseSoftMenu', ['useSoftMenu']],
65
- [Events.ShowPanel, 'showPanel', ['panelName']],
41
+ [Events.AppendedToURL, ['url']],
42
+ [Events.CanceledSaveURL, ['url']],
43
+ [Events.ColorThemeChanged, []],
44
+ [Events.ContextMenuCleared, []],
45
+ [Events.ContextMenuItemSelected, ['id']],
46
+ [Events.DeviceCountUpdated, ['count']],
47
+ [Events.DevicesDiscoveryConfigChanged, ['config']],
48
+ [Events.DevicesPortForwardingStatusChanged, ['status']],
49
+ [Events.DevicesUpdated, ['devices']],
50
+ [Events.DispatchMessage, ['messageObject']],
51
+ [Events.DispatchMessageChunk, ['messageChunk', 'messageSize']],
52
+ [Events.EnterInspectElementMode, []],
53
+ [Events.EyeDropperPickedColor, ['color']],
54
+ [Events.FileSystemsLoaded, ['fileSystems']],
55
+ [Events.FileSystemRemoved, ['fileSystemPath']],
56
+ [Events.FileSystemAdded, ['errorMessage', 'fileSystem']],
57
+ [Events.FileSystemFilesChangedAddedRemoved, ['changed', 'added', 'removed']],
58
+ [Events.IndexingTotalWorkCalculated, , ['requestId', 'fileSystemPath', 'totalWork']],
59
+ [Events.IndexingWorked, ['requestId', 'fileSystemPath', 'worked']],
60
+ [Events.IndexingDone, ['requestId', 'fileSystemPath']],
61
+ [Events.KeyEventUnhandled, ['event']],
62
+ [Events.ReloadInspectedPage, ['hard']],
63
+ [Events.RevealSourceLine, ['url', 'lineNumber', 'columnNumber']],
64
+ [Events.SavedURL, ['url', 'fileSystemPath']],
65
+ [Events.SearchCompleted, ['requestId', 'fileSystemPath', 'files']],
66
+ [Events.SetInspectedTabId, ['tabId']],
67
+ [Events.SetUseSoftMenu, ['useSoftMenu']],
68
+ [Events.ShowPanel, ['panelName']],
66
69
  ];