@mcp-b/chrome-devtools-mcp 2.0.2 → 2.0.6
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 +69 -5
- package/build/src/browser.js +157 -51
- package/build/src/cli.js +11 -5
- 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/third_party/index.js +1 -1
- 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 +7 -1
- package/build/src/tools/script.js +31 -4
- package/build/src/tools/tools.js +4 -0
- package/build/src/transports/CDPClientTransport.js +184 -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 +28 -21
- 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
package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParserMatchers.js
CHANGED
|
@@ -926,6 +926,9 @@ export class MathFunctionMatch extends BaseFunctionMatch {
|
|
|
926
926
|
case "calc" /* ArithmeticFunction.CALC */:
|
|
927
927
|
case "sibling-count" /* ArithmeticFunction.SIBLING_COUNT */:
|
|
928
928
|
case "sibling-index" /* ArithmeticFunction.SIBLING_INDEX */:
|
|
929
|
+
case "round" /* ArithmeticFunction.ROUND */:
|
|
930
|
+
case "mod" /* ArithmeticFunction.MOD */:
|
|
931
|
+
case "rem" /* ArithmeticFunction.REM */:
|
|
929
932
|
return true;
|
|
930
933
|
}
|
|
931
934
|
// This assignment catches missed values in the switch above.
|
|
@@ -946,6 +949,9 @@ export class MathFunctionMatcher extends matcherBase(MathFunctionMatch) {
|
|
|
946
949
|
case "calc" /* ArithmeticFunction.CALC */:
|
|
947
950
|
case "sibling-count" /* ArithmeticFunction.SIBLING_COUNT */:
|
|
948
951
|
case "sibling-index" /* ArithmeticFunction.SIBLING_INDEX */:
|
|
952
|
+
case "round" /* ArithmeticFunction.ROUND */:
|
|
953
|
+
case "mod" /* ArithmeticFunction.MOD */:
|
|
954
|
+
case "rem" /* ArithmeticFunction.REM */:
|
|
949
955
|
return maybeFunc;
|
|
950
956
|
}
|
|
951
957
|
// This assignment catches missed values in the switch above.
|
|
@@ -433,7 +433,6 @@ export class ConsoleMessage {
|
|
|
433
433
|
#exceptionId = undefined;
|
|
434
434
|
#affectedResources;
|
|
435
435
|
category;
|
|
436
|
-
isCookieReportIssue = false;
|
|
437
436
|
/**
|
|
438
437
|
* The parent frame of the `console.log` call of logpoints or conditional breakpoints
|
|
439
438
|
* if they called `console.*` explicitly. The parent frame is where V8 paused
|
|
@@ -460,7 +459,6 @@ export class ConsoleMessage {
|
|
|
460
459
|
this.workerId = details?.workerId;
|
|
461
460
|
this.#affectedResources = details?.affectedResources;
|
|
462
461
|
this.category = details?.category;
|
|
463
|
-
this.isCookieReportIssue = Boolean(details?.isCookieReportIssue);
|
|
464
462
|
if (!this.#executionContextId && this.#runtimeModel) {
|
|
465
463
|
if (this.scriptId) {
|
|
466
464
|
this.#executionContextId = this.#runtimeModel.executionContextIdForScriptId(this.scriptId);
|
|
@@ -84,7 +84,7 @@ export class CookieModel extends SDKModel {
|
|
|
84
84
|
if (cookie.expires()) {
|
|
85
85
|
expires = Math.floor(Date.parse(`${cookie.expires()}`) / 1000);
|
|
86
86
|
}
|
|
87
|
-
const enabled = Root.Runtime.experiments.isEnabled(
|
|
87
|
+
const enabled = Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.EXPERIMENTAL_COOKIE_FEATURES);
|
|
88
88
|
const preserveUnset = (scheme) => scheme === "Unset" /* Protocol.Network.CookieSourceScheme.Unset */ ? scheme : undefined;
|
|
89
89
|
const protocolCookie = {
|
|
90
90
|
name: cookie.name(),
|
|
@@ -8,7 +8,7 @@ import { CSSModel } from './CSSModel.js';
|
|
|
8
8
|
import { FrameManager } from './FrameManager.js';
|
|
9
9
|
import { OverlayModel } from './OverlayModel.js';
|
|
10
10
|
import { RemoteObject } from './RemoteObject.js';
|
|
11
|
-
import { ResourceTreeModel } from './ResourceTreeModel.js';
|
|
11
|
+
import { Events as ResourceTreeModelEvents, ResourceTreeModel } from './ResourceTreeModel.js';
|
|
12
12
|
import { RuntimeModel } from './RuntimeModel.js';
|
|
13
13
|
import { SDKModel } from './SDKModel.js';
|
|
14
14
|
import { TargetManager } from './TargetManager.js';
|
|
@@ -69,7 +69,16 @@ export const ARIA_ATTRIBUTES = new Set([
|
|
|
69
69
|
'aria-valuenow',
|
|
70
70
|
'aria-valuetext',
|
|
71
71
|
]);
|
|
72
|
-
export
|
|
72
|
+
export var DOMNodeEvents;
|
|
73
|
+
(function (DOMNodeEvents) {
|
|
74
|
+
DOMNodeEvents["TOP_LAYER_INDEX_CHANGED"] = "TopLayerIndexChanged";
|
|
75
|
+
DOMNodeEvents["SCROLLABLE_FLAG_UPDATED"] = "ScrollableFlagUpdated";
|
|
76
|
+
DOMNodeEvents["GRID_OVERLAY_STATE_CHANGED"] = "GridOverlayStateChanged";
|
|
77
|
+
DOMNodeEvents["FLEX_CONTAINER_OVERLAY_STATE_CHANGED"] = "FlexContainerOverlayStateChanged";
|
|
78
|
+
DOMNodeEvents["SCROLL_SNAP_OVERLAY_STATE_CHANGED"] = "ScrollSnapOverlayStateChanged";
|
|
79
|
+
DOMNodeEvents["CONTAINER_QUERY_OVERLAY_STATE_CHANGED"] = "ContainerQueryOverlayStateChanged";
|
|
80
|
+
})(DOMNodeEvents || (DOMNodeEvents = {}));
|
|
81
|
+
export class DOMNode extends Common.ObjectWrapper.ObjectWrapper {
|
|
73
82
|
#domModel;
|
|
74
83
|
#agent;
|
|
75
84
|
ownerDocument;
|
|
@@ -122,7 +131,14 @@ export class DOMNode {
|
|
|
122
131
|
*/
|
|
123
132
|
detached = false;
|
|
124
133
|
#retainedNodes;
|
|
134
|
+
#adoptedStyleSheets = [];
|
|
135
|
+
/**
|
|
136
|
+
* 1-based index of the node in the top layer. Only set
|
|
137
|
+
* for non-backdrop nodes.
|
|
138
|
+
*/
|
|
139
|
+
#topLayerIndex = -1;
|
|
125
140
|
constructor(domModel) {
|
|
141
|
+
super();
|
|
126
142
|
this.#domModel = domModel;
|
|
127
143
|
this.#agent = this.#domModel.getAgent();
|
|
128
144
|
}
|
|
@@ -137,6 +153,7 @@ export class DOMNode {
|
|
|
137
153
|
this.#isInShadowTree = isInShadowTree;
|
|
138
154
|
this.id = payload.nodeId;
|
|
139
155
|
this.#backendNodeId = payload.backendNodeId;
|
|
156
|
+
this.#frameOwnerFrameId = payload.frameId || null;
|
|
140
157
|
this.#domModel.registerNode(this);
|
|
141
158
|
this.#nodeType = payload.nodeType;
|
|
142
159
|
this.#nodeName = payload.nodeName;
|
|
@@ -145,7 +162,6 @@ export class DOMNode {
|
|
|
145
162
|
this.#pseudoType = payload.pseudoType;
|
|
146
163
|
this.#pseudoIdentifier = payload.pseudoIdentifier;
|
|
147
164
|
this.#shadowRootType = payload.shadowRootType;
|
|
148
|
-
this.#frameOwnerFrameId = payload.frameId || null;
|
|
149
165
|
this.#xmlVersion = payload.xmlVersion;
|
|
150
166
|
this.#isSVGNode = Boolean(payload.isSVG);
|
|
151
167
|
this.#isScrollable = Boolean(payload.isScrollable);
|
|
@@ -157,6 +173,9 @@ export class DOMNode {
|
|
|
157
173
|
if (payload.attributes) {
|
|
158
174
|
this.setAttributesPayload(payload.attributes);
|
|
159
175
|
}
|
|
176
|
+
if (payload.adoptedStyleSheets) {
|
|
177
|
+
this.#adoptedStyleSheets = this.toAdoptedStyleSheets(payload.adoptedStyleSheets);
|
|
178
|
+
}
|
|
160
179
|
this.childNodeCountInternal = payload.childNodeCount || 0;
|
|
161
180
|
if (payload.shadowRoots) {
|
|
162
181
|
for (let i = 0; i < payload.shadowRoots.length; ++i) {
|
|
@@ -223,6 +242,16 @@ export class DOMNode {
|
|
|
223
242
|
const childModel = frame.resourceTreeModel()?.target().model(DOMModel);
|
|
224
243
|
return await (childModel?.requestDocument() || null);
|
|
225
244
|
}
|
|
245
|
+
setTopLayerIndex(idx) {
|
|
246
|
+
const oldIndex = this.#topLayerIndex;
|
|
247
|
+
this.#topLayerIndex = idx;
|
|
248
|
+
if (oldIndex !== idx) {
|
|
249
|
+
this.dispatchEventToListeners(DOMNodeEvents.TOP_LAYER_INDEX_CHANGED);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
topLayerIndex() {
|
|
253
|
+
return this.#topLayerIndex;
|
|
254
|
+
}
|
|
226
255
|
isAdFrameNode() {
|
|
227
256
|
if (this.isIframe() && this.#frameOwnerFrameId) {
|
|
228
257
|
const frame = FrameManager.instance().getFrame(this.#frameOwnerFrameId);
|
|
@@ -233,6 +262,12 @@ export class DOMNode {
|
|
|
233
262
|
}
|
|
234
263
|
return false;
|
|
235
264
|
}
|
|
265
|
+
isRootNode() {
|
|
266
|
+
if (this.nodeType() === Node.ELEMENT_NODE && this.nodeName() === 'HTML') {
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
236
271
|
isSVGNode() {
|
|
237
272
|
return this.#isSVGNode;
|
|
238
273
|
}
|
|
@@ -283,6 +318,11 @@ export class DOMNode {
|
|
|
283
318
|
}
|
|
284
319
|
setIsScrollable(isScrollable) {
|
|
285
320
|
this.#isScrollable = isScrollable;
|
|
321
|
+
this.dispatchEventToListeners(DOMNodeEvents.SCROLLABLE_FLAG_UPDATED);
|
|
322
|
+
if (this.nodeName() === '#document') {
|
|
323
|
+
// We show the scroll badge of the document on the <html> element.
|
|
324
|
+
this.ownerDocument?.documentElement?.setIsScrollable(isScrollable);
|
|
325
|
+
}
|
|
286
326
|
}
|
|
287
327
|
setAffectedByStartingStyles(affectedByStartingStyles) {
|
|
288
328
|
this.#affectedByStartingStyles = affectedByStartingStyles;
|
|
@@ -684,6 +724,16 @@ export class DOMNode {
|
|
|
684
724
|
}
|
|
685
725
|
}
|
|
686
726
|
}
|
|
727
|
+
toAdoptedStyleSheets(ids) {
|
|
728
|
+
return ids.map(id => (new AdoptedStyleSheet(id, this)));
|
|
729
|
+
}
|
|
730
|
+
setAdoptedStyleSheets(ids) {
|
|
731
|
+
this.#adoptedStyleSheets = this.toAdoptedStyleSheets(ids);
|
|
732
|
+
this.#domModel.dispatchEventToListeners(Events.AdoptedStyleSheetsModified, this);
|
|
733
|
+
}
|
|
734
|
+
get adoptedStyleSheetsForNode() {
|
|
735
|
+
return this.#adoptedStyleSheets;
|
|
736
|
+
}
|
|
687
737
|
setDistributedNodePayloads(payloads) {
|
|
688
738
|
this.#distributedNodes = [];
|
|
689
739
|
for (const payload of payloads) {
|
|
@@ -987,10 +1037,14 @@ export class DOMNodeShortcut {
|
|
|
987
1037
|
nodeType;
|
|
988
1038
|
nodeName;
|
|
989
1039
|
deferredNode;
|
|
990
|
-
|
|
1040
|
+
// Shortctus to elements that children of the element this shortcut is for.
|
|
1041
|
+
// Currently, use for backdrop elements in the top layer.«
|
|
1042
|
+
childShortcuts = [];
|
|
1043
|
+
constructor(target, backendNodeId, nodeType, nodeName, childShortcuts = []) {
|
|
991
1044
|
this.nodeType = nodeType;
|
|
992
1045
|
this.nodeName = nodeName;
|
|
993
1046
|
this.deferredNode = new DeferredDOMNode(target, backendNodeId);
|
|
1047
|
+
this.childShortcuts = childShortcuts;
|
|
994
1048
|
}
|
|
995
1049
|
}
|
|
996
1050
|
export class DOMDocument extends DOMNode {
|
|
@@ -1007,9 +1061,21 @@ export class DOMDocument extends DOMNode {
|
|
|
1007
1061
|
this.baseURL = (payload.baseURL || '');
|
|
1008
1062
|
}
|
|
1009
1063
|
}
|
|
1064
|
+
export class AdoptedStyleSheet {
|
|
1065
|
+
id;
|
|
1066
|
+
parent;
|
|
1067
|
+
constructor(id, parent) {
|
|
1068
|
+
this.id = id;
|
|
1069
|
+
this.parent = parent;
|
|
1070
|
+
}
|
|
1071
|
+
get cssModel() {
|
|
1072
|
+
return this.parent.domModel().cssModel();
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1010
1075
|
export class DOMModel extends SDKModel {
|
|
1011
1076
|
agent;
|
|
1012
1077
|
idToDOMNode = new Map();
|
|
1078
|
+
frameIdToOwnerNode = new Map();
|
|
1013
1079
|
#document = null;
|
|
1014
1080
|
#attributeLoadNodeIds = new Set();
|
|
1015
1081
|
runtimeModelInternal;
|
|
@@ -1018,15 +1084,20 @@ export class DOMModel extends SDKModel {
|
|
|
1018
1084
|
#frameOwnerNode;
|
|
1019
1085
|
#loadNodeAttributesTimeout;
|
|
1020
1086
|
#searchId;
|
|
1087
|
+
#topLayerThrottler = new Common.Throttler.Throttler(100);
|
|
1088
|
+
#topLayerNodes = [];
|
|
1089
|
+
#resourceTreeModel = null;
|
|
1021
1090
|
constructor(target) {
|
|
1022
1091
|
super(target);
|
|
1023
1092
|
this.agent = target.domAgent();
|
|
1024
1093
|
target.registerDOMDispatcher(new DOMDispatcher(this));
|
|
1025
1094
|
this.runtimeModelInternal = target.model(RuntimeModel);
|
|
1095
|
+
this.#resourceTreeModel = target.model(ResourceTreeModel);
|
|
1096
|
+
this.#resourceTreeModel?.addEventListener(ResourceTreeModelEvents.DocumentOpened, this.onDocumentOpened, this);
|
|
1026
1097
|
if (!target.suspended()) {
|
|
1027
1098
|
void this.agent.invoke_enable({});
|
|
1028
1099
|
}
|
|
1029
|
-
if (Root.Runtime.experiments.isEnabled(
|
|
1100
|
+
if (Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.CAPTURE_NODE_CREATION_STACKS)) {
|
|
1030
1101
|
void this.agent.invoke_setNodeStackTracesEnabled({ enable: true });
|
|
1031
1102
|
}
|
|
1032
1103
|
}
|
|
@@ -1057,6 +1128,18 @@ export class DOMModel extends SDKModel {
|
|
|
1057
1128
|
this.dispatchEventToListeners(Events.DOMMutated, node);
|
|
1058
1129
|
}
|
|
1059
1130
|
}
|
|
1131
|
+
onDocumentOpened(event) {
|
|
1132
|
+
const frame = event.data;
|
|
1133
|
+
const node = this.frameIdToOwnerNode.get(frame.id);
|
|
1134
|
+
if (node) {
|
|
1135
|
+
const contentDocument = node.contentDocument();
|
|
1136
|
+
if (contentDocument && contentDocument.documentURL !== frame.url) {
|
|
1137
|
+
contentDocument.documentURL = frame.url;
|
|
1138
|
+
contentDocument.baseURL = frame.url;
|
|
1139
|
+
this.dispatchEventToListeners(Events.DocumentURLChanged, contentDocument);
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1060
1143
|
requestDocument() {
|
|
1061
1144
|
if (this.#document) {
|
|
1062
1145
|
return Promise.resolve(this.#document);
|
|
@@ -1215,6 +1298,7 @@ export class DOMModel extends SDKModel {
|
|
|
1215
1298
|
}
|
|
1216
1299
|
setDocument(payload) {
|
|
1217
1300
|
this.idToDOMNode = new Map();
|
|
1301
|
+
this.frameIdToOwnerNode = new Map();
|
|
1218
1302
|
if (payload && 'nodeId' in payload) {
|
|
1219
1303
|
this.#document = new DOMDocument(this, payload);
|
|
1220
1304
|
}
|
|
@@ -1331,13 +1415,19 @@ export class DOMModel extends SDKModel {
|
|
|
1331
1415
|
this.dispatchEventToListeners(Events.NodeInserted, node);
|
|
1332
1416
|
this.scheduleMutationEvent(node);
|
|
1333
1417
|
}
|
|
1418
|
+
adoptedStyleSheetsModified(parentId, styleSheets) {
|
|
1419
|
+
const parent = this.idToDOMNode.get(parentId);
|
|
1420
|
+
if (!parent) {
|
|
1421
|
+
return;
|
|
1422
|
+
}
|
|
1423
|
+
parent.setAdoptedStyleSheets(styleSheets);
|
|
1424
|
+
}
|
|
1334
1425
|
scrollableFlagUpdated(nodeId, isScrollable) {
|
|
1335
1426
|
const node = this.nodeForId(nodeId);
|
|
1336
1427
|
if (!node || node.isScrollable() === isScrollable) {
|
|
1337
1428
|
return;
|
|
1338
1429
|
}
|
|
1339
1430
|
node.setIsScrollable(isScrollable);
|
|
1340
|
-
this.dispatchEventToListeners(Events.ScrollableFlagUpdated, { node });
|
|
1341
1431
|
}
|
|
1342
1432
|
affectedByStartingStylesFlagUpdated(nodeId, affectedByStartingStyles) {
|
|
1343
1433
|
const node = this.nodeForId(nodeId);
|
|
@@ -1347,9 +1437,6 @@ export class DOMModel extends SDKModel {
|
|
|
1347
1437
|
node.setAffectedByStartingStyles(affectedByStartingStyles);
|
|
1348
1438
|
this.dispatchEventToListeners(Events.AffectedByStartingStylesFlagUpdated, { node });
|
|
1349
1439
|
}
|
|
1350
|
-
topLayerElementsUpdated() {
|
|
1351
|
-
this.dispatchEventToListeners(Events.TopLayerElementsChanged);
|
|
1352
|
-
}
|
|
1353
1440
|
pseudoElementRemoved(parentId, pseudoElementId) {
|
|
1354
1441
|
const parent = this.idToDOMNode.get(parentId);
|
|
1355
1442
|
if (!parent) {
|
|
@@ -1375,6 +1462,10 @@ export class DOMModel extends SDKModel {
|
|
|
1375
1462
|
}
|
|
1376
1463
|
unbind(node) {
|
|
1377
1464
|
this.idToDOMNode.delete(node.id);
|
|
1465
|
+
const frameId = node.frameOwnerFrameId();
|
|
1466
|
+
if (frameId) {
|
|
1467
|
+
this.frameIdToOwnerNode.delete(frameId);
|
|
1468
|
+
}
|
|
1378
1469
|
const children = node.children();
|
|
1379
1470
|
for (let i = 0; children && i < children.length; ++i) {
|
|
1380
1471
|
this.unbind(children[i]);
|
|
@@ -1437,6 +1528,66 @@ export class DOMModel extends SDKModel {
|
|
|
1437
1528
|
getTopLayerElements() {
|
|
1438
1529
|
return this.agent.invoke_getTopLayerElements().then(({ nodeIds }) => nodeIds);
|
|
1439
1530
|
}
|
|
1531
|
+
topLayerElementsUpdated() {
|
|
1532
|
+
void this.#topLayerThrottler.schedule(async () => {
|
|
1533
|
+
// This returns top layer nodes for all local frames.
|
|
1534
|
+
const result = await this.agent.invoke_getTopLayerElements();
|
|
1535
|
+
if (result.getError()) {
|
|
1536
|
+
return;
|
|
1537
|
+
}
|
|
1538
|
+
// Re-set indexes as we re-create top layer nodes list.
|
|
1539
|
+
const previousDocs = new Set();
|
|
1540
|
+
for (const node of this.#topLayerNodes) {
|
|
1541
|
+
node.setTopLayerIndex(-1);
|
|
1542
|
+
if (node.ownerDocument) {
|
|
1543
|
+
previousDocs.add(node.ownerDocument);
|
|
1544
|
+
}
|
|
1545
|
+
}
|
|
1546
|
+
this.#topLayerNodes.splice(0);
|
|
1547
|
+
const nodes = result.nodeIds.map(id => this.idToDOMNode.get(id)).filter((node) => Boolean(node));
|
|
1548
|
+
const nodesByDocument = new Map();
|
|
1549
|
+
for (const node of nodes) {
|
|
1550
|
+
const document = node.ownerDocument;
|
|
1551
|
+
if (!document) {
|
|
1552
|
+
continue;
|
|
1553
|
+
}
|
|
1554
|
+
if (!nodesByDocument.has(document)) {
|
|
1555
|
+
nodesByDocument.set(document, []);
|
|
1556
|
+
}
|
|
1557
|
+
nodesByDocument.get(document)?.push(node);
|
|
1558
|
+
}
|
|
1559
|
+
for (const [document, nodes] of nodesByDocument) {
|
|
1560
|
+
let topLayerIdx = 1;
|
|
1561
|
+
const documentShortcuts = [];
|
|
1562
|
+
for (const [idx, node] of nodes.entries()) {
|
|
1563
|
+
if (node.nodeName() === '::backdrop') {
|
|
1564
|
+
continue;
|
|
1565
|
+
}
|
|
1566
|
+
const childShortcuts = [];
|
|
1567
|
+
const previousNode = result.nodeIds[idx - 1] ? this.idToDOMNode.get(result.nodeIds[idx - 1]) : null;
|
|
1568
|
+
if (previousNode && previousNode.nodeName() === '::backdrop') {
|
|
1569
|
+
childShortcuts.push(new DOMNodeShortcut(this.target(), previousNode.backendNodeId(), 0, previousNode.nodeName()));
|
|
1570
|
+
}
|
|
1571
|
+
const shortcut = new DOMNodeShortcut(this.target(), node.backendNodeId(), 0, node.nodeName(), childShortcuts);
|
|
1572
|
+
node.setTopLayerIndex(topLayerIdx++);
|
|
1573
|
+
this.#topLayerNodes.push(node);
|
|
1574
|
+
documentShortcuts.push(shortcut);
|
|
1575
|
+
previousDocs.delete(document);
|
|
1576
|
+
}
|
|
1577
|
+
this.dispatchEventToListeners(Events.TopLayerElementsChanged, {
|
|
1578
|
+
document,
|
|
1579
|
+
documentShortcuts,
|
|
1580
|
+
});
|
|
1581
|
+
}
|
|
1582
|
+
// Emit empty events for documents that are no longer in the top layer.
|
|
1583
|
+
for (const document of previousDocs) {
|
|
1584
|
+
this.dispatchEventToListeners(Events.TopLayerElementsChanged, {
|
|
1585
|
+
document,
|
|
1586
|
+
documentShortcuts: [],
|
|
1587
|
+
});
|
|
1588
|
+
}
|
|
1589
|
+
});
|
|
1590
|
+
}
|
|
1440
1591
|
getDetachedDOMNodes() {
|
|
1441
1592
|
return this.agent.invoke_getDetachedDomNodes().then(({ detachedNodes }) => detachedNodes);
|
|
1442
1593
|
}
|
|
@@ -1470,6 +1621,7 @@ export class DOMModel extends SDKModel {
|
|
|
1470
1621
|
await this.agent.invoke_enable({});
|
|
1471
1622
|
}
|
|
1472
1623
|
dispose() {
|
|
1624
|
+
this.#resourceTreeModel?.removeEventListener(ResourceTreeModelEvents.DocumentOpened, this.onDocumentOpened, this);
|
|
1473
1625
|
DOMModelUndoStack.instance().dispose(this);
|
|
1474
1626
|
}
|
|
1475
1627
|
parentModel() {
|
|
@@ -1481,6 +1633,10 @@ export class DOMModel extends SDKModel {
|
|
|
1481
1633
|
}
|
|
1482
1634
|
registerNode(node) {
|
|
1483
1635
|
this.idToDOMNode.set(node.id, node);
|
|
1636
|
+
const frameId = node.frameOwnerFrameId();
|
|
1637
|
+
if (frameId) {
|
|
1638
|
+
this.frameIdToOwnerNode.set(frameId, node);
|
|
1639
|
+
}
|
|
1484
1640
|
}
|
|
1485
1641
|
}
|
|
1486
1642
|
export var Events;
|
|
@@ -1490,6 +1646,7 @@ export var Events;
|
|
|
1490
1646
|
Events["AttrRemoved"] = "AttrRemoved";
|
|
1491
1647
|
Events["CharacterDataModified"] = "CharacterDataModified";
|
|
1492
1648
|
Events["DOMMutated"] = "DOMMutated";
|
|
1649
|
+
Events["DocumentURLChanged"] = "DocumentURLChanged";
|
|
1493
1650
|
Events["NodeInserted"] = "NodeInserted";
|
|
1494
1651
|
Events["NodeRemoved"] = "NodeRemoved";
|
|
1495
1652
|
Events["DocumentUpdated"] = "DocumentUpdated";
|
|
@@ -1497,8 +1654,8 @@ export var Events;
|
|
|
1497
1654
|
Events["DistributedNodesChanged"] = "DistributedNodesChanged";
|
|
1498
1655
|
Events["MarkersChanged"] = "MarkersChanged";
|
|
1499
1656
|
Events["TopLayerElementsChanged"] = "TopLayerElementsChanged";
|
|
1500
|
-
Events["ScrollableFlagUpdated"] = "ScrollableFlagUpdated";
|
|
1501
1657
|
Events["AffectedByStartingStylesFlagUpdated"] = "AffectedByStartingStylesFlagUpdated";
|
|
1658
|
+
Events["AdoptedStyleSheetsModified"] = "AdoptedStyleSheetsModified";
|
|
1502
1659
|
/* eslint-enable @typescript-eslint/naming-convention */
|
|
1503
1660
|
})(Events || (Events = {}));
|
|
1504
1661
|
class DOMDispatcher {
|
|
@@ -1506,9 +1663,6 @@ class DOMDispatcher {
|
|
|
1506
1663
|
constructor(domModel) {
|
|
1507
1664
|
this.#domModel = domModel;
|
|
1508
1665
|
}
|
|
1509
|
-
adoptedStyleSheetsModified(_params) {
|
|
1510
|
-
// TODO: implementation
|
|
1511
|
-
}
|
|
1512
1666
|
documentUpdated() {
|
|
1513
1667
|
this.#domModel.documentUpdated();
|
|
1514
1668
|
}
|
|
@@ -1518,6 +1672,9 @@ class DOMDispatcher {
|
|
|
1518
1672
|
attributeRemoved({ nodeId, name }) {
|
|
1519
1673
|
this.#domModel.attributeRemoved(nodeId, name);
|
|
1520
1674
|
}
|
|
1675
|
+
adoptedStyleSheetsModified({ nodeId, adoptedStyleSheets }) {
|
|
1676
|
+
this.#domModel.adoptedStyleSheetsModified(nodeId, adoptedStyleSheets);
|
|
1677
|
+
}
|
|
1521
1678
|
inlineStyleInvalidated({ nodeIds }) {
|
|
1522
1679
|
this.#domModel.inlineStyleInvalidated(nodeIds);
|
|
1523
1680
|
}
|
|
@@ -129,7 +129,6 @@ export class DebuggerModel extends SDKModel {
|
|
|
129
129
|
#skipAllPausesTimeout = 0;
|
|
130
130
|
#beforePausedCallback = null;
|
|
131
131
|
#computeAutoStepRangesCallback = null;
|
|
132
|
-
#expandCallFramesCallback = null;
|
|
133
132
|
evaluateOnCallFrameCallback = null;
|
|
134
133
|
#synchronizeBreakpointsCallback = null;
|
|
135
134
|
// We need to be able to register listeners for individual breakpoints. As such, we dispatch
|
|
@@ -221,7 +220,7 @@ export class DebuggerModel extends SDKModel {
|
|
|
221
220
|
const maxScriptsCacheSize = isRemoteFrontend ? 10e6 : 100e6;
|
|
222
221
|
const enablePromise = this.agent.invoke_enable({ maxScriptsCacheSize });
|
|
223
222
|
let instrumentationPromise;
|
|
224
|
-
if (Root.Runtime.experiments.isEnabled(
|
|
223
|
+
if (Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.INSTRUMENTATION_BREAKPOINTS)) {
|
|
225
224
|
instrumentationPromise = this.agent.invoke_setInstrumentationBreakpoint({
|
|
226
225
|
instrumentation: "beforeScriptExecution" /* Protocol.Debugger.SetInstrumentationBreakpointRequestInstrumentation.BeforeScriptExecution */,
|
|
227
226
|
});
|
|
@@ -506,9 +505,6 @@ export class DebuggerModel extends SDKModel {
|
|
|
506
505
|
setBeforePausedCallback(callback) {
|
|
507
506
|
this.#beforePausedCallback = callback;
|
|
508
507
|
}
|
|
509
|
-
setExpandCallFramesCallback(callback) {
|
|
510
|
-
this.#expandCallFramesCallback = callback;
|
|
511
|
-
}
|
|
512
508
|
setEvaluateOnCallFrameCallback(callback) {
|
|
513
509
|
this.evaluateOnCallFrameCallback = callback;
|
|
514
510
|
}
|
|
@@ -525,7 +521,6 @@ export class DebuggerModel extends SDKModel {
|
|
|
525
521
|
return;
|
|
526
522
|
}
|
|
527
523
|
const pausedDetails = new DebuggerPausedDetails(this, callFrames, reason, auxData, breakpointIds, asyncStackTrace, asyncStackTraceId);
|
|
528
|
-
await this.#expandCallFrames(pausedDetails);
|
|
529
524
|
if (this.continueToLocationCallback) {
|
|
530
525
|
const callback = this.continueToLocationCallback;
|
|
531
526
|
this.continueToLocationCallback = null;
|
|
@@ -545,31 +540,6 @@ export class DebuggerModel extends SDKModel {
|
|
|
545
540
|
Common.EventTarget.fireEvent('DevTools.DebuggerPaused');
|
|
546
541
|
}
|
|
547
542
|
}
|
|
548
|
-
/** Delegates to the DebuggerLanguagePlugin and potential attached source maps to expand inlined call frames */
|
|
549
|
-
async #expandCallFrames(pausedDetails) {
|
|
550
|
-
if (this.#expandCallFramesCallback) {
|
|
551
|
-
pausedDetails.callFrames = await this.#expandCallFramesCallback.call(null, pausedDetails.callFrames);
|
|
552
|
-
}
|
|
553
|
-
if (!Root.Runtime.experiments.isEnabled("use-source-map-scopes" /* Root.Runtime.ExperimentName.USE_SOURCE_MAP_SCOPES */)) {
|
|
554
|
-
return;
|
|
555
|
-
}
|
|
556
|
-
// TODO(crbug.com/40277685): Support attaching/detaching source maps after pausing.
|
|
557
|
-
// Expanding call frames via source maps here is only suitable for the experiment prototype because
|
|
558
|
-
// we block until all relevant source maps are loaded.
|
|
559
|
-
// We should change this so the "Debugger Plugin" and "Source Map" have a bottle neck where they expand
|
|
560
|
-
// call frames and that bottleneck should support attaching/detaching source maps while paused.
|
|
561
|
-
const finalFrames = [];
|
|
562
|
-
for (const frame of pausedDetails.callFrames) {
|
|
563
|
-
const sourceMap = await this.sourceMapManager().sourceMapForClientPromise(frame.script);
|
|
564
|
-
if (sourceMap?.hasScopeInfo()) {
|
|
565
|
-
finalFrames.push(...sourceMap.expandCallFrame(frame));
|
|
566
|
-
}
|
|
567
|
-
else {
|
|
568
|
-
finalFrames.push(frame);
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
pausedDetails.callFrames = finalFrames;
|
|
572
|
-
}
|
|
573
543
|
resumedScript() {
|
|
574
544
|
this.resetDebuggerPausedDetails();
|
|
575
545
|
this.dispatchEventToListeners(Events.DebuggerResumed, this);
|
|
@@ -590,7 +560,8 @@ export class DebuggerModel extends SDKModel {
|
|
|
590
560
|
const script = new Script(this, scriptId, sourceURL, startLine, startColumn, endLine, endColumn, executionContextId, hash, isContentScript, isLiveEdit, sourceMapURL, hasSourceURLComment, length, isModule, originStackTrace, codeOffset, scriptLanguage, selectedDebugSymbol, embedderName, buildId);
|
|
591
561
|
this.registerScript(script);
|
|
592
562
|
this.dispatchEventToListeners(Events.ParsedScriptSource, script);
|
|
593
|
-
if (
|
|
563
|
+
if ((!selectedDebugSymbol || selectedDebugSymbol.type === "SourceMap" /* Protocol.Debugger.DebugSymbolsType.SourceMap */) &&
|
|
564
|
+
script.sourceMapURL && !hasSyntaxError) {
|
|
594
565
|
this.#sourceMapManager.attachSourceMap(script, script.sourceURL, script.sourceMapURL);
|
|
595
566
|
}
|
|
596
567
|
const isDiscardable = hasSyntaxError && script.isAnonymousScript();
|
|
@@ -607,10 +578,6 @@ export class DebuggerModel extends SDKModel {
|
|
|
607
578
|
this.#sourceMapManager.attachSourceMap(script, script.sourceURL, script.sourceMapURL);
|
|
608
579
|
}
|
|
609
580
|
async setDebugInfoURL(script, _externalURL) {
|
|
610
|
-
if (this.#expandCallFramesCallback && this.#debuggerPausedDetails) {
|
|
611
|
-
this.#debuggerPausedDetails.callFrames =
|
|
612
|
-
await this.#expandCallFramesCallback.call(null, this.#debuggerPausedDetails.callFrames);
|
|
613
|
-
}
|
|
614
581
|
this.dispatchEventToListeners(Events.DebugInfoAttached, script);
|
|
615
582
|
}
|
|
616
583
|
executionContextDestroyed(executionContext) {
|
|
@@ -785,7 +752,8 @@ export class DebuggerModel extends SDKModel {
|
|
|
785
752
|
*/
|
|
786
753
|
async *iterateAsyncParents(stackTraceOrPausedDetails) {
|
|
787
754
|
// We make `DebuggerPausedDetails` look like a stack trace. We are only interested in `parent` and `parentId` in any case.
|
|
788
|
-
|
|
755
|
+
const isPausedDetails = (details) => !('parent' in details) && !('parentId' in details);
|
|
756
|
+
let stackTrace = isPausedDetails(stackTraceOrPausedDetails) ?
|
|
789
757
|
{
|
|
790
758
|
callFrames: [],
|
|
791
759
|
parent: stackTraceOrPausedDetails.asyncStackTrace,
|
|
@@ -950,7 +918,6 @@ export class CallFrame {
|
|
|
950
918
|
functionName;
|
|
951
919
|
#functionLocation;
|
|
952
920
|
#returnValue;
|
|
953
|
-
missingDebugInfoDetails;
|
|
954
921
|
exception;
|
|
955
922
|
canBeRestarted;
|
|
956
923
|
constructor(debuggerModel, script, payload, inlineFrameIndex, functionName, exception = null) {
|
|
@@ -962,7 +929,6 @@ export class CallFrame {
|
|
|
962
929
|
this.#localScope = null;
|
|
963
930
|
this.inlineFrameIndex = inlineFrameIndex || 0;
|
|
964
931
|
this.functionName = functionName ?? payload.functionName;
|
|
965
|
-
this.missingDebugInfoDetails = null;
|
|
966
932
|
this.canBeRestarted = Boolean(payload.canBeRestarted);
|
|
967
933
|
this.exception = exception;
|
|
968
934
|
for (let i = 0; i < payload.scopeChain.length; ++i) {
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
import { RuntimeModel } from './RuntimeModel.js';
|
|
5
5
|
import { SDKModel } from './SDKModel.js';
|
|
6
|
+
import { TargetManager } from './TargetManager.js';
|
|
6
7
|
export class HeapProfilerModel extends SDKModel {
|
|
7
8
|
#enabled;
|
|
8
9
|
#heapProfilerAgent;
|
|
@@ -80,7 +81,13 @@ export class HeapProfilerModel extends SDKModel {
|
|
|
80
81
|
return Boolean(response.getError());
|
|
81
82
|
}
|
|
82
83
|
async takeHeapSnapshot(heapSnapshotOptions) {
|
|
83
|
-
await
|
|
84
|
+
await TargetManager.instance().suspendAllTargets('heap-snapshot');
|
|
85
|
+
try {
|
|
86
|
+
await this.#heapProfilerAgent.invoke_takeHeapSnapshot(heapSnapshotOptions);
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
await TargetManager.instance().resumeAllTargets();
|
|
90
|
+
}
|
|
84
91
|
}
|
|
85
92
|
async startTrackingHeapObjects(recordAllocationStacks) {
|
|
86
93
|
const response = await this.#heapProfilerAgent.invoke_startTrackingHeapObjects({ trackAllocations: recordAllocationStacks });
|
|
@@ -330,6 +330,9 @@ export class NetworkManager extends SDKModel {
|
|
|
330
330
|
async enableReportingApi(enable = true) {
|
|
331
331
|
return await this.#networkAgent.invoke_enableReportingApi({ enable });
|
|
332
332
|
}
|
|
333
|
+
async enableDeviceBoundSessions(enable = true) {
|
|
334
|
+
return await this.#networkAgent.invoke_enableDeviceBoundSessions({ enable });
|
|
335
|
+
}
|
|
333
336
|
async loadNetworkResource(frameId, url, options) {
|
|
334
337
|
const result = await this.#networkAgent.invoke_loadNetworkResource({ frameId: frameId ?? undefined, url, options });
|
|
335
338
|
if (result.getError()) {
|
|
@@ -355,6 +358,8 @@ export var Events;
|
|
|
355
358
|
Events["ReportingApiReportAdded"] = "ReportingApiReportAdded";
|
|
356
359
|
Events["ReportingApiReportUpdated"] = "ReportingApiReportUpdated";
|
|
357
360
|
Events["ReportingApiEndpointsChangedForOrigin"] = "ReportingApiEndpointsChangedForOrigin";
|
|
361
|
+
Events["DeviceBoundSessionsAdded"] = "DeviceBoundSessionsAdded";
|
|
362
|
+
Events["DeviceBoundSessionEventOccurred"] = "DeviceBoundSessionEventOccurred";
|
|
358
363
|
/* eslint-enable @typescript-eslint/naming-convention */
|
|
359
364
|
})(Events || (Events = {}));
|
|
360
365
|
/**
|
|
@@ -612,7 +617,7 @@ export class NetworkDispatcher {
|
|
|
612
617
|
this.getExtraInfoBuilder(requestId).addHasExtraInfo(info.hasExtraInfo);
|
|
613
618
|
this.#manager.dispatchEventToListeners(Events.ResponseReceived, { request: networkRequest, response: info.outerResponse });
|
|
614
619
|
}
|
|
615
|
-
requestWillBeSent({ requestId, loaderId, documentURL, request, timestamp, wallTime, initiator, redirectHasExtraInfo, redirectResponse, type, frameId, hasUserGesture, }) {
|
|
620
|
+
requestWillBeSent({ requestId, loaderId, documentURL, request, timestamp, wallTime, initiator, redirectHasExtraInfo, redirectResponse, type, frameId, hasUserGesture, renderBlockingBehavior, }) {
|
|
616
621
|
let networkRequest = this.#requestsById.get(requestId);
|
|
617
622
|
if (networkRequest) {
|
|
618
623
|
// FIXME: move this check to the backend.
|
|
@@ -639,6 +644,9 @@ export class NetworkDispatcher {
|
|
|
639
644
|
}
|
|
640
645
|
else {
|
|
641
646
|
networkRequest = NetworkRequest.create(requestId, request.url, documentURL, frameId ?? null, loaderId, initiator, hasUserGesture);
|
|
647
|
+
if (renderBlockingBehavior) {
|
|
648
|
+
networkRequest.setRenderBlockingBehavior(renderBlockingBehavior);
|
|
649
|
+
}
|
|
642
650
|
requestToManagerMap.set(networkRequest, this.#manager);
|
|
643
651
|
}
|
|
644
652
|
networkRequest.hasNetworkData = true;
|
|
@@ -810,7 +818,7 @@ export class NetworkDispatcher {
|
|
|
810
818
|
}
|
|
811
819
|
requestIntercepted({}) {
|
|
812
820
|
}
|
|
813
|
-
requestWillBeSentExtraInfo({ requestId, associatedCookies, headers, clientSecurityState, connectTiming, siteHasCookieInOtherPartition, appliedNetworkConditionsId }) {
|
|
821
|
+
requestWillBeSentExtraInfo({ requestId, associatedCookies, headers, deviceBoundSessionUsages, clientSecurityState, connectTiming, siteHasCookieInOtherPartition, appliedNetworkConditionsId }) {
|
|
814
822
|
const blockedRequestCookies = [];
|
|
815
823
|
const includedRequestCookies = [];
|
|
816
824
|
for (const { blockedReasons, exemptionReason, cookie } of associatedCookies) {
|
|
@@ -825,6 +833,7 @@ export class NetworkDispatcher {
|
|
|
825
833
|
blockedRequestCookies,
|
|
826
834
|
includedRequestCookies,
|
|
827
835
|
requestHeaders: this.headersMapToHeadersArray(headers),
|
|
836
|
+
deviceBoundSessionUsages,
|
|
828
837
|
clientSecurityState,
|
|
829
838
|
connectTiming,
|
|
830
839
|
siteHasCookieInOtherPartition,
|
|
@@ -1268,6 +1277,12 @@ export class NetworkDispatcher {
|
|
|
1268
1277
|
reportingApiEndpointsChangedForOrigin(data) {
|
|
1269
1278
|
this.#manager.dispatchEventToListeners(Events.ReportingApiEndpointsChangedForOrigin, data);
|
|
1270
1279
|
}
|
|
1280
|
+
deviceBoundSessionsAdded(_params) {
|
|
1281
|
+
this.#manager.dispatchEventToListeners(Events.DeviceBoundSessionsAdded, _params.sessions);
|
|
1282
|
+
}
|
|
1283
|
+
deviceBoundSessionEventOccurred(_params) {
|
|
1284
|
+
this.#manager.dispatchEventToListeners(Events.DeviceBoundSessionEventOccurred, _params);
|
|
1285
|
+
}
|
|
1271
1286
|
policyUpdated() {
|
|
1272
1287
|
}
|
|
1273
1288
|
/**
|
|
@@ -1536,9 +1551,9 @@ export class RequestConditions extends Common.ObjectWrapper.ObjectWrapper {
|
|
|
1536
1551
|
matchedNetworkConditions.push({ ruleIds, urlPattern, conditions });
|
|
1537
1552
|
}
|
|
1538
1553
|
}
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
}
|
|
1554
|
+
}
|
|
1555
|
+
if (globalConditions) {
|
|
1556
|
+
matchedNetworkConditions.push({ conditions: globalConditions });
|
|
1542
1557
|
}
|
|
1543
1558
|
const promises = [];
|
|
1544
1559
|
for (const agent of agents) {
|