chrome-ai-bridge 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Base64.js +20 -2
  2. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Gzip.js +11 -0
  3. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Object.js +6 -1
  4. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ParsedURL.js +3 -0
  5. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/ResourceType.js +6 -0
  6. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Settings.js +18 -8
  7. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostStub.js +3 -3
  8. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/ResourceLoader.js +1 -1
  9. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +17 -1
  10. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/ArrayUtilities.js +10 -0
  11. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/StringUtilities.js +63 -12
  12. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/CDPConnection.js +1 -0
  13. package/build/node_modules/chrome-devtools-frontend/front_end/core/protocol_client/InspectorBackend.js +4 -1
  14. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +44 -9
  15. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMetadata.js +6 -6
  16. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSModel.js +1 -1
  17. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMModel.js +169 -12
  18. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DebuggerModel.js +2 -1
  19. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/IsolateManager.js +6 -0
  20. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +18 -4
  21. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +7 -21
  22. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/OverlayModel.js +17 -5
  23. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RehydratingConnection.js +5 -1
  24. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ResourceTreeModel.js +8 -5
  25. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMap.js +14 -2
  26. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapManager.js +1 -1
  27. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopesInfo.js +11 -4
  28. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Target.js +3 -1
  29. package/build/node_modules/chrome-devtools-frontend/front_end/generated/ARIAProperties.js +1 -1
  30. package/build/node_modules/chrome-devtools-frontend/front_end/generated/Deprecation.js +1 -16
  31. package/build/node_modules/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +35 -14
  32. package/build/node_modules/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +197 -101
  33. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.js +2 -1
  34. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.js +10 -16
  35. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.js +97 -26
  36. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AICallTree.js +35 -0
  37. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CompilerScriptMapping.js +5 -3
  38. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/DebuggerWorkspaceBinding.js +7 -3
  39. package/build/node_modules/chrome-devtools-frontend/front_end/models/emulation/DeviceModeModel.js +1 -1
  40. package/build/node_modules/chrome-devtools-frontend/front_end/models/emulation/EmulatedDevices.js +14 -0
  41. package/build/node_modules/chrome-devtools-frontend/front_end/models/formatter/FormatterWorkerPool.js +8 -5
  42. package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceImpl.js +70 -1
  43. package/build/node_modules/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceModel.js +82 -30
  44. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/EventsSerializer.js +7 -2
  45. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/LanternComputationData.js +2 -2
  46. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Processor.js +18 -19
  47. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/Styles.js +12 -4
  48. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/Initiators.js +46 -0
  49. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/TraceTree.js +4 -3
  50. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/extras/extras.js +1 -0
  51. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LargestImagePaintHandler.js +2 -2
  52. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/LayoutShiftsHandler.js +1 -1
  53. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/MetaHandler.js +6 -0
  54. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/NetworkRequestsHandler.js +10 -1
  55. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/PageLoadMetricsHandler.js +44 -27
  56. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Timing.js +9 -2
  57. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/Common.js +1 -6
  58. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPBreakdown.js +2 -2
  59. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/LCPDiscovery.js +2 -4
  60. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/NetworkDependencyTree.js +3 -2
  61. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/insights/RenderBlocking.js +1 -1
  62. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/types/TraceEvents.js +30 -11
  63. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js +28 -13
  64. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js +1 -1
  65. package/build/node_modules/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/scopes.js +4 -0
  66. package/build/src/tools/chatgpt-web.js +102 -64
  67. package/build/src/tools/gemini-web.js +43 -16
  68. package/build/src/tools/pages.js +0 -1
  69. package/package.json +1 -1
@@ -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 class DOMNode {
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
- constructor(target, backendNodeId, nodeType, nodeName) {
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,11 +1084,16 @@ 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
  }
@@ -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
  }
