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.
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Color.js +13 -9
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ColorConverter.js +9 -7
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Console.js +1 -8
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Debouncer.js +2 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Gzip.js +9 -7
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/MapWithDefault.js +5 -3
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ParsedURL.js +10 -20
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ResourceType.js +0 -11
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ReturnToPanel.js +6 -4
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Revealer.js +5 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/SegmentedRange.js +1 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Settings.js +110 -99
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/StringOutputStream.js +1 -4
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Throttler.js +2 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/core/common/common.js +1 -4
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/AidaClient.js +21 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/DispatchHttpRequestClient.js +66 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/GdpClient.js +102 -86
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHost.js +32 -450
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostAPI.js +32 -29
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostStub.js +430 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/Platform.js +5 -3
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/ResourceLoader.js +10 -22
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +26 -15
- package/build/node_modules/chrome-devtools-frontend/front_end/core/host/host.js +2 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/ArrayUtilities.js +2 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/HostRuntime.js +19 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/StringUtilities.js +34 -32
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/api/HostRuntime.js +4 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/api/api.js +5 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/browser/HostRuntime.js +63 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/browser/browser.js +5 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/node/HostRuntime.js +72 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/node/node.js +5 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/platform.js +2 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/CDPConnection.js +17 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/ConnectionTransport.js +12 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/DevToolsCDPConnection.js +138 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/InspectorBackend.js +49 -312
- package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/protocol_client.js +4 -9
- package/build/node_modules/chrome-devtools-frontend/front_end/core/root/DevToolsContext.js +54 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/root/root.js +2 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AnimationModel.js +2 -3
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CPUThrottlingManager.js +0 -3
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +51 -17
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMetadata.js +21 -7
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSModel.js +11 -5
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSProperty.js +4 -7
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParser.js +11 -9
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParserMatchers.js +34 -24
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSRule.js +52 -10
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStartingStyle.js +21 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSStyleDeclaration.js +4 -4
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ChildTargetManager.js +39 -35
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Connections.js +10 -47
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ConsoleModel.js +1 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Cookie.js +1 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMModel.js +29 -4
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DebuggerModel.js +5 -20
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EnhancedTracesParser.js +17 -3
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/EventBreakpointsModel.js +4 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/HttpReasonPhraseStrings.js +4 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IOModel.js +1 -4
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +428 -121
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +8 -22
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageResourceLoader.js +44 -34
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PreloadingModel.js +64 -19
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RehydratingConnection.js +139 -12
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RemoteObject.js +5 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ResourceTreeModel.js +3 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ScopeTreeCache.js +36 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ScreenCaptureModel.js +20 -18
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Script.js +26 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ServerSentEventsProtocol.js +3 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMap.js +54 -14
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapCache.js +16 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapManager.js +19 -7
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopesInfo.js +240 -8
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Target.js +12 -17
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TargetManager.js +38 -29
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TraceObject.js +11 -8
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk-meta.js +80 -31
- package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk.js +4 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/generated/ARIAProperties.js +1301 -174
- package/build/node_modules/chrome-devtools-frontend/front_end/generated/Deprecation.js +67 -22
- package/build/node_modules/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +62 -91
- package/build/node_modules/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +188 -100
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.js +30 -3
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.js +50 -34
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.js +152 -101
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AICallTree.js +11 -6
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AIContext.js +25 -26
- package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AIQueries.js +46 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CSSWorkspaceBinding.js +10 -8
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CompilerScriptMapping.js +82 -3
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/DebuggerWorkspaceBinding.js +33 -15
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceMapping.js +105 -14
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceScriptMapping.js +38 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/SASSSourceMapping.js +5 -4
- package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/CPUProfileDataModel.js +9 -7
- package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/ProfileTreeModel.js +6 -7
- package/build/node_modules/chrome-devtools-frontend/front_end/models/crux-manager/CrUXManager.js +6 -4
- package/build/node_modules/chrome-devtools-frontend/front_end/models/formatter/FormatterWorkerPool.js +16 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/models/network_time_calculator/RequestTimeRanges.js +6 -4
- package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/FunctionCodeResolver.js +192 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/NamesResolver.js +12 -16
- package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/source_map_scopes.js +2 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceModel.js +1 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/Trie.js +8 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/LanternComputationData.js +1 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/ModelImpl.js +6 -3
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Processor.js +4 -4
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Styles.js +1 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/TraceTree.js +11 -4
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/FramesHandler.js +7 -5
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LayoutShiftsHandler.js +8 -4
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/MetaHandler.js +4 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/NetworkRequestsHandler.js +29 -3
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/SamplesHandler.js +59 -6
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/ScriptsHandler.js +26 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/UserTimingsHandler.js +1 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/helpers.js +1 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Timing.js +4 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Trace.js +18 -4
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/CLSCulprits.js +2 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Cache.js +2 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DOMSize.js +2 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DocumentLatency.js +12 -11
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/DuplicatedJavaScript.js +2 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/FontDisplay.js +2 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ForcedReflow.js +3 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/INPBreakdown.js +14 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ImageDelivery.js +2 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPBreakdown.js +13 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPDiscovery.js +2 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LegacyJavaScript.js +4 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ModernHTTP.js +2 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/NetworkDependencyTree.js +4 -3
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/RenderBlocking.js +2 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/SlowCSSSelector.js +2 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/ThirdParties.js +2 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Viewport.js +2 -1
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/TraceEvents.js +9 -3
- package/build/node_modules/chrome-devtools-frontend/front_end/models/trace_source_maps_resolver/SourceMapsResolver.js +25 -2
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/IgnoreListManager.js +41 -48
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/UISourceCode.js +38 -0
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/WorkspaceImpl.js +5 -8
- package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/workspace-meta.js +34 -0
- package/build/src/McpContext.js +8 -1
- package/build/src/tools/bookmarks.js +0 -1
- package/build/src/tools/gemini-web.js +17 -25
- package/build/src/tools/snapshot.js +9 -2
- package/package.json +3 -3
|
@@ -225,8 +225,6 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
|
|
|
225
225
|
#initialPriority = null;
|
|
226
226
|
#currentPriority = null;
|
|
227
227
|
#signedExchangeInfo = null;
|
|
228
|
-
#webBundleInfo = null;
|
|
229
|
-
#webBundleInnerRequestInfo = null;
|
|
230
228
|
#resourceType = Common.ResourceType.resourceTypes.Other;
|
|
231
229
|
#contentData = null;
|
|
232
230
|
#streamingContentData = null;
|
|
@@ -306,8 +304,8 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
|
|
|
306
304
|
responseReceivedPromiseResolve;
|
|
307
305
|
directSocketInfo;
|
|
308
306
|
#directSocketChunks = [];
|
|
309
|
-
#isIpProtectionUsed;
|
|
310
307
|
#isAdRelated;
|
|
308
|
+
#appliedNetworkConditionsId;
|
|
311
309
|
constructor(requestId, backendRequestId, url, documentURL, frameId, loaderId, initiator, hasUserGesture) {
|
|
312
310
|
super();
|
|
313
311
|
this.#requestId = requestId;
|
|
@@ -318,7 +316,6 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
|
|
|
318
316
|
this.#loaderId = loaderId;
|
|
319
317
|
this.#initiator = initiator;
|
|
320
318
|
this.#hasUserGesture = hasUserGesture;
|
|
321
|
-
this.#isIpProtectionUsed = false;
|
|
322
319
|
this.#isAdRelated = false;
|
|
323
320
|
}
|
|
324
321
|
static create(backendRequestId, url, documentURL, frameId, loaderId, initiator, hasUserGesture) {
|
|
@@ -376,6 +373,9 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
|
|
|
376
373
|
get loaderId() {
|
|
377
374
|
return this.#loaderId;
|
|
378
375
|
}
|
|
376
|
+
get appliedNetworkConditionsId() {
|
|
377
|
+
return this.#appliedNetworkConditionsId;
|
|
378
|
+
}
|
|
379
379
|
setRemoteAddress(ip, port) {
|
|
380
380
|
this.#remoteAddress = ip + ':' + port;
|
|
381
381
|
this.dispatchEventToListeners(Events.REMOTE_ADDRESS_CHANGED, this);
|
|
@@ -1168,18 +1168,6 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
|
|
|
1168
1168
|
signedExchangeInfo() {
|
|
1169
1169
|
return this.#signedExchangeInfo;
|
|
1170
1170
|
}
|
|
1171
|
-
setWebBundleInfo(info) {
|
|
1172
|
-
this.#webBundleInfo = info;
|
|
1173
|
-
}
|
|
1174
|
-
webBundleInfo() {
|
|
1175
|
-
return this.#webBundleInfo;
|
|
1176
|
-
}
|
|
1177
|
-
setWebBundleInnerRequestInfo(info) {
|
|
1178
|
-
this.#webBundleInnerRequestInfo = info;
|
|
1179
|
-
}
|
|
1180
|
-
webBundleInnerRequestInfo() {
|
|
1181
|
-
return this.#webBundleInnerRequestInfo;
|
|
1182
|
-
}
|
|
1183
1171
|
async populateImageSource(image) {
|
|
1184
1172
|
const contentData = await this.requestContentData();
|
|
1185
1173
|
if (TextUtils.ContentData.ContentData.isError(contentData)) {
|
|
@@ -1265,12 +1253,16 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
|
|
|
1265
1253
|
this.#hasExtraRequestInfo = true;
|
|
1266
1254
|
this.setRequestHeadersText(''); // Mark request headers as non-provisional
|
|
1267
1255
|
this.#clientSecurityState = extraRequestInfo.clientSecurityState;
|
|
1256
|
+
this.#appliedNetworkConditionsId = extraRequestInfo.appliedNetworkConditionsId;
|
|
1268
1257
|
if (extraRequestInfo.connectTiming) {
|
|
1269
1258
|
this.setConnectTimingFromExtraInfo(extraRequestInfo.connectTiming);
|
|
1270
1259
|
}
|
|
1271
1260
|
this.#siteHasCookieInOtherPartition = extraRequestInfo.siteHasCookieInOtherPartition ?? false;
|
|
1272
1261
|
this.#hasThirdPartyCookiePhaseoutIssue = this.#blockedRequestCookies.some(item => item.blockedReasons.includes("ThirdPartyPhaseout" /* Protocol.Network.CookieBlockedReason.ThirdPartyPhaseout */));
|
|
1273
1262
|
}
|
|
1263
|
+
setAppliedNetworkConditions(appliedNetworkConditionsId) {
|
|
1264
|
+
this.#appliedNetworkConditionsId = appliedNetworkConditionsId;
|
|
1265
|
+
}
|
|
1274
1266
|
hasExtraRequestInfo() {
|
|
1275
1267
|
return this.#hasExtraRequestInfo;
|
|
1276
1268
|
}
|
|
@@ -1418,12 +1410,6 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
|
|
|
1418
1410
|
isSameSite() {
|
|
1419
1411
|
return this.#isSameSite;
|
|
1420
1412
|
}
|
|
1421
|
-
setIsIpProtectionUsed(isIpProtectionUsed) {
|
|
1422
|
-
this.#isIpProtectionUsed = isIpProtectionUsed;
|
|
1423
|
-
}
|
|
1424
|
-
isIpProtectionUsed() {
|
|
1425
|
-
return this.#isIpProtectionUsed;
|
|
1426
|
-
}
|
|
1427
1413
|
setIsAdRelated(isAdRelated) {
|
|
1428
1414
|
this.#isAdRelated = isAdRelated;
|
|
1429
1415
|
}
|
package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageResourceLoader.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import * as Common from '../common/common.js';
|
|
5
5
|
import * as Host from '../host/host.js';
|
|
6
6
|
import * as i18n from '../i18n/i18n.js';
|
|
7
|
-
import
|
|
7
|
+
import * as Root from '../root/root.js';
|
|
8
8
|
import { IOModel } from './IOModel.js';
|
|
9
9
|
import { MultitargetNetworkManager, NetworkManager } from './NetworkManager.js';
|
|
10
10
|
import { Events as ResourceTreeModelEvents, ResourceTreeModel, } from './ResourceTreeModel.js';
|
|
@@ -20,44 +20,48 @@ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
|
20
20
|
function isExtensionInitiator(initiator) {
|
|
21
21
|
return 'extensionId' in initiator;
|
|
22
22
|
}
|
|
23
|
-
|
|
23
|
+
/** Used for revealing a resource. **/
|
|
24
24
|
export class ResourceKey {
|
|
25
25
|
key;
|
|
26
26
|
constructor(key) {
|
|
27
27
|
this.key = key;
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
let pageResourceLoader = null;
|
|
31
30
|
/**
|
|
32
31
|
* The page resource loader is a bottleneck for all DevTools-initiated resource loads. For each such load, it keeps a
|
|
33
32
|
* `PageResource` object around that holds meta information. This can be as the basis for reporting to the user which
|
|
34
33
|
* resources were loaded, and whether there was a load error.
|
|
35
34
|
*/
|
|
36
35
|
export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper {
|
|
36
|
+
#targetManager;
|
|
37
|
+
#settings;
|
|
38
|
+
#userAgentProvider;
|
|
37
39
|
#currentlyLoading = 0;
|
|
38
40
|
#currentlyLoadingPerTarget = new Map();
|
|
39
41
|
#maxConcurrentLoads;
|
|
40
42
|
#pageResources = new Map();
|
|
41
43
|
#queuedLoads = [];
|
|
42
44
|
#loadOverride;
|
|
43
|
-
constructor(loadOverride, maxConcurrentLoads) {
|
|
45
|
+
constructor(targetManager, settings, userAgentProvider, loadOverride, maxConcurrentLoads = 500) {
|
|
44
46
|
super();
|
|
47
|
+
this.#targetManager = targetManager;
|
|
48
|
+
this.#settings = settings;
|
|
49
|
+
this.#userAgentProvider = userAgentProvider;
|
|
45
50
|
this.#maxConcurrentLoads = maxConcurrentLoads;
|
|
46
|
-
|
|
51
|
+
this.#targetManager.addModelListener(ResourceTreeModel, ResourceTreeModelEvents.PrimaryPageChanged, this.onPrimaryPageChanged, this);
|
|
47
52
|
this.#loadOverride = loadOverride;
|
|
48
53
|
}
|
|
49
|
-
static instance({ forceNew, loadOverride, maxConcurrentLoads } = {
|
|
54
|
+
static instance({ forceNew, targetManager, settings, userAgentProvider, loadOverride, maxConcurrentLoads } = {
|
|
50
55
|
forceNew: false,
|
|
51
56
|
loadOverride: null,
|
|
52
|
-
maxConcurrentLoads: 500,
|
|
53
57
|
}) {
|
|
54
|
-
if (
|
|
55
|
-
|
|
58
|
+
if (forceNew) {
|
|
59
|
+
Root.DevToolsContext.globalInstance().set(PageResourceLoader, new PageResourceLoader(targetManager ?? TargetManager.instance(), settings ?? Common.Settings.Settings.instance(), userAgentProvider ?? MultitargetNetworkManager.instance(), loadOverride, maxConcurrentLoads));
|
|
56
60
|
}
|
|
57
|
-
return
|
|
61
|
+
return Root.DevToolsContext.globalInstance().get(PageResourceLoader);
|
|
58
62
|
}
|
|
59
63
|
static removeInstance() {
|
|
60
|
-
|
|
64
|
+
Root.DevToolsContext.globalInstance().delete(PageResourceLoader);
|
|
61
65
|
}
|
|
62
66
|
onPrimaryPageChanged(event) {
|
|
63
67
|
const { frame: mainFrame, type } = event.data;
|
|
@@ -85,7 +89,7 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper {
|
|
|
85
89
|
return this.#pageResources;
|
|
86
90
|
}
|
|
87
91
|
getScopedResourcesLoaded() {
|
|
88
|
-
return new Map([...this.#pageResources].filter(([_, pageResource]) =>
|
|
92
|
+
return new Map([...this.#pageResources].filter(([_, pageResource]) => this.#targetManager.isInScope(pageResource.initiator.target) ||
|
|
89
93
|
isExtensionInitiator(pageResource.initiator)));
|
|
90
94
|
}
|
|
91
95
|
/**
|
|
@@ -97,11 +101,10 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper {
|
|
|
97
101
|
return { loading: this.#currentlyLoading, queued: this.#queuedLoads.length, resources: this.#pageResources.size };
|
|
98
102
|
}
|
|
99
103
|
getScopedNumberOfResources() {
|
|
100
|
-
const targetManager = TargetManager.instance();
|
|
101
104
|
let loadingCount = 0;
|
|
102
105
|
for (const [targetId, count] of this.#currentlyLoadingPerTarget) {
|
|
103
|
-
const target = targetManager.targetById(targetId);
|
|
104
|
-
if (targetManager.isInScope(target)) {
|
|
106
|
+
const target = this.#targetManager.targetById(targetId);
|
|
107
|
+
if (this.#targetManager.isInScope(target)) {
|
|
105
108
|
loadingCount += count;
|
|
106
109
|
}
|
|
107
110
|
}
|
|
@@ -197,22 +200,15 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper {
|
|
|
197
200
|
return await this.#loadOverride(url);
|
|
198
201
|
}
|
|
199
202
|
const parsedURL = new Common.ParsedURL.ParsedURL(url);
|
|
200
|
-
const eligibleForLoadFromTarget = getLoadThroughTargetSetting().get() && parsedURL &&
|
|
201
|
-
parsedURL.scheme !== 'data' && parsedURL.scheme !== 'devtools'
|
|
203
|
+
const eligibleForLoadFromTarget = this.getLoadThroughTargetSetting().get() && parsedURL &&
|
|
204
|
+
parsedURL.scheme !== 'file' && parsedURL.scheme !== 'data' && parsedURL.scheme !== 'devtools' &&
|
|
205
|
+
initiator.target;
|
|
202
206
|
Host.userMetrics.developerResourceScheme(this.getDeveloperResourceScheme(parsedURL));
|
|
203
207
|
if (eligibleForLoadFromTarget) {
|
|
204
208
|
try {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
return result;
|
|
209
|
-
}
|
|
210
|
-
const frame = FrameManager.instance().getFrame(initiator.frameId);
|
|
211
|
-
if (frame) {
|
|
212
|
-
Host.userMetrics.developerResourceLoaded(1 /* Host.UserMetrics.DeveloperResourceLoaded.LOAD_THROUGH_PAGE_VIA_FRAME */);
|
|
213
|
-
const result = await this.loadFromTarget(frame.resourceTreeModel().target(), initiator.frameId, url, isBinary);
|
|
214
|
-
return result;
|
|
215
|
-
}
|
|
209
|
+
Host.userMetrics.developerResourceLoaded(0 /* Host.UserMetrics.DeveloperResourceLoaded.LOAD_THROUGH_PAGE_VIA_TARGET */);
|
|
210
|
+
const result = await this.loadFromTarget(initiator.target, initiator.frameId, url, isBinary);
|
|
211
|
+
return result;
|
|
216
212
|
}
|
|
217
213
|
catch (e) {
|
|
218
214
|
if (e instanceof Error) {
|
|
@@ -229,12 +225,12 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper {
|
|
|
229
225
|
Host.userMetrics.developerResourceLoaded(3 /* Host.UserMetrics.DeveloperResourceLoaded.LOAD_THROUGH_PAGE_FALLBACK */);
|
|
230
226
|
}
|
|
231
227
|
else {
|
|
232
|
-
const code = getLoadThroughTargetSetting().get() ?
|
|
228
|
+
const code = this.getLoadThroughTargetSetting().get() ?
|
|
233
229
|
6 /* Host.UserMetrics.DeveloperResourceLoaded.FALLBACK_PER_PROTOCOL */ :
|
|
234
230
|
5 /* Host.UserMetrics.DeveloperResourceLoaded.FALLBACK_PER_OVERRIDE */;
|
|
235
231
|
Host.userMetrics.developerResourceLoaded(code);
|
|
236
232
|
}
|
|
237
|
-
const result = await
|
|
233
|
+
const result = await this.loadFromHostBindings(url);
|
|
238
234
|
if (eligibleForLoadFromTarget && !result.success) {
|
|
239
235
|
Host.userMetrics.developerResourceLoaded(7 /* Host.UserMetrics.DeveloperResourceLoaded.FALLBACK_FAILURE */);
|
|
240
236
|
}
|
|
@@ -269,7 +265,7 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper {
|
|
|
269
265
|
async loadFromTarget(target, frameId, url, isBinary) {
|
|
270
266
|
const networkManager = target.model(NetworkManager);
|
|
271
267
|
const ioModel = target.model(IOModel);
|
|
272
|
-
const disableCache =
|
|
268
|
+
const disableCache = this.#settings.moduleSetting('cache-disabled').get();
|
|
273
269
|
const resource = await networkManager.loadNetworkResource(frameId, url, { disableCache, includeCredentials: true });
|
|
274
270
|
try {
|
|
275
271
|
const content = resource.stream ?
|
|
@@ -294,7 +290,21 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper {
|
|
|
294
290
|
}
|
|
295
291
|
}
|
|
296
292
|
}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
293
|
+
async loadFromHostBindings(url) {
|
|
294
|
+
const headers = {};
|
|
295
|
+
const currentUserAgent = this.#userAgentProvider.currentUserAgent();
|
|
296
|
+
if (currentUserAgent) {
|
|
297
|
+
headers['User-Agent'] = currentUserAgent;
|
|
298
|
+
}
|
|
299
|
+
if (this.#settings.moduleSetting('cache-disabled').get()) {
|
|
300
|
+
headers['Cache-Control'] = 'no-cache';
|
|
301
|
+
}
|
|
302
|
+
const allowRemoteFilePaths = this.#settings.moduleSetting('network.enable-remote-file-loading').get();
|
|
303
|
+
return await new Promise(resolve => Host.ResourceLoader.load(url, headers, (success, _responseHeaders, content, errorDescription) => {
|
|
304
|
+
resolve({ success, content, errorDescription });
|
|
305
|
+
}, allowRemoteFilePaths));
|
|
306
|
+
}
|
|
307
|
+
getLoadThroughTargetSetting() {
|
|
308
|
+
return this.#settings.createSetting('load-through-target', true);
|
|
309
|
+
}
|
|
300
310
|
}
|
|
@@ -6,11 +6,13 @@ import { assertNotNullOrUndefined } from '../platform/platform.js';
|
|
|
6
6
|
import { Events as ResourceTreeModelEvents, ResourceTreeModel, } from './ResourceTreeModel.js';
|
|
7
7
|
import { SDKModel } from './SDKModel.js';
|
|
8
8
|
import { TargetManager } from './TargetManager.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Holds preloading related information.
|
|
11
|
+
*
|
|
12
|
+
* - SpeculationRule rule sets
|
|
13
|
+
* - Preloading attempts
|
|
14
|
+
* - Relationship between rule sets and preloading attempts
|
|
15
|
+
**/
|
|
14
16
|
export class PreloadingModel extends SDKModel {
|
|
15
17
|
agent;
|
|
16
18
|
loaderIds = [];
|
|
@@ -23,7 +25,7 @@ export class PreloadingModel extends SDKModel {
|
|
|
23
25
|
this.agent = target.preloadAgent();
|
|
24
26
|
void this.agent.invoke_enable();
|
|
25
27
|
const targetInfo = target.targetInfo();
|
|
26
|
-
if (targetInfo
|
|
28
|
+
if (targetInfo?.subtype === 'prerender') {
|
|
27
29
|
this.lastPrimaryPageModel = TargetManager.instance().primaryPageTarget()?.model(PreloadingModel) || null;
|
|
28
30
|
}
|
|
29
31
|
TargetManager.instance().addModelListener(ResourceTreeModel, ResourceTreeModelEvents.PrimaryPageChanged, this.onPrimaryPageChanged, this);
|
|
@@ -226,15 +228,33 @@ export class PreloadingModel extends SDKModel {
|
|
|
226
228
|
onPrerenderStatusUpdated(event) {
|
|
227
229
|
const loaderId = event.key.loaderId;
|
|
228
230
|
this.ensureDocumentPreloadingData(loaderId);
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
231
|
+
let attempt;
|
|
232
|
+
switch (event.key.action) {
|
|
233
|
+
case "Prerender" /* Protocol.Preload.SpeculationAction.Prerender */:
|
|
234
|
+
attempt = {
|
|
235
|
+
action: event.key.action,
|
|
236
|
+
key: event.key,
|
|
237
|
+
pipelineId: event.pipelineId,
|
|
238
|
+
status: convertPreloadingStatus(event.status),
|
|
239
|
+
prerenderStatus: event.prerenderStatus || null,
|
|
240
|
+
disallowedMojoInterface: event.disallowedMojoInterface || null,
|
|
241
|
+
mismatchedHeaders: event.mismatchedHeaders || null,
|
|
242
|
+
};
|
|
243
|
+
break;
|
|
244
|
+
case "PrerenderUntilScript" /* Protocol.Preload.SpeculationAction.PrerenderUntilScript */:
|
|
245
|
+
attempt = {
|
|
246
|
+
action: event.key.action,
|
|
247
|
+
key: event.key,
|
|
248
|
+
pipelineId: event.pipelineId,
|
|
249
|
+
status: convertPreloadingStatus(event.status),
|
|
250
|
+
prerenderStatus: event.prerenderStatus || null,
|
|
251
|
+
disallowedMojoInterface: event.disallowedMojoInterface || null,
|
|
252
|
+
mismatchedHeaders: event.mismatchedHeaders || null,
|
|
253
|
+
};
|
|
254
|
+
break;
|
|
255
|
+
default:
|
|
256
|
+
throw new Error(`unreachable: event.key.action: ${event.key.action}`);
|
|
257
|
+
}
|
|
238
258
|
this.documents.get(loaderId)?.preloadingAttempts.upsert(attempt);
|
|
239
259
|
this.dispatchEventToListeners("ModelUpdated" /* Events.MODEL_UPDATED */);
|
|
240
260
|
}
|
|
@@ -333,6 +353,9 @@ function makePreloadingAttemptId(key) {
|
|
|
333
353
|
case "Prerender" /* Protocol.Preload.SpeculationAction.Prerender */:
|
|
334
354
|
action = 'Prerender';
|
|
335
355
|
break;
|
|
356
|
+
case "PrerenderUntilScript" /* Protocol.Preload.SpeculationAction.PrerenderUntilScript */:
|
|
357
|
+
action = 'PrerenderUntilScript';
|
|
358
|
+
break;
|
|
336
359
|
}
|
|
337
360
|
let targetHint;
|
|
338
361
|
switch (key.targetHint) {
|
|
@@ -364,7 +387,7 @@ export class PreloadPipeline {
|
|
|
364
387
|
return new PreloadPipeline(inner);
|
|
365
388
|
}
|
|
366
389
|
getOriginallyTriggered() {
|
|
367
|
-
const attempt = this.getPrerender() || this.getPrefetch();
|
|
390
|
+
const attempt = this.getPrerender() || this.getPrerenderUntilScript() || this.getPrefetch();
|
|
368
391
|
assertNotNullOrUndefined(attempt);
|
|
369
392
|
return attempt;
|
|
370
393
|
}
|
|
@@ -374,7 +397,10 @@ export class PreloadPipeline {
|
|
|
374
397
|
getPrerender() {
|
|
375
398
|
return this.inner.get("Prerender" /* Protocol.Preload.SpeculationAction.Prerender */) || null;
|
|
376
399
|
}
|
|
377
|
-
|
|
400
|
+
getPrerenderUntilScript() {
|
|
401
|
+
return this.inner.get("PrerenderUntilScript" /* Protocol.Preload.SpeculationAction.PrerenderUntilScript */) || null;
|
|
402
|
+
}
|
|
403
|
+
// Returns attempts in the order: prefetch < prerender_until_script < prerender.
|
|
378
404
|
// Currently unused.
|
|
379
405
|
getAttempts() {
|
|
380
406
|
const ret = [];
|
|
@@ -386,6 +412,10 @@ export class PreloadPipeline {
|
|
|
386
412
|
if (prerender !== null) {
|
|
387
413
|
ret.push(prerender);
|
|
388
414
|
}
|
|
415
|
+
const prerenderUntilScript = this.getPrerenderUntilScript();
|
|
416
|
+
if (prerenderUntilScript !== null) {
|
|
417
|
+
ret.push(prerenderUntilScript);
|
|
418
|
+
}
|
|
389
419
|
if (ret.length === 0) {
|
|
390
420
|
throw new Error('unreachable');
|
|
391
421
|
}
|
|
@@ -412,7 +442,9 @@ class PreloadingAttemptRegistry {
|
|
|
412
442
|
//
|
|
413
443
|
// In some cases, browsers automatically triggers preloads. For example, Chrome triggers prefetch
|
|
414
444
|
// ahead of prerender to prevent multiple fetches in case that the prerender failed due to, e.g.
|
|
415
|
-
// use of forbidden mojo APIs.
|
|
445
|
+
// use of forbidden mojo APIs. Also, a prerender-until-script attempt triggers prefetch as well,
|
|
446
|
+
// and can upgrade to prerender. Such prefetch, prerender-until-script, and prerender sit in the
|
|
447
|
+
// same preload pipeline.
|
|
416
448
|
//
|
|
417
449
|
// We regard them as not representative and only show the representative ones to represent
|
|
418
450
|
// pipelines.
|
|
@@ -421,8 +453,10 @@ class PreloadingAttemptRegistry {
|
|
|
421
453
|
switch (action) {
|
|
422
454
|
case "Prefetch" /* Protocol.Preload.SpeculationAction.Prefetch */:
|
|
423
455
|
return 0;
|
|
424
|
-
case "
|
|
456
|
+
case "PrerenderUntilScript" /* Protocol.Preload.SpeculationAction.PrerenderUntilScript */:
|
|
425
457
|
return 1;
|
|
458
|
+
case "Prerender" /* Protocol.Preload.SpeculationAction.Prerender */:
|
|
459
|
+
return 2;
|
|
426
460
|
}
|
|
427
461
|
}
|
|
428
462
|
// Attempt with status `NOT_TRIGGERED` is a representative of a pipeline.
|
|
@@ -525,6 +559,17 @@ class PreloadingAttemptRegistry {
|
|
|
525
559
|
mismatchedHeaders: null,
|
|
526
560
|
};
|
|
527
561
|
break;
|
|
562
|
+
case "PrerenderUntilScript" /* Protocol.Preload.SpeculationAction.PrerenderUntilScript */:
|
|
563
|
+
attempt = {
|
|
564
|
+
action: "PrerenderUntilScript" /* Protocol.Preload.SpeculationAction.PrerenderUntilScript */,
|
|
565
|
+
key,
|
|
566
|
+
pipelineId: null,
|
|
567
|
+
status: "NotTriggered" /* PreloadingStatus.NOT_TRIGGERED */,
|
|
568
|
+
prerenderStatus: null,
|
|
569
|
+
disallowedMojoInterface: null,
|
|
570
|
+
mismatchedHeaders: null,
|
|
571
|
+
};
|
|
572
|
+
break;
|
|
528
573
|
}
|
|
529
574
|
this.map.set(id, attempt);
|
|
530
575
|
}
|
package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RehydratingConnection.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
import * as Common from '../common/common.js';
|
|
5
5
|
import * as i18n from '../i18n/i18n.js';
|
|
6
|
+
import * as Root from '../root/root.js';
|
|
6
7
|
import * as EnhancedTraces from './EnhancedTracesParser.js';
|
|
7
8
|
import { TraceObject } from './TraceObject.js';
|
|
8
9
|
const UIStrings = {
|
|
@@ -21,28 +22,52 @@ const UIStrings = {
|
|
|
21
22
|
};
|
|
22
23
|
const str_ = i18n.i18n.registerUIStrings('core/sdk/RehydratingConnection.ts', UIStrings);
|
|
23
24
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
24
|
-
export class
|
|
25
|
+
export class RehydratingConnectionTransport {
|
|
25
26
|
rehydratingConnectionState = 1 /* RehydratingConnectionState.UNINITIALIZED */;
|
|
26
27
|
onDisconnect = null;
|
|
27
28
|
onMessage = null;
|
|
28
29
|
trace = null;
|
|
29
30
|
sessions = new Map();
|
|
30
31
|
#onConnectionLost;
|
|
31
|
-
#rehydratingWindow;
|
|
32
|
+
#rehydratingWindow = window;
|
|
32
33
|
#onReceiveHostWindowPayloadBound = this.onReceiveHostWindowPayload.bind(this);
|
|
33
34
|
constructor(onConnectionLost) {
|
|
34
|
-
// If we're invoking this class, we're in the rehydrating pop-up window. Rename window for clarity.
|
|
35
35
|
this.#onConnectionLost = onConnectionLost;
|
|
36
|
-
this.#
|
|
37
|
-
|
|
36
|
+
if (!this.#maybeHandleLoadingFromUrl()) {
|
|
37
|
+
this.#setupMessagePassing();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Returns true if found a trace URL. */
|
|
41
|
+
#maybeHandleLoadingFromUrl() {
|
|
42
|
+
let traceUrl = Root.Runtime.Runtime.queryParam('traceURL');
|
|
43
|
+
if (!traceUrl) {
|
|
44
|
+
// For compatibility, handle the older loadTimelineFromURL.
|
|
45
|
+
const timelineUrl = Root.Runtime.Runtime.queryParam('loadTimelineFromURL');
|
|
46
|
+
if (timelineUrl) {
|
|
47
|
+
// It was double-URI encoded for some reason.
|
|
48
|
+
traceUrl = decodeURIComponent(timelineUrl);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (traceUrl) {
|
|
52
|
+
void fetch(traceUrl).then(r => r.arrayBuffer()).then(b => Common.Gzip.arrayBufferToString(b)).then(traceJson => {
|
|
53
|
+
const trace = new TraceObject(JSON.parse(traceJson));
|
|
54
|
+
void this.startHydration(trace);
|
|
55
|
+
});
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
38
59
|
}
|
|
39
60
|
#setupMessagePassing() {
|
|
40
61
|
this.#rehydratingWindow.addEventListener('message', this.#onReceiveHostWindowPayloadBound);
|
|
41
|
-
if (
|
|
62
|
+
if (this.#rehydratingWindow.opener) {
|
|
63
|
+
this.#rehydratingWindow.opener.postMessage({ type: 'REHYDRATING_WINDOW_READY' });
|
|
64
|
+
}
|
|
65
|
+
else if (this.#rehydratingWindow !== window.top) {
|
|
66
|
+
this.#rehydratingWindow.parent.postMessage({ type: 'REHYDRATING_IFRAME_READY' }, '*');
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
42
69
|
this.#onConnectionLost(i18nString(UIStrings.noHostWindow));
|
|
43
|
-
return;
|
|
44
70
|
}
|
|
45
|
-
this.#rehydratingWindow.opener.postMessage({ type: 'REHYDRATING_WINDOW_READY' });
|
|
46
71
|
}
|
|
47
72
|
/**
|
|
48
73
|
* This is a callback for rehydrated session to receive payload from host window. Payload includes but not limited to
|
|
@@ -83,6 +108,7 @@ export class RehydratingConnection {
|
|
|
83
108
|
const target = hydratingDataPerTarget.target;
|
|
84
109
|
const executionContexts = hydratingDataPerTarget.executionContexts;
|
|
85
110
|
const scripts = hydratingDataPerTarget.scripts;
|
|
111
|
+
const resources = hydratingDataPerTarget.resources;
|
|
86
112
|
this.postToFrontend({
|
|
87
113
|
method: 'Target.targetCreated',
|
|
88
114
|
params: {
|
|
@@ -97,7 +123,7 @@ export class RehydratingConnection {
|
|
|
97
123
|
},
|
|
98
124
|
});
|
|
99
125
|
sessionId += 1;
|
|
100
|
-
const session = new RehydratingSession(sessionId, target, executionContexts, scripts, this);
|
|
126
|
+
const session = new RehydratingSession(sessionId, target, executionContexts, scripts, resources, this);
|
|
101
127
|
this.sessions.set(sessionId, session);
|
|
102
128
|
session.declareSessionAttachedToTarget();
|
|
103
129
|
}
|
|
@@ -157,14 +183,18 @@ export class RehydratingConnection {
|
|
|
157
183
|
return Promise.reject();
|
|
158
184
|
}
|
|
159
185
|
}
|
|
160
|
-
|
|
186
|
+
/** Default rehydrating session with default responses. **/
|
|
161
187
|
class RehydratingSessionBase {
|
|
162
188
|
connection = null;
|
|
163
189
|
constructor(connection) {
|
|
164
190
|
this.connection = connection;
|
|
165
191
|
}
|
|
166
192
|
sendMessageToFrontend(payload) {
|
|
167
|
-
|
|
193
|
+
// The frontend doesn't expect CDP responses within the same synchronous event loop, so it breaks unexpectedly.
|
|
194
|
+
// Any async boundary will do, so we use setTimeout.
|
|
195
|
+
setTimeout(() => {
|
|
196
|
+
this.connection?.postToFrontend(payload);
|
|
197
|
+
});
|
|
168
198
|
}
|
|
169
199
|
handleFrontendMessageAsFakeCDPAgent(data) {
|
|
170
200
|
// Send default response in default session.
|
|
@@ -179,12 +209,14 @@ export class RehydratingSession extends RehydratingSessionBase {
|
|
|
179
209
|
target;
|
|
180
210
|
executionContexts = [];
|
|
181
211
|
scripts = [];
|
|
182
|
-
|
|
212
|
+
resources = [];
|
|
213
|
+
constructor(sessionId, target, executionContexts, scripts, resources, connection) {
|
|
183
214
|
super(connection);
|
|
184
215
|
this.sessionId = sessionId;
|
|
185
216
|
this.target = target;
|
|
186
217
|
this.executionContexts = executionContexts;
|
|
187
218
|
this.scripts = scripts;
|
|
219
|
+
this.resources = resources;
|
|
188
220
|
}
|
|
189
221
|
sendMessageToFrontend(payload, attachSessionId = true) {
|
|
190
222
|
// Attach the session's Id to the message.
|
|
@@ -201,12 +233,31 @@ export class RehydratingSession extends RehydratingSessionBase {
|
|
|
201
233
|
case 'Debugger.enable':
|
|
202
234
|
this.handleDebuggerEnable(data.id);
|
|
203
235
|
break;
|
|
236
|
+
case 'CSS.enable':
|
|
237
|
+
this.sendMessageToFrontend({
|
|
238
|
+
id: data.id,
|
|
239
|
+
result: {},
|
|
240
|
+
});
|
|
241
|
+
break;
|
|
204
242
|
case 'Debugger.getScriptSource':
|
|
205
243
|
if (data.params) {
|
|
206
244
|
const params = data.params;
|
|
207
245
|
this.handleDebuggerGetScriptSource(data.id, params.scriptId);
|
|
208
246
|
}
|
|
209
247
|
break;
|
|
248
|
+
case 'Page.getResourceTree':
|
|
249
|
+
this.handleGetResourceTree(data.id);
|
|
250
|
+
break;
|
|
251
|
+
case 'Page.getResourceContent': {
|
|
252
|
+
const request = data.params;
|
|
253
|
+
this.handleGetResourceContent(request.frameId, request.url, data.id);
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
case 'CSS.getStyleSheetText': {
|
|
257
|
+
const request = data.params;
|
|
258
|
+
this.handleGetStyleSheetText(request.styleSheetId, data.id);
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
210
261
|
default:
|
|
211
262
|
this.sendMessageToFrontend({
|
|
212
263
|
id: data.id,
|
|
@@ -269,7 +320,20 @@ export class RehydratingSession extends RehydratingSessionBase {
|
|
|
269
320
|
// script parsed event to communicate the current script state and respond with a mock
|
|
270
321
|
// debugger id.
|
|
271
322
|
handleDebuggerEnable(id) {
|
|
323
|
+
const htmlResourceUrls = new Set(this.resources.filter(r => r.mimeType === 'text/html').map(r => r.url));
|
|
272
324
|
for (const script of this.scripts) {
|
|
325
|
+
// Handle inline scripts.
|
|
326
|
+
if (htmlResourceUrls.has(script.url)) {
|
|
327
|
+
script.embedderName = script.url;
|
|
328
|
+
// We don't have the actual embedded offset from this trace event. Non-zero
|
|
329
|
+
// values are important though: that is what `Script.isInlineScript()`
|
|
330
|
+
// checks. Otherwise these scripts would try to show individually within the
|
|
331
|
+
// Sources panel.
|
|
332
|
+
script.startColumn = 1;
|
|
333
|
+
script.startLine = 1;
|
|
334
|
+
script.endColumn = 1;
|
|
335
|
+
script.endLine = 1;
|
|
336
|
+
}
|
|
273
337
|
this.sendMessageToFrontend({
|
|
274
338
|
method: 'Debugger.scriptParsed',
|
|
275
339
|
params: script,
|
|
@@ -283,4 +347,67 @@ export class RehydratingSession extends RehydratingSessionBase {
|
|
|
283
347
|
},
|
|
284
348
|
});
|
|
285
349
|
}
|
|
350
|
+
handleGetResourceTree(id) {
|
|
351
|
+
const resources = this.resources.filter(r => r.mimeType === 'text/html' || r.mimeType === 'text/css');
|
|
352
|
+
if (!resources.length) {
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
const frameTree = {
|
|
356
|
+
frame: {
|
|
357
|
+
id: this.target.targetId,
|
|
358
|
+
url: this.target.url,
|
|
359
|
+
},
|
|
360
|
+
childFrames: [],
|
|
361
|
+
resources: resources.map(r => ({
|
|
362
|
+
url: r.url,
|
|
363
|
+
type: r.mimeType === 'text/html' ? 'Document' : 'Stylesheet',
|
|
364
|
+
mimeType: r.mimeType,
|
|
365
|
+
contentSize: r.content.length,
|
|
366
|
+
})),
|
|
367
|
+
};
|
|
368
|
+
this.sendMessageToFrontend({
|
|
369
|
+
id,
|
|
370
|
+
result: {
|
|
371
|
+
frameTree,
|
|
372
|
+
},
|
|
373
|
+
});
|
|
374
|
+
const stylesheets = this.resources.filter(r => r.mimeType === 'text/css');
|
|
375
|
+
for (const stylesheet of stylesheets) {
|
|
376
|
+
this.sendMessageToFrontend({
|
|
377
|
+
method: 'CSS.styleSheetAdded',
|
|
378
|
+
params: {
|
|
379
|
+
header: {
|
|
380
|
+
styleSheetId: `sheet.${stylesheet.frame}.${stylesheet.url}`,
|
|
381
|
+
frameId: stylesheet.frame,
|
|
382
|
+
sourceURL: stylesheet.url,
|
|
383
|
+
},
|
|
384
|
+
},
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
handleGetResourceContent(frame, url, id) {
|
|
389
|
+
const resource = this.resources.find(r => r.frame === frame && r.url === url);
|
|
390
|
+
if (!resource) {
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
this.sendMessageToFrontend({
|
|
394
|
+
id,
|
|
395
|
+
result: {
|
|
396
|
+
content: resource.content,
|
|
397
|
+
base64Encoded: false,
|
|
398
|
+
},
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
handleGetStyleSheetText(stylesheetId, id) {
|
|
402
|
+
const resource = this.resources.find(r => `sheet.${r.frame}.${r.url}` === stylesheetId);
|
|
403
|
+
if (!resource) {
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
this.sendMessageToFrontend({
|
|
407
|
+
id,
|
|
408
|
+
result: {
|
|
409
|
+
text: resource.content,
|
|
410
|
+
},
|
|
411
|
+
});
|
|
412
|
+
}
|
|
286
413
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright 2009 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
|
-
|
|
4
|
+
/** This cannot be an interface due to "instanceof RemoteObject" checks in the code. **/
|
|
5
5
|
export class RemoteObject {
|
|
6
6
|
static fromLocalObject(value) {
|
|
7
7
|
return new LocalJSONObject(value);
|
|
@@ -665,6 +665,9 @@ export class LocalJSONObject extends RemoteObject {
|
|
|
665
665
|
if (this.#value instanceof Date) {
|
|
666
666
|
return 'date';
|
|
667
667
|
}
|
|
668
|
+
if (this.#value instanceof Error) {
|
|
669
|
+
return 'error';
|
|
670
|
+
}
|
|
668
671
|
return undefined;
|
|
669
672
|
}
|
|
670
673
|
get hasChildren() {
|
|
@@ -764,7 +767,7 @@ export class RemoteArray {
|
|
|
764
767
|
this.#object = object;
|
|
765
768
|
}
|
|
766
769
|
static objectAsArray(object) {
|
|
767
|
-
if (
|
|
770
|
+
if (object?.type !== 'object' || (object.subtype !== 'array' && object.subtype !== 'typedarray')) {
|
|
768
771
|
throw new Error('Object is empty or not an array');
|
|
769
772
|
}
|
|
770
773
|
return new RemoteArray(object);
|