@@ -785,7 +785,8 @@ export class DebuggerModel extends SDKModel {
785
785
  */
786
786
  async *iterateAsyncParents(stackTraceOrPausedDetails) {
787
787
  // We make `DebuggerPausedDetails` look like a stack trace. We are only interested in `parent` and `parentId` in any case.
788
- let stackTrace = stackTraceOrPausedDetails instanceof DebuggerPausedDetails ?
788
+ const isPausedDetails = (details) => !('parent' in details) && !('parentId' in details);
789
+ let stackTrace = isPausedDetails(stackTraceOrPausedDetails) ?
789
790
  {
790
791
  callFrames: [],
791
792
  parent: stackTraceOrPausedDetails.asyncStackTrace,
@@ -35,6 +35,12 @@ export class IsolateManager extends Common.ObjectWrapper.ObjectWrapper {
35
35
  observer.isolateAdded(isolate);
36
36
  }
37
37
  }
38
+ unobserveIsolates(observer) {
39
+ this.#observers.delete(observer);
40
+ if (!this.#observers.size) {
41
+ this.#pollId++;
42
+ }
43
+ }
38
44
  modelAdded(model) {
39
45
  void this.#modelAdded(model);
40
46
  }
@@ -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;
@@ -1268,6 +1276,12 @@ export class NetworkDispatcher {
1268
1276
  reportingApiEndpointsChangedForOrigin(data) {
1269
1277
  this.#manager.dispatchEventToListeners(Events.ReportingApiEndpointsChangedForOrigin, data);
1270
1278
  }
1279
+ deviceBoundSessionsAdded(_params) {
1280
+ this.#manager.dispatchEventToListeners(Events.DeviceBoundSessionsAdded, _params.sessions);
1281
+ }
1282
+ deviceBoundSessionEventOccurred(_params) {
1283
+ this.#manager.dispatchEventToListeners(Events.DeviceBoundSessionEventOccurred, _params);
1284
+ }
1271
1285
  policyUpdated() {
1272
1286
  }
1273
1287
  /**
@@ -1536,9 +1550,9 @@ export class RequestConditions extends Common.ObjectWrapper.ObjectWrapper {
1536
1550
  matchedNetworkConditions.push({ ruleIds, urlPattern, conditions });
1537
1551
  }
1538
1552
  }
1539
- if (globalConditions) {
1540
- matchedNetworkConditions.push({ conditions: globalConditions });
1541
- }
1553
+ }
1554
+ if (globalConditions) {
1555
+ matchedNetworkConditions.push({ conditions: globalConditions });
1542
1556
  }
1543
1557
  const promises = [];
1544
1558
  for (const agent of agents) {
@@ -70,10 +70,6 @@ const UIStrings = {
70
70
  * @description Tooltip to explain why a cookie was blocked due to Schemeful Same-Site
71
71
  */
72
72
  schemefulSameSiteUnspecifiedTreatedAsLax: 'This cookie didn\'t specify a "`SameSite`" attribute when it was stored, was defaulted to "`SameSite=Lax"`, and was blocked because the request was cross-site and was not initiated by a top-level navigation. This request is considered cross-site because the URL has a different scheme than the current site.',
73
- /**
74
- * @description Tooltip to explain why a cookie was blocked due to SameParty
75
- */
76
- samePartyFromCrossPartyContext: 'This cookie was blocked because it had the "`SameParty`" attribute but the request was cross-party. The request was considered cross-party because the domain of the resource\'s URL and the domains of the resource\'s enclosing frames/documents are neither owners nor members in the same First-Party Set.',
77
73
  /**
78
74
  * @description Tooltip to explain why a cookie was blocked due to exceeding the maximum size
79
75
  */
@@ -111,14 +107,6 @@ const UIStrings = {
111
107
  * @description Tooltip to explain why a cookie was blocked due to Schemeful Same-Site
112
108
  */
113
109
  thisSetcookieDidntSpecifyASamesite: 'This `Set-Cookie` header didn\'t specify a "`SameSite`" attribute, was defaulted to "`SameSite=Lax"`, and was blocked because it came from a cross-site response which was not the response to a top-level navigation. This response is considered cross-site because the URL has a different scheme than the current site.',
114
- /**
115
- * @description Tooltip to explain why a cookie was blocked due to SameParty
116
- */
117
- thisSetcookieWasBlockedBecauseItHadTheSameparty: 'This attempt to set a cookie via a `Set-Cookie` header was blocked because it had the "`SameParty`" attribute but the request was cross-party. The request was considered cross-party because the domain of the resource\'s URL and the domains of the resource\'s enclosing frames/documents are neither owners nor members in the same First-Party Set.',
118
- /**
119
- * @description Tooltip to explain why a cookie was blocked due to SameParty
120
- */
121
- thisSetcookieWasBlockedBecauseItHadTheSamepartyAttribute: 'This attempt to set a cookie via a `Set-Cookie` header was blocked because it had the "`SameParty`" attribute but also had other conflicting attributes. Chrome requires cookies that use the "`SameParty`" attribute to also have the "Secure" attribute, and to not be restricted to "`SameSite=Strict`".',
122
110
  /**
123
111
  * @description Tooltip to explain why an attempt to set a cookie via a `Set-Cookie` HTTP header on a request's response was blocked.
124
112
  */
@@ -214,6 +202,7 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
214
202
  #startTime = -1;
215
203
  #endTime = -1;
216
204
  #blockedReason = undefined;
205
+ #renderBlockingBehavior;
217
206
  #corsErrorStatus = undefined;
218
207
  statusCode = 0;
219
208
  statusText = '';
@@ -533,6 +522,12 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper {
533
522
  setBlockedReason(reason) {
534
523
  this.#blockedReason = reason;
535
524
  }
525
+ setRenderBlockingBehavior(renderBlocking) {
526
+ this.#renderBlockingBehavior = renderBlocking;
527
+ }
528
+ renderBlockingBehavior() {
529
+ return this.#renderBlockingBehavior;
530
+ }
536
531
  corsErrorStatus() {
537
532
  return this.#corsErrorStatus;
538
533
  }
@@ -1521,8 +1516,6 @@ export const cookieBlockedReasonToUiString = function (blockedReason) {
1521
1516
  return i18nString(UIStrings.schemefulSameSiteLax);
1522
1517
  case "SchemefulSameSiteUnspecifiedTreatedAsLax" /* Protocol.Network.CookieBlockedReason.SchemefulSameSiteUnspecifiedTreatedAsLax */:
1523
1518
  return i18nString(UIStrings.schemefulSameSiteUnspecifiedTreatedAsLax);
1524
- case "SamePartyFromCrossPartyContext" /* Protocol.Network.CookieBlockedReason.SamePartyFromCrossPartyContext */:
1525
- return i18nString(UIStrings.samePartyFromCrossPartyContext);
1526
1519
  case "NameValuePairExceedsMaxSize" /* Protocol.Network.CookieBlockedReason.NameValuePairExceedsMaxSize */:
1527
1520
  return i18nString(UIStrings.nameValuePairExceedsMaxSize);
1528
1521
  case "ThirdPartyPhaseout" /* Protocol.Network.CookieBlockedReason.ThirdPartyPhaseout */:
@@ -1566,10 +1559,6 @@ export const setCookieBlockedReasonToUiString = function (blockedReason) {
1566
1559
  return i18nString(UIStrings.thisSetcookieWasBlockedBecauseItHadTheSamesiteStrictLax, { PH1: 'SameSite=Lax' });
1567
1560
  case "SchemefulSameSiteUnspecifiedTreatedAsLax" /* Protocol.Network.SetCookieBlockedReason.SchemefulSameSiteUnspecifiedTreatedAsLax */:
1568
1561
  return i18nString(UIStrings.thisSetcookieDidntSpecifyASamesite);
1569
- case "SamePartyFromCrossPartyContext" /* Protocol.Network.SetCookieBlockedReason.SamePartyFromCrossPartyContext */:
1570
- return i18nString(UIStrings.thisSetcookieWasBlockedBecauseItHadTheSameparty);
1571
- case "SamePartyConflictsWithOtherAttributes" /* Protocol.Network.SetCookieBlockedReason.SamePartyConflictsWithOtherAttributes */:
1572
- return i18nString(UIStrings.thisSetcookieWasBlockedBecauseItHadTheSamepartyAttribute);
1573
1562
  case "NameValuePairExceedsMaxSize" /* Protocol.Network.SetCookieBlockedReason.NameValuePairExceedsMaxSize */:
1574
1563
  return i18nString(UIStrings.thisSetcookieWasBlockedBecauseTheNameValuePairExceedsMaxSize);
1575
1564
  case "DisallowedCharacter" /* Protocol.Network.SetCookieBlockedReason.DisallowedCharacter */:
@@ -1595,7 +1584,6 @@ export const cookieBlockedReasonToAttribute = function (blockedReason) {
1595
1584
  case "SchemefulSameSiteLax" /* Protocol.Network.CookieBlockedReason.SchemefulSameSiteLax */:
1596
1585
  case "SchemefulSameSiteUnspecifiedTreatedAsLax" /* Protocol.Network.CookieBlockedReason.SchemefulSameSiteUnspecifiedTreatedAsLax */:
1597
1586
  return "same-site" /* Attribute.SAME_SITE */;
1598
- case "SamePartyFromCrossPartyContext" /* Protocol.Network.CookieBlockedReason.SamePartyFromCrossPartyContext */:
1599
1587
  case "NameValuePairExceedsMaxSize" /* Protocol.Network.CookieBlockedReason.NameValuePairExceedsMaxSize */:
1600
1588
  case "UserPreferences" /* Protocol.Network.CookieBlockedReason.UserPreferences */:
1601
1589
  case "ThirdPartyPhaseout" /* Protocol.Network.CookieBlockedReason.ThirdPartyPhaseout */:
@@ -1621,8 +1609,6 @@ export const setCookieBlockedReasonToAttribute = function (blockedReason) {
1621
1609
  return "domain" /* Attribute.DOMAIN */;
1622
1610
  case "InvalidPrefix" /* Protocol.Network.SetCookieBlockedReason.InvalidPrefix */:
1623
1611
  return "name" /* Attribute.NAME */;
1624
- case "SamePartyConflictsWithOtherAttributes" /* Protocol.Network.SetCookieBlockedReason.SamePartyConflictsWithOtherAttributes */:
1625
- case "SamePartyFromCrossPartyContext" /* Protocol.Network.SetCookieBlockedReason.SamePartyFromCrossPartyContext */:
1626
1612
  case "NameValuePairExceedsMaxSize" /* Protocol.Network.SetCookieBlockedReason.NameValuePairExceedsMaxSize */:
1627
1613
  case "UserPreferences" /* Protocol.Network.SetCookieBlockedReason.UserPreferences */:
1628
1614
  case "ThirdPartyPhaseout" /* Protocol.Network.SetCookieBlockedReason.ThirdPartyPhaseout */:
@@ -5,7 +5,7 @@ import * as Common from '../common/common.js';
5
5
  import * as i18n from '../i18n/i18n.js';
6
6
  import * as Root from '../root/root.js';
7
7
  import { DebuggerModel, Events as DebuggerModelEvents } from './DebuggerModel.js';
8
- import { DeferredDOMNode, DOMModel, Events as DOMModelEvents } from './DOMModel.js';
8
+ import { DeferredDOMNode, DOMModel, DOMNodeEvents, Events as DOMModelEvents } from './DOMModel.js';
9
9
  import { OverlayPersistentHighlighter } from './OverlayPersistentHighlighter.js';
10
10
  import { SDKModel } from './SDKModel.js';
11
11
  import { TargetManager } from './TargetManager.js';
@@ -72,10 +72,22 @@ export class OverlayModel extends SDKModel {
72
72
  void this.wireAgentToSettings();
73
73
  }
74
74
  this.#persistentHighlighter = new OverlayPersistentHighlighter(this, {
75
- onGridOverlayStateChanged: ({ nodeId, enabled }) => this.dispatchEventToListeners("PersistentGridOverlayStateChanged" /* Events.PERSISTENT_GRID_OVERLAY_STATE_CHANGED */, { nodeId, enabled }),
76
- onFlexOverlayStateChanged: ({ nodeId, enabled }) => this.dispatchEventToListeners("PersistentFlexContainerOverlayStateChanged" /* Events.PERSISTENT_FLEX_CONTAINER_OVERLAY_STATE_CHANGED */, { nodeId, enabled }),
77
- onContainerQueryOverlayStateChanged: ({ nodeId, enabled }) => this.dispatchEventToListeners("PersistentContainerQueryOverlayStateChanged" /* Events.PERSISTENT_CONTAINER_QUERY_OVERLAY_STATE_CHANGED */, { nodeId, enabled }),
78
- onScrollSnapOverlayStateChanged: ({ nodeId, enabled }) => this.dispatchEventToListeners("PersistentScrollSnapOverlayStateChanged" /* Events.PERSISTENT_SCROLL_SNAP_OVERLAY_STATE_CHANGED */, { nodeId, enabled }),
75
+ onGridOverlayStateChanged: ({ nodeId, enabled }) => {
76
+ this.#domModel.nodeForId(nodeId)?.dispatchEventToListeners(DOMNodeEvents.GRID_OVERLAY_STATE_CHANGED, { enabled });
77
+ this.dispatchEventToListeners("PersistentGridOverlayStateChanged" /* Events.PERSISTENT_GRID_OVERLAY_STATE_CHANGED */, { nodeId, enabled });
78
+ },
79
+ onFlexOverlayStateChanged: ({ nodeId, enabled }) => {
80
+ this.#domModel.nodeForId(nodeId)?.dispatchEventToListeners(DOMNodeEvents.FLEX_CONTAINER_OVERLAY_STATE_CHANGED, { enabled });
81
+ this.dispatchEventToListeners("PersistentFlexContainerOverlayStateChanged" /* Events.PERSISTENT_FLEX_CONTAINER_OVERLAY_STATE_CHANGED */, { nodeId, enabled });
82
+ },
83
+ onContainerQueryOverlayStateChanged: ({ nodeId, enabled }) => {
84
+ this.#domModel.nodeForId(nodeId)?.dispatchEventToListeners(DOMNodeEvents.CONTAINER_QUERY_OVERLAY_STATE_CHANGED, { enabled });
85
+ this.dispatchEventToListeners("PersistentContainerQueryOverlayStateChanged" /* Events.PERSISTENT_CONTAINER_QUERY_OVERLAY_STATE_CHANGED */, { nodeId, enabled });
86
+ },
87
+ onScrollSnapOverlayStateChanged: ({ nodeId, enabled }) => {
88
+ this.#domModel.nodeForId(nodeId)?.dispatchEventToListeners(DOMNodeEvents.SCROLL_SNAP_OVERLAY_STATE_CHANGED, { enabled });
89
+ this.dispatchEventToListeners("PersistentScrollSnapOverlayStateChanged" /* Events.PERSISTENT_SCROLL_SNAP_OVERLAY_STATE_CHANGED */, { nodeId, enabled });
90
+ },
79
91
  });
80
92
  this.#domModel.addEventListener(DOMModelEvents.NodeRemoved, () => {
81
93
  if (!this.#persistentHighlighter) {
@@ -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 ProtocolClient from '../protocol_client/protocol_client.js';
6
7
  import * as Root from '../root/root.js';
7
8
  import * as EnhancedTraces from './EnhancedTracesParser.js';
8
9
  import { TraceObject } from './TraceObject.js';
@@ -261,7 +262,10 @@ export class RehydratingSession extends RehydratingSessionBase {
261
262
  default:
262
263
  this.sendMessageToFrontend({
263
264
  id: data.id,
264
- result: {},
265
+ error: {
266
+ message: `Command ${data.method} not implemented in RehydratingSession.`,
267
+ code: ProtocolClient.CDPConnection.CDPErrorStatus.DEVTOOLS_STUB_ERROR,
268
+ }
265
269
  });
266
270
  break;
267
271
  }
@@ -86,7 +86,6 @@ export class ResourceTreeModel extends SDKModel {
86
86
  if (!this.framesInternal.has(frameId)) {
87
87
  return null;
88
88
  }
89
- // TODO(crbug.com/445966299): Refactor to use `storageAgent().invoke_getStorageKey()` instead.
90
89
  const response = await this.storageAgent.invoke_getStorageKey({ frameId });
91
90
  if (response.getError() === 'Frame tree node for given frame not found') {
92
91
  return null;
@@ -198,10 +197,13 @@ export class ResourceTreeModel extends SDKModel {
198
197
  documentOpened(framePayload) {
199
198
  this.frameNavigated(framePayload, undefined);
200
199
  const frame = this.framesInternal.get(framePayload.id);
201
- if (frame && !frame.getResourcesMap().get(framePayload.url)) {
202
- const frameResource = this.createResourceFromFramePayload(framePayload, framePayload.url, Common.ResourceType.resourceTypes.Document, framePayload.mimeType, null, null);
203
- frameResource.isGenerated = true;
204
- frame.addResource(frameResource);
200
+ if (frame) {
201
+ this.dispatchEventToListeners(Events.DocumentOpened, frame);
202
+ if (!frame.getResourcesMap().get(framePayload.url)) {
203
+ const frameResource = this.createResourceFromFramePayload(framePayload, framePayload.url, Common.ResourceType.resourceTypes.Document, framePayload.mimeType, null, null);
204
+ frameResource.isGenerated = true;
205
+ frame.addResource(frameResource);
206
+ }
205
207
  }
206
208
  }
207
209
  frameDetached(frameId, isSwap) {
@@ -480,6 +482,7 @@ export var Events;
480
482
  Events["FrameDetached"] = "FrameDetached";
481
483
  Events["FrameResized"] = "FrameResized";
482
484
  Events["FrameWillNavigate"] = "FrameWillNavigate";
485
+ Events["DocumentOpened"] = "DocumentOpened";
483
486
  Events["PrimaryPageChanged"] = "PrimaryPageChanged";
484
487
  Events["ResourceAdded"] = "ResourceAdded";
485
488
  Events["WillLoadCachedResources"] = "WillLoadCachedResources";