chrome-devtools-frontend 1.0.1559913 → 1.0.1561080

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 (130) hide show
  1. package/front_end/core/host/InspectorFrontendHostStub.ts +0 -3
  2. package/front_end/core/platform/ArrayUtilities.ts +13 -0
  3. package/front_end/core/root/Runtime.ts +0 -5
  4. package/front_end/core/sdk/DOMModel.ts +8 -0
  5. package/front_end/core/sdk/NetworkManager.ts +4 -0
  6. package/front_end/core/sdk/NetworkRequest.ts +9 -0
  7. package/front_end/core/sdk/OverlayModel.ts +20 -9
  8. package/front_end/entrypoints/main/MainImpl.ts +2 -1
  9. package/front_end/generated/InspectorBackendCommands.ts +4 -2
  10. package/front_end/generated/protocol-mapping.d.ts +7 -0
  11. package/front_end/generated/protocol-proxy-api.d.ts +5 -0
  12. package/front_end/generated/protocol.ts +24 -0
  13. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +23 -22
  14. package/front_end/models/badges/UserBadges.ts +48 -16
  15. package/front_end/models/greendev/Prototypes.ts +6 -1
  16. package/front_end/models/trace/extras/TraceTree.ts +1 -1
  17. package/front_end/models/trace/handlers/PageLoadMetricsHandler.ts +8 -3
  18. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +11 -142
  19. package/front_end/panels/ai_assistance/PatchWidget.ts +90 -72
  20. package/front_end/panels/ai_assistance/ai_assistance.ts +1 -0
  21. package/front_end/panels/ai_assistance/components/ChatInput.ts +701 -0
  22. package/front_end/panels/ai_assistance/components/ChatView.ts +71 -1268
  23. package/front_end/panels/ai_assistance/components/UserActionRow.ts +514 -31
  24. package/front_end/panels/ai_assistance/components/chatInput.css +387 -0
  25. package/front_end/panels/ai_assistance/components/chatView.css +38 -599
  26. package/front_end/panels/ai_assistance/components/userActionRow.css +230 -0
  27. package/front_end/panels/autofill/AutofillView.ts +2 -2
  28. package/front_end/panels/changes/ChangesView.ts +15 -1
  29. package/front_end/panels/changes/changesView.css +6 -0
  30. package/front_end/panels/common/BadgeNotification.ts +44 -58
  31. package/front_end/panels/common/CopyChangesToPrompt.ts +233 -0
  32. package/front_end/panels/common/common.ts +1 -0
  33. package/front_end/panels/elements/ElementsTreeElement.ts +183 -359
  34. package/front_end/panels/elements/ElementsTreeOutline.ts +0 -6
  35. package/front_end/panels/elements/ShortcutTreeElement.ts +57 -50
  36. package/front_end/panels/elements/StylePropertiesSection.ts +1 -3
  37. package/front_end/panels/elements/components/AdornerManager.ts +5 -149
  38. package/front_end/panels/issues/HiddenIssuesRow.ts +1 -2
  39. package/front_end/panels/issues/IssueKindView.ts +2 -4
  40. package/front_end/panels/issues/IssueView.ts +2 -4
  41. package/front_end/panels/network/NetworkDataGridNode.ts +65 -1
  42. package/front_end/panels/network/NetworkLogView.ts +2 -4
  43. package/front_end/panels/network/NetworkLogViewColumns.ts +9 -0
  44. package/front_end/panels/screencast/ScreencastApp.ts +1 -0
  45. package/front_end/panels/settings/SettingsScreen.ts +3 -2
  46. package/front_end/panels/timeline/CompatibilityTracksAppender.ts +14 -1
  47. package/front_end/panels/timeline/ThirdPartyTreeView.ts +1 -4
  48. package/front_end/panels/timeline/TimelineController.ts +185 -3
  49. package/front_end/panels/timeline/TimelineFlameChartDataProvider.ts +52 -25
  50. package/front_end/panels/timeline/TimelineFlameChartView.ts +1 -0
  51. package/front_end/panels/timeline/TimelinePanel.ts +17 -104
  52. package/front_end/panels/timeline/TimelineTreeView.ts +1 -0
  53. package/front_end/panels/timeline/components/insights/BaseInsightComponent.ts +2 -2
  54. package/front_end/panels/timeline/components/insights/Table.ts +3 -3
  55. package/front_end/panels/whats_new/ReleaseNoteText.ts +15 -9
  56. package/front_end/panels/whats_new/resources/WNDT.md +6 -6
  57. package/front_end/third_party/chromium/README.chromium +1 -1
  58. package/front_end/third_party/codemirror.next/rebuild.sh +1 -1
  59. package/front_end/third_party/lit/rebuild.sh +1 -1
  60. package/front_end/third_party/puppeteer/README.chromium +2 -2
  61. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts +2 -3
  62. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.d.ts.map +1 -1
  63. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/api/Page.js.map +1 -1
  64. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPRequest.d.ts.map +1 -1
  65. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPRequest.js +9 -0
  66. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPRequest.js.map +1 -1
  67. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.d.ts +3 -0
  68. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
  69. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.js +9 -0
  70. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/HTTPResponse.js.map +1 -1
  71. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.d.ts +3 -0
  72. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.d.ts.map +1 -1
  73. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.js +10 -0
  74. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/bidi/core/Request.js.map +1 -1
  75. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.d.ts.map +1 -1
  76. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js +8 -4
  77. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/cdp/Browser.js.map +1 -1
  78. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts +1 -1
  79. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.d.ts.map +1 -1
  80. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js +1 -1
  81. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/generated/injected.js.map +1 -1
  82. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/injected/injected.d.ts +1 -1
  83. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +3 -3
  84. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +3 -3
  85. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js.map +1 -1
  86. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/Mutex.d.ts +2 -2
  87. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  88. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  89. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +10 -1
  90. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +13 -7
  91. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts +2 -3
  92. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.d.ts.map +1 -1
  93. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/api/Page.js.map +1 -1
  94. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPRequest.d.ts.map +1 -1
  95. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPRequest.js +9 -0
  96. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPRequest.js.map +1 -1
  97. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.d.ts +3 -0
  98. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
  99. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.js +9 -0
  100. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/HTTPResponse.js.map +1 -1
  101. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.d.ts +3 -0
  102. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.d.ts.map +1 -1
  103. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.js +10 -0
  104. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/bidi/core/Request.js.map +1 -1
  105. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.d.ts.map +1 -1
  106. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js +8 -4
  107. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/cdp/Browser.js.map +1 -1
  108. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.d.ts.map +1 -1
  110. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/generated/injected.js.map +1 -1
  112. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +3 -3
  113. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +3 -3
  114. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js.map +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  116. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/types.d.ts +10 -1
  118. package/front_end/third_party/puppeteer/package/package.json +3 -3
  119. package/front_end/third_party/puppeteer/package/src/api/Page.ts +2 -3
  120. package/front_end/third_party/puppeteer/package/src/bidi/HTTPRequest.ts +13 -0
  121. package/front_end/third_party/puppeteer/package/src/bidi/HTTPResponse.ts +10 -0
  122. package/front_end/third_party/puppeteer/package/src/bidi/core/Request.ts +15 -0
  123. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +9 -4
  124. package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
  125. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  126. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  127. package/front_end/ui/components/adorners/Adorner.ts +8 -68
  128. package/front_end/ui/legacy/TabbedPane.ts +1 -1
  129. package/front_end/ui/visual_logging/KnownContextValues.ts +3 -0
  130. package/package.json +2 -1
@@ -397,9 +397,6 @@ export class InspectorFrontendHostStub implements InspectorFrontendHostAPI {
397
397
  devToolsFlexibleLayout: {
398
398
  verticalDrawerEnabled: true,
399
399
  },
400
- devToolsStartingStyleDebugging: {
401
- enabled: false,
402
- },
403
400
  };
404
401
  if ('hostConfigForTesting' in globalThis) {
405
402
  const {hostConfigForTesting} = (globalThis as unknown as {hostConfigForTesting: Root.Runtime.HostConfig});
@@ -269,3 +269,16 @@ export function nearestIndexFromEnd<T>(arr: readonly T[], predicate: (arrayItem:
269
269
  export function arrayDoesNotContainNullOrUndefined<T>(arr: Array<T|null|undefined>): arr is T[] {
270
270
  return !arr.includes(null) && !arr.includes(undefined);
271
271
  }
272
+
273
+ export function assertArrayIsSorted<T>(arr: readonly T[], compareFn?: (a: T, b: T) => number): void {
274
+ const comparator = compareFn || (DEFAULT_COMPARATOR as unknown as (a: T, b: T) => number);
275
+
276
+ for (let i = 0; i < arr.length - 1; i++) {
277
+ const current = arr[i];
278
+ const next = arr[i + 1];
279
+
280
+ if (comparator(current, next) > 0) {
281
+ throw new Error(`Array is not sorted at index ${i}: ${JSON.stringify(current)} > ${JSON.stringify(next)}`);
282
+ }
283
+ }
284
+ }
@@ -505,10 +505,6 @@ interface DevToolsFlexibleLayout {
505
505
  verticalDrawerEnabled: boolean;
506
506
  }
507
507
 
508
- interface DevToolsStartingStyleDebugging {
509
- enabled: boolean;
510
- }
511
-
512
508
  interface AiPromptApi {
513
509
  enabled: boolean;
514
510
  allowWithoutGpu: boolean;
@@ -570,7 +566,6 @@ export type HostConfig = Platform.TypeScriptUtilities.RecursivePartial<{
570
566
  devToolsGdpProfilesAvailability: GdpProfilesAvailability,
571
567
  devToolsLiveEdit: LiveEdit,
572
568
  devToolsFlexibleLayout: DevToolsFlexibleLayout,
573
- devToolsStartingStyleDebugging: DevToolsStartingStyleDebugging,
574
569
  devToolsAiPromptApi: AiPromptApi,
575
570
  devToolsEnableDurableMessages: DevToolsEnableDurableMessages,
576
571
  devToolsAiAssistanceContextSelectionAgent: HostConfigAiAssistanceContextSelectionAgent,
@@ -111,11 +111,19 @@ export const ARIA_ATTRIBUTES = new Set<string>([
111
111
  export enum DOMNodeEvents {
112
112
  TOP_LAYER_INDEX_CHANGED = 'TopLayerIndexChanged',
113
113
  SCROLLABLE_FLAG_UPDATED = 'ScrollableFlagUpdated',
114
+ GRID_OVERLAY_STATE_CHANGED = 'GridOverlayStateChanged',
115
+ FLEX_CONTAINER_OVERLAY_STATE_CHANGED = 'FlexContainerOverlayStateChanged',
116
+ SCROLL_SNAP_OVERLAY_STATE_CHANGED = 'ScrollSnapOverlayStateChanged',
117
+ CONTAINER_QUERY_OVERLAY_STATE_CHANGED = 'ContainerQueryOverlayStateChanged',
114
118
  }
115
119
 
116
120
  export interface DOMNodeEventTypes {
117
121
  [DOMNodeEvents.TOP_LAYER_INDEX_CHANGED]: void;
118
122
  [DOMNodeEvents.SCROLLABLE_FLAG_UPDATED]: void;
123
+ [DOMNodeEvents.GRID_OVERLAY_STATE_CHANGED]: {enabled: boolean};
124
+ [DOMNodeEvents.FLEX_CONTAINER_OVERLAY_STATE_CHANGED]: {enabled: boolean};
125
+ [DOMNodeEvents.SCROLL_SNAP_OVERLAY_STATE_CHANGED]: {enabled: boolean};
126
+ [DOMNodeEvents.CONTAINER_QUERY_OVERLAY_STATE_CHANGED]: {enabled: boolean};
119
127
  }
120
128
 
121
129
  export class DOMNode extends Common.ObjectWrapper.ObjectWrapper<DOMNodeEventTypes> {
@@ -761,6 +761,7 @@ export class NetworkDispatcher implements ProtocolProxyApi.NetworkDispatcher {
761
761
  type,
762
762
  frameId,
763
763
  hasUserGesture,
764
+ renderBlockingBehavior,
764
765
  }: Protocol.Network.RequestWillBeSentEvent): void {
765
766
  let networkRequest = this.#requestsById.get(requestId);
766
767
  if (networkRequest) {
@@ -789,6 +790,9 @@ export class NetworkDispatcher implements ProtocolProxyApi.NetworkDispatcher {
789
790
  networkRequest = NetworkRequest.create(
790
791
  requestId, request.url as Platform.DevToolsPath.UrlString, documentURL as Platform.DevToolsPath.UrlString,
791
792
  frameId ?? null, loaderId, initiator, hasUserGesture);
793
+ if (renderBlockingBehavior) {
794
+ networkRequest.setRenderBlockingBehavior(renderBlockingBehavior);
795
+ }
792
796
  requestToManagerMap.set(networkRequest, this.#manager);
793
797
  }
794
798
  networkRequest.hasNetworkData = true;
@@ -225,6 +225,7 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper<EventType
225
225
  #startTime = -1;
226
226
  #endTime = -1;
227
227
  #blockedReason: Protocol.Network.BlockedReason|undefined = undefined;
228
+ #renderBlockingBehavior?: Protocol.Network.RenderBlockingBehavior;
228
229
  #corsErrorStatus: Protocol.Network.CorsErrorStatus|undefined = undefined;
229
230
  statusCode = 0;
230
231
  statusText = '';
@@ -661,6 +662,14 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper<EventType
661
662
  this.#blockedReason = reason;
662
663
  }
663
664
 
665
+ setRenderBlockingBehavior(renderBlocking: Protocol.Network.RenderBlockingBehavior): void {
666
+ this.#renderBlockingBehavior = renderBlocking;
667
+ }
668
+
669
+ renderBlockingBehavior(): Protocol.Network.RenderBlockingBehavior|undefined {
670
+ return this.#renderBlockingBehavior;
671
+ }
672
+
664
673
  corsErrorStatus(): Protocol.Network.CorsErrorStatus|undefined {
665
674
  return this.#corsErrorStatus;
666
675
  }
@@ -11,7 +11,7 @@ import * as Root from '../root/root.js';
11
11
 
12
12
  import type {CSSModel} from './CSSModel.js';
13
13
  import {DebuggerModel, Events as DebuggerModelEvents} from './DebuggerModel.js';
14
- import {DeferredDOMNode, DOMModel, type DOMNode, Events as DOMModelEvents} from './DOMModel.js';
14
+ import {DeferredDOMNode, DOMModel, type DOMNode, DOMNodeEvents, Events as DOMModelEvents} from './DOMModel.js';
15
15
  import {OverlayPersistentHighlighter} from './OverlayPersistentHighlighter.js';
16
16
  import type {RemoteObject} from './RemoteObject.js';
17
17
  import {SDKModel} from './SDKModel.js';
@@ -129,14 +129,25 @@ export class OverlayModel extends SDKModel<EventTypes> implements ProtocolProxyA
129
129
  }
130
130
 
131
131
  this.#persistentHighlighter = new OverlayPersistentHighlighter(this, {
132
- onGridOverlayStateChanged: ({nodeId, enabled}) =>
133
- this.dispatchEventToListeners(Events.PERSISTENT_GRID_OVERLAY_STATE_CHANGED, {nodeId, enabled}),
134
- onFlexOverlayStateChanged: ({nodeId, enabled}) =>
135
- this.dispatchEventToListeners(Events.PERSISTENT_FLEX_CONTAINER_OVERLAY_STATE_CHANGED, {nodeId, enabled}),
136
- onContainerQueryOverlayStateChanged: ({nodeId, enabled}) =>
137
- this.dispatchEventToListeners(Events.PERSISTENT_CONTAINER_QUERY_OVERLAY_STATE_CHANGED, {nodeId, enabled}),
138
- onScrollSnapOverlayStateChanged: ({nodeId, enabled}) =>
139
- this.dispatchEventToListeners(Events.PERSISTENT_SCROLL_SNAP_OVERLAY_STATE_CHANGED, {nodeId, enabled}),
132
+ onGridOverlayStateChanged: ({nodeId, enabled}) => {
133
+ this.#domModel.nodeForId(nodeId)?.dispatchEventToListeners(DOMNodeEvents.GRID_OVERLAY_STATE_CHANGED, {enabled});
134
+ this.dispatchEventToListeners(Events.PERSISTENT_GRID_OVERLAY_STATE_CHANGED, {nodeId, enabled});
135
+ },
136
+ onFlexOverlayStateChanged: ({nodeId, enabled}) => {
137
+ this.#domModel.nodeForId(nodeId)?.dispatchEventToListeners(
138
+ DOMNodeEvents.FLEX_CONTAINER_OVERLAY_STATE_CHANGED, {enabled});
139
+ this.dispatchEventToListeners(Events.PERSISTENT_FLEX_CONTAINER_OVERLAY_STATE_CHANGED, {nodeId, enabled});
140
+ },
141
+ onContainerQueryOverlayStateChanged: ({nodeId, enabled}) => {
142
+ this.#domModel.nodeForId(nodeId)?.dispatchEventToListeners(
143
+ DOMNodeEvents.CONTAINER_QUERY_OVERLAY_STATE_CHANGED, {enabled});
144
+ this.dispatchEventToListeners(Events.PERSISTENT_CONTAINER_QUERY_OVERLAY_STATE_CHANGED, {nodeId, enabled});
145
+ },
146
+ onScrollSnapOverlayStateChanged: ({nodeId, enabled}) => {
147
+ this.#domModel.nodeForId(nodeId)?.dispatchEventToListeners(
148
+ DOMNodeEvents.SCROLL_SNAP_OVERLAY_STATE_CHANGED, {enabled});
149
+ this.dispatchEventToListeners(Events.PERSISTENT_SCROLL_SNAP_OVERLAY_STATE_CHANGED, {nodeId, enabled});
150
+ },
140
151
  });
141
152
  this.#domModel.addEventListener(DOMModelEvents.NodeRemoved, () => {
142
153
  if (!this.#persistentHighlighter) {
@@ -550,7 +550,8 @@ export class MainImpl {
550
550
  Badges.UserBadges.instance().addEventListener(Badges.Events.BADGE_TRIGGERED, async ev => {
551
551
  loadedPanelCommonModule ??= await import('../../panels/common/common.js') as typeof PanelCommon;
552
552
  const badgeNotification = new loadedPanelCommonModule.BadgeNotification();
553
- void badgeNotification.present(ev.data);
553
+ const {badge, reason} = ev.data;
554
+ void badgeNotification.present(badge, reason);
554
555
  });
555
556
  }
556
557
 
@@ -762,6 +762,7 @@ inspectorBackend.registerEnum("Network.CookieSameSite", {Strict: "Strict", Lax:
762
762
  inspectorBackend.registerEnum("Network.CookiePriority", {Low: "Low", Medium: "Medium", High: "High"});
763
763
  inspectorBackend.registerEnum("Network.CookieSourceScheme", {Unset: "Unset", NonSecure: "NonSecure", Secure: "Secure"});
764
764
  inspectorBackend.registerEnum("Network.ResourcePriority", {VeryLow: "VeryLow", Low: "Low", Medium: "Medium", High: "High", VeryHigh: "VeryHigh"});
765
+ inspectorBackend.registerEnum("Network.RenderBlockingBehavior", {Blocking: "Blocking", InBodyParserBlocking: "InBodyParserBlocking", NonBlocking: "NonBlocking", NonBlockingDynamic: "NonBlockingDynamic", PotentiallyBlocking: "PotentiallyBlocking"});
765
766
  inspectorBackend.registerEnum("Network.RequestReferrerPolicy", {UnsafeUrl: "unsafe-url", NoReferrerWhenDowngrade: "no-referrer-when-downgrade", NoReferrer: "no-referrer", Origin: "origin", OriginWhenCrossOrigin: "origin-when-cross-origin", SameOrigin: "same-origin", StrictOrigin: "strict-origin", StrictOriginWhenCrossOrigin: "strict-origin-when-cross-origin"});
766
767
  inspectorBackend.registerEnum("Network.CertificateTransparencyCompliance", {Unknown: "unknown", NotCompliant: "not-compliant", Compliant: "compliant"});
767
768
  inspectorBackend.registerEnum("Network.BlockedReason", {Other: "other", Csp: "csp", MixedContent: "mixed-content", Origin: "origin", Inspector: "inspector", Integrity: "integrity", SubresourceFilter: "subresource-filter", ContentType: "content-type", CoepFrameResourceNeedsCoepHeader: "coep-frame-resource-needs-coep-header", CoopSandboxedIframeCannotNavigateToCoopPage: "coop-sandboxed-iframe-cannot-navigate-to-coop-page", CorpNotSameOrigin: "corp-not-same-origin", CorpNotSameOriginAfterDefaultedToSameOriginByCoep: "corp-not-same-origin-after-defaulted-to-same-origin-by-coep", CorpNotSameOriginAfterDefaultedToSameOriginByDip: "corp-not-same-origin-after-defaulted-to-same-origin-by-dip", CorpNotSameOriginAfterDefaultedToSameOriginByCoepAndDip: "corp-not-same-origin-after-defaulted-to-same-origin-by-coep-and-dip", CorpNotSameSite: "corp-not-same-site", SriMessageSignatureMismatch: "sri-message-signature-mismatch"});
@@ -793,7 +794,7 @@ inspectorBackend.registerEvent("Network.loadingFailed", ["requestId", "timestamp
793
794
  inspectorBackend.registerEvent("Network.loadingFinished", ["requestId", "timestamp", "encodedDataLength"]);
794
795
  inspectorBackend.registerEvent("Network.requestIntercepted", ["interceptionId", "request", "frameId", "resourceType", "isNavigationRequest", "isDownload", "redirectUrl", "authChallenge", "responseErrorReason", "responseStatusCode", "responseHeaders", "requestId"]);
795
796
  inspectorBackend.registerEvent("Network.requestServedFromCache", ["requestId"]);
796
- inspectorBackend.registerEvent("Network.requestWillBeSent", ["requestId", "loaderId", "documentURL", "request", "timestamp", "wallTime", "initiator", "redirectHasExtraInfo", "redirectResponse", "type", "frameId", "hasUserGesture"]);
797
+ inspectorBackend.registerEvent("Network.requestWillBeSent", ["requestId", "loaderId", "documentURL", "request", "timestamp", "wallTime", "initiator", "redirectHasExtraInfo", "redirectResponse", "type", "frameId", "hasUserGesture", "renderBlockingBehavior"]);
797
798
  inspectorBackend.registerEvent("Network.resourceChangedPriority", ["requestId", "newPriority", "timestamp"]);
798
799
  inspectorBackend.registerEvent("Network.signedExchangeReceived", ["requestId", "info"]);
799
800
  inspectorBackend.registerEvent("Network.responseReceived", ["requestId", "loaderId", "timestamp", "type", "response", "hasExtraInfo", "frameId"]);
@@ -985,7 +986,7 @@ inspectorBackend.registerEnum("Page.AdFrameExplanation", {ParentIsAd: "ParentIsA
985
986
  inspectorBackend.registerEnum("Page.SecureContextType", {Secure: "Secure", SecureLocalhost: "SecureLocalhost", InsecureScheme: "InsecureScheme", InsecureAncestor: "InsecureAncestor"});
986
987
  inspectorBackend.registerEnum("Page.CrossOriginIsolatedContextType", {Isolated: "Isolated", NotIsolated: "NotIsolated", NotIsolatedFeatureDisabled: "NotIsolatedFeatureDisabled"});
987
988
  inspectorBackend.registerEnum("Page.GatedAPIFeatures", {SharedArrayBuffers: "SharedArrayBuffers", SharedArrayBuffersTransferAllowed: "SharedArrayBuffersTransferAllowed", PerformanceMeasureMemory: "PerformanceMeasureMemory", PerformanceProfile: "PerformanceProfile"});
988
- inspectorBackend.registerEnum("Page.PermissionsPolicyFeature", {Accelerometer: "accelerometer", AllScreensCapture: "all-screens-capture", AmbientLightSensor: "ambient-light-sensor", AriaNotify: "aria-notify", AttributionReporting: "attribution-reporting", Autofill: "autofill", Autoplay: "autoplay", Bluetooth: "bluetooth", BrowsingTopics: "browsing-topics", Camera: "camera", CapturedSurfaceControl: "captured-surface-control", ChDpr: "ch-dpr", ChDeviceMemory: "ch-device-memory", ChDownlink: "ch-downlink", ChEct: "ch-ect", ChPrefersColorScheme: "ch-prefers-color-scheme", ChPrefersReducedMotion: "ch-prefers-reduced-motion", ChPrefersReducedTransparency: "ch-prefers-reduced-transparency", ChRtt: "ch-rtt", ChSaveData: "ch-save-data", ChUa: "ch-ua", ChUaArch: "ch-ua-arch", ChUaBitness: "ch-ua-bitness", ChUaHighEntropyValues: "ch-ua-high-entropy-values", ChUaPlatform: "ch-ua-platform", ChUaModel: "ch-ua-model", ChUaMobile: "ch-ua-mobile", ChUaFormFactors: "ch-ua-form-factors", ChUaFullVersion: "ch-ua-full-version", ChUaFullVersionList: "ch-ua-full-version-list", ChUaPlatformVersion: "ch-ua-platform-version", ChUaWow64: "ch-ua-wow64", ChViewportHeight: "ch-viewport-height", ChViewportWidth: "ch-viewport-width", ChWidth: "ch-width", ClipboardRead: "clipboard-read", ClipboardWrite: "clipboard-write", ComputePressure: "compute-pressure", ControlledFrame: "controlled-frame", CrossOriginIsolated: "cross-origin-isolated", DeferredFetch: "deferred-fetch", DeferredFetchMinimal: "deferred-fetch-minimal", DeviceAttributes: "device-attributes", DigitalCredentialsCreate: "digital-credentials-create", DigitalCredentialsGet: "digital-credentials-get", DirectSockets: "direct-sockets", DirectSocketsMulticast: "direct-sockets-multicast", DirectSocketsPrivate: "direct-sockets-private", DisplayCapture: "display-capture", DocumentDomain: "document-domain", EncryptedMedia: "encrypted-media", ExecutionWhileOutOfViewport: "execution-while-out-of-viewport", ExecutionWhileNotRendered: "execution-while-not-rendered", FencedUnpartitionedStorageRead: "fenced-unpartitioned-storage-read", FocusWithoutUserActivation: "focus-without-user-activation", Fullscreen: "fullscreen", Frobulate: "frobulate", Gamepad: "gamepad", Geolocation: "geolocation", Gyroscope: "gyroscope", Hid: "hid", IdentityCredentialsGet: "identity-credentials-get", IdleDetection: "idle-detection", InterestCohort: "interest-cohort", JoinAdInterestGroup: "join-ad-interest-group", KeyboardMap: "keyboard-map", LanguageDetector: "language-detector", LanguageModel: "language-model", LocalFonts: "local-fonts", LocalNetworkAccess: "local-network-access", Magnetometer: "magnetometer", ManualText: "manual-text", MediaPlaybackWhileNotVisible: "media-playback-while-not-visible", Microphone: "microphone", Midi: "midi", OnDeviceSpeechRecognition: "on-device-speech-recognition", OtpCredentials: "otp-credentials", Payment: "payment", PictureInPicture: "picture-in-picture", PrivateAggregation: "private-aggregation", PrivateStateTokenIssuance: "private-state-token-issuance", PrivateStateTokenRedemption: "private-state-token-redemption", PublickeyCredentialsCreate: "publickey-credentials-create", PublickeyCredentialsGet: "publickey-credentials-get", RecordAdAuctionEvents: "record-ad-auction-events", Rewriter: "rewriter", RunAdAuction: "run-ad-auction", ScreenWakeLock: "screen-wake-lock", Serial: "serial", SharedStorage: "shared-storage", SharedStorageSelectUrl: "shared-storage-select-url", SmartCard: "smart-card", SpeakerSelection: "speaker-selection", StorageAccess: "storage-access", SubApps: "sub-apps", Summarizer: "summarizer", SyncXhr: "sync-xhr", Translator: "translator", Unload: "unload", Usb: "usb", UsbUnrestricted: "usb-unrestricted", VerticalScroll: "vertical-scroll", WebAppInstallation: "web-app-installation", WebPrinting: "web-printing", WebShare: "web-share", WindowManagement: "window-management", Writer: "writer", XrSpatialTracking: "xr-spatial-tracking"});
989
+ inspectorBackend.registerEnum("Page.PermissionsPolicyFeature", {Accelerometer: "accelerometer", AllScreensCapture: "all-screens-capture", AmbientLightSensor: "ambient-light-sensor", AriaNotify: "aria-notify", AttributionReporting: "attribution-reporting", Autofill: "autofill", Autoplay: "autoplay", Bluetooth: "bluetooth", BrowsingTopics: "browsing-topics", Camera: "camera", CapturedSurfaceControl: "captured-surface-control", ChDpr: "ch-dpr", ChDeviceMemory: "ch-device-memory", ChDownlink: "ch-downlink", ChEct: "ch-ect", ChPrefersColorScheme: "ch-prefers-color-scheme", ChPrefersReducedMotion: "ch-prefers-reduced-motion", ChPrefersReducedTransparency: "ch-prefers-reduced-transparency", ChRtt: "ch-rtt", ChSaveData: "ch-save-data", ChUa: "ch-ua", ChUaArch: "ch-ua-arch", ChUaBitness: "ch-ua-bitness", ChUaHighEntropyValues: "ch-ua-high-entropy-values", ChUaPlatform: "ch-ua-platform", ChUaModel: "ch-ua-model", ChUaMobile: "ch-ua-mobile", ChUaFormFactors: "ch-ua-form-factors", ChUaFullVersion: "ch-ua-full-version", ChUaFullVersionList: "ch-ua-full-version-list", ChUaPlatformVersion: "ch-ua-platform-version", ChUaWow64: "ch-ua-wow64", ChViewportHeight: "ch-viewport-height", ChViewportWidth: "ch-viewport-width", ChWidth: "ch-width", ClipboardRead: "clipboard-read", ClipboardWrite: "clipboard-write", ComputePressure: "compute-pressure", ControlledFrame: "controlled-frame", CrossOriginIsolated: "cross-origin-isolated", DeferredFetch: "deferred-fetch", DeferredFetchMinimal: "deferred-fetch-minimal", DeviceAttributes: "device-attributes", DigitalCredentialsCreate: "digital-credentials-create", DigitalCredentialsGet: "digital-credentials-get", DirectSockets: "direct-sockets", DirectSocketsMulticast: "direct-sockets-multicast", DirectSocketsPrivate: "direct-sockets-private", DisplayCapture: "display-capture", DocumentDomain: "document-domain", EncryptedMedia: "encrypted-media", ExecutionWhileOutOfViewport: "execution-while-out-of-viewport", ExecutionWhileNotRendered: "execution-while-not-rendered", FencedUnpartitionedStorageRead: "fenced-unpartitioned-storage-read", FocusWithoutUserActivation: "focus-without-user-activation", Fullscreen: "fullscreen", Frobulate: "frobulate", Gamepad: "gamepad", Geolocation: "geolocation", Gyroscope: "gyroscope", Hid: "hid", IdentityCredentialsGet: "identity-credentials-get", IdleDetection: "idle-detection", InterestCohort: "interest-cohort", JoinAdInterestGroup: "join-ad-interest-group", KeyboardMap: "keyboard-map", LanguageDetector: "language-detector", LanguageModel: "language-model", LocalFonts: "local-fonts", LocalNetwork: "local-network", LocalNetworkAccess: "local-network-access", LoopbackNetwork: "loopback-network", Magnetometer: "magnetometer", ManualText: "manual-text", MediaPlaybackWhileNotVisible: "media-playback-while-not-visible", Microphone: "microphone", Midi: "midi", OnDeviceSpeechRecognition: "on-device-speech-recognition", OtpCredentials: "otp-credentials", Payment: "payment", PictureInPicture: "picture-in-picture", PrivateAggregation: "private-aggregation", PrivateStateTokenIssuance: "private-state-token-issuance", PrivateStateTokenRedemption: "private-state-token-redemption", PublickeyCredentialsCreate: "publickey-credentials-create", PublickeyCredentialsGet: "publickey-credentials-get", RecordAdAuctionEvents: "record-ad-auction-events", Rewriter: "rewriter", RunAdAuction: "run-ad-auction", ScreenWakeLock: "screen-wake-lock", Serial: "serial", SharedStorage: "shared-storage", SharedStorageSelectUrl: "shared-storage-select-url", SmartCard: "smart-card", SpeakerSelection: "speaker-selection", StorageAccess: "storage-access", SubApps: "sub-apps", Summarizer: "summarizer", SyncXhr: "sync-xhr", Translator: "translator", Unload: "unload", Usb: "usb", UsbUnrestricted: "usb-unrestricted", VerticalScroll: "vertical-scroll", WebAppInstallation: "web-app-installation", WebPrinting: "web-printing", WebShare: "web-share", WindowManagement: "window-management", Writer: "writer", XrSpatialTracking: "xr-spatial-tracking"});
989
990
  inspectorBackend.registerEnum("Page.PermissionsPolicyBlockReason", {Header: "Header", IframeAttribute: "IframeAttribute", InFencedFrameTree: "InFencedFrameTree", InIsolatedApp: "InIsolatedApp"});
990
991
  inspectorBackend.registerEnum("Page.OriginTrialTokenStatus", {Success: "Success", NotSupported: "NotSupported", Insecure: "Insecure", Expired: "Expired", WrongOrigin: "WrongOrigin", InvalidSignature: "InvalidSignature", Malformed: "Malformed", WrongVersion: "WrongVersion", FeatureDisabled: "FeatureDisabled", TokenDisabled: "TokenDisabled", FeatureDisabledForUser: "FeatureDisabledForUser", UnknownTrial: "UnknownTrial"});
991
992
  inspectorBackend.registerEnum("Page.OriginTrialStatus", {Enabled: "Enabled", ValidTokenNotProvided: "ValidTokenNotProvided", OSNotSupported: "OSNotSupported", TrialNotAllowed: "TrialNotAllowed"});
@@ -1380,6 +1381,7 @@ inspectorBackend.registerEvent("Tracing.dataCollected", ["value"]);
1380
1381
  inspectorBackend.registerEvent("Tracing.tracingComplete", ["dataLossOccurred", "stream", "traceFormat", "streamCompression"]);
1381
1382
  inspectorBackend.registerCommand("Tracing.end", [], [], "Stop trace events collection.");
1382
1383
  inspectorBackend.registerCommand("Tracing.getCategories", [], ["categories"], "Gets supported tracing categories.");
1384
+ inspectorBackend.registerCommand("Tracing.getTrackEventDescriptor", [], ["descriptor"], "Return a descriptor for all available tracing categories.");
1383
1385
  inspectorBackend.registerCommand("Tracing.recordClockSyncMarker", [{"name": "syncId", "type": "string", "optional": false, "description": "The ID of this clock sync marker", "typeRef": null}], [], "Record a clock sync marker in the trace.");
1384
1386
  inspectorBackend.registerCommand("Tracing.requestMemoryDump", [{"name": "deterministic", "type": "boolean", "optional": true, "description": "Enables more deterministic results by forcing garbage collection", "typeRef": null}, {"name": "levelOfDetail", "type": "string", "optional": true, "description": "Specifies level of details in memory dump. Defaults to \\\"detailed\\\".", "typeRef": "Tracing.MemoryDumpLevelOfDetail"}], ["dumpGuid", "success"], "Request a global memory dump.");
1385
1387
  inspectorBackend.registerEnum("Tracing.StartRequestTransferMode", {ReportEvents: "ReportEvents", ReturnAsStream: "ReturnAsStream"});
@@ -4889,6 +4889,13 @@ export namespace ProtocolMapping {
4889
4889
  paramsType: [];
4890
4890
  returnType: Protocol.Tracing.GetCategoriesResponse;
4891
4891
  };
4892
+ /**
4893
+ * Return a descriptor for all available tracing categories.
4894
+ */
4895
+ 'Tracing.getTrackEventDescriptor': {
4896
+ paramsType: [];
4897
+ returnType: Protocol.Tracing.GetTrackEventDescriptorResponse;
4898
+ };
4892
4899
  /**
4893
4900
  * Record a clock sync marker in the trace.
4894
4901
  */
@@ -4300,6 +4300,11 @@ declare namespace ProtocolProxyApi {
4300
4300
  */
4301
4301
  invoke_getCategories(): Promise<Protocol.Tracing.GetCategoriesResponse>;
4302
4302
 
4303
+ /**
4304
+ * Return a descriptor for all available tracing categories.
4305
+ */
4306
+ invoke_getTrackEventDescriptor(): Promise<Protocol.Tracing.GetTrackEventDescriptorResponse>;
4307
+
4303
4308
  /**
4304
4309
  * Record a clock sync marker in the trace.
4305
4310
  */
@@ -10001,6 +10001,17 @@ export namespace Network {
10001
10001
  VeryHigh = 'VeryHigh',
10002
10002
  }
10003
10003
 
10004
+ /**
10005
+ * The render blocking behavior of a resource request.
10006
+ */
10007
+ export const enum RenderBlockingBehavior {
10008
+ Blocking = 'Blocking',
10009
+ InBodyParserBlocking = 'InBodyParserBlocking',
10010
+ NonBlocking = 'NonBlocking',
10011
+ NonBlockingDynamic = 'NonBlockingDynamic',
10012
+ PotentiallyBlocking = 'PotentiallyBlocking',
10013
+ }
10014
+
10004
10015
  /**
10005
10016
  * Post data entry for HTTP request
10006
10017
  */
@@ -12156,6 +12167,10 @@ export namespace Network {
12156
12167
  * Whether the request is initiated by a user gesture. Defaults to false.
12157
12168
  */
12158
12169
  hasUserGesture?: boolean;
12170
+ /**
12171
+ * The render blocking behavior of the request.
12172
+ */
12173
+ renderBlockingBehavior?: RenderBlockingBehavior;
12159
12174
  }
12160
12175
 
12161
12176
  /**
@@ -13751,7 +13766,9 @@ export namespace Page {
13751
13766
  LanguageDetector = 'language-detector',
13752
13767
  LanguageModel = 'language-model',
13753
13768
  LocalFonts = 'local-fonts',
13769
+ LocalNetwork = 'local-network',
13754
13770
  LocalNetworkAccess = 'local-network-access',
13771
+ LoopbackNetwork = 'loopback-network',
13755
13772
  Magnetometer = 'magnetometer',
13756
13773
  ManualText = 'manual-text',
13757
13774
  MediaPlaybackWhileNotVisible = 'media-playback-while-not-visible',
@@ -18839,6 +18856,13 @@ export namespace Tracing {
18839
18856
  categories: string[];
18840
18857
  }
18841
18858
 
18859
+ export interface GetTrackEventDescriptorResponse extends ProtocolResponseWithError {
18860
+ /**
18861
+ * Base64-encoded serialized perfetto.protos.TrackEventDescriptor protobuf message.
18862
+ */
18863
+ descriptor: binary;
18864
+ }
18865
+
18842
18866
  export interface RecordClockSyncMarkerRequest {
18843
18867
  /**
18844
18868
  * The ID of this clock sync marker
@@ -374,17 +374,17 @@ This is the bottom-up summary for the entire trace. Only the top 20 activities (
374
374
  - self: 29 ms, total: 32 ms, source: clearTimeout
375
375
  - self: 27 ms, total: 50 ms, source: Parse HTML
376
376
  - self: 18 ms, total: 19 ms, source: aC (url: https://s.yimg.com/aaq/f10d509c/d1irmdsmbztlvx.js, line: 0, column: 19068)
377
- - self: 18 ms, total: 186 ms, source: (anonymous) (url: https://s.yimg.com/aaq/prebid/prebid-2.0.js, line: 5, column: 1)
378
377
  - self: 16 ms, total: 226 ms, source: Function call
379
- - self: 12 ms, total: 163 ms, source: (anonymous) (url: https://s.yimg.com/aaq/f10d509c/d1irmdsmbztlvx.js, line: 0, column: 0)
380
- - self: 12 ms, total: 83 ms, source: (anonymous) (url: https://cdn.taboola.com/libtrc/yahooweb-network/loader.js, line: 0, column: 9)
381
378
  - self: 11 ms, total: 12 ms, source: fetch
382
379
  - self: 11 ms, total: 12 ms, source: evaluate
383
380
  - self: 10 ms, total: 212 ms, source: Run microtasks
384
- - self: 9 ms, total: 19 ms, source: (anonymous) (url: https://s.yimg.com/du/ay/wnsrvbjmeprtfrnfx.js, line: 0, column: 0)
385
381
  - self: 9 ms, total: 10 ms, source: Minor GC
386
382
  - self: 8 ms, total: 226 ms, source: Evaluate script
387
- - self: 7 ms, total: 109 ms, source: n (url: https://s.yimg.com/aaq/prebid/prebid-2.0.js, line: 11, column: 4263)
383
+ - self: 7 ms, total: 7 ms, source: (anonymous) (url: https://s.yimg.com/du/ay/wnsrvbjmeprtfrnfx.js, line: 111, column: 4705)
384
+ - self: 7 ms, total: 9 ms, source: appendChild
385
+ - self: 6 ms, total: 8 ms, source: Ei (url: https://s.yimg.com/aaq/benji/benji-2.2.99.js, line: 0, column: 24493)
386
+ - self: 6 ms, total: 6 ms, source: Il (url: https://securepubads.g.doubleclick.net/pagead/managed/js/gpt/m202503250101/pubads_impl.js, line: 32, column: 58003)
387
+ - self: 5 ms, total: 7 ms, source: n (url: https://s.yimg.com/aaq/prebid/prebid-2.0.js, line: 11, column: 3881)
388
388
 
389
389
  # Third parties
390
390
 
@@ -970,28 +970,29 @@ Content:
970
970
  4;p-73704-775-2074-419;(anonymous);7.2;0.1;0;5;0;9
971
971
  5;p-73704-775-2075-420;(anonymous);7.1;;0;6;0;200
972
972
  6;p-73704-775-2075-421;(anonymous);7.1;2.6;0;7;0;231
973
- 7;p-73704-775-2095-422;(anonymous);4.5;1.3;0;8-19;0;292
974
- 8;p-73704-775-2095-423;(anonymous);0.5;0.1;0;19-21;0;756
973
+ 7;p-73704-775-2095-422;(anonymous);4.5;1.3;0;8-20;0;292
974
+ 8;p-73704-775-2095-423;(anonymous);0.1;0.1;0;;0;756
975
975
  9;p-73704-775-2097-424;Et;0.1;0.1;0;;0;10766
976
- 10;p-73704-775-2098-425;St;0.4;0.2;0;21;0;10904
976
+ 10;p-73704-775-2098-425;St;0.4;0.2;0;20;0;10904
977
977
  11;p-73704-775-2105-427;k;0.4;0.4;0;;0;5125
978
- 12;p-73704-775-2108-428;Go;0.1;;0;22;0;68523
979
- 13;p-73704-775-2109-430;Oi;0.4;0.2;0;23;0;38264
978
+ 12;p-73704-775-2108-428;Go;0.1;;0;21;0;68523
979
+ 13;p-73704-775-2109-430;Oi;0.4;0.2;0;22;0;38264
980
980
  14;p-73704-775-2115-432;tl;0.3;0.3;0;;0;154217
981
- 15;p-73704-775-2118-433;ul;0.6;0.5;0;24;0;155034
981
+ 15;p-73704-775-2118-433;ul;0.6;0.5;0;23;0;155034
982
982
  16;p-73704-775-2121-435;cl;0.1;0.1;0;;0;155107
983
- 17;p-73704-775-2123-436;hl;0.1;;0;25;0;155309
983
+ 17;p-73704-775-2123-436;hl;0.1;;0;24;0;155309
984
984
  18;p-73704-775-2124-439;sl;0.1;0.1;0;;0;154927
985
- 19;p-73704-775-2127-441;hl;0.1;0.1;0;;0;155309
986
- 20;p-73704-775-2128-442;registerService;0.2;;1;26-28;0;9441
987
- 21;p-73704-775-2099-426;vt;0.2;0.2;0;;0;10155
988
- 22;p-73704-775-2108-429;Mo;0.1;0.1;0;;0;66493
989
- 23;p-73704-775-2111-431;vi;0.1;0.1;0;;0;37138
990
- 24;p-73704-775-2118-434;ll;0.1;0.1;0;;0;155345
991
- 25;p-73704-775-2123-437;ll;0.1;;0;28;0;155345
992
- 26;p-73704-775-2128-443;u;0.1;0.1;1;;0;10091
993
- 27;p-73704-775-2129-444;d;0.1;0.1;1;;0;595
994
- 28;p-73704-775-2123-438;get prototype;0.1;0.1;;;;
985
+ 19;p-73704-775-2127-440;(anonymous);0.3;;0;25-27;0;161805
986
+ 20;p-73704-775-2099-426;vt;0.2;0.2;0;;0;10155
987
+ 21;p-73704-775-2108-429;Mo;0.1;0.1;0;;0;66493
988
+ 22;p-73704-775-2111-431;vi;0.1;0.1;0;;0;37138
989
+ 23;p-73704-775-2118-434;ll;0.1;0.1;0;;0;155345
990
+ 24;p-73704-775-2123-437;ll;0.1;;0;27;0;155345
991
+ 25;p-73704-775-2127-441;hl;0.1;0.1;0;;0;155309
992
+ 26;p-73704-775-2128-442;registerService;0.2;;1;28-30;0;9441
993
+ 27;p-73704-775-2123-438;get prototype;0.1;0.1;;;;
994
+ 28;p-73704-775-2128-443;u;0.1;0.1;1;;0;10091
995
+ 29;p-73704-775-2129-444;d;0.1;0.1;1;;0;595
995
996
 
996
997
  IMPORTANT: Never show eventKey to the user.
997
998
 
@@ -14,12 +14,18 @@ import {StarterBadge} from './StarterBadge.js';
14
14
 
15
15
  type BadgeClass = new (badgeContext: BadgeContext) => Badge;
16
16
 
17
+ export const enum BadgeTriggerReason {
18
+ AWARD = 'Award',
19
+ STARTER_BADGE_SETTINGS_NUDGE = 'StarterBadgeSettingsNudge',
20
+ STARTER_BADGE_PROFILE_NUDGE = 'StarterBadgeProfileNudge',
21
+ }
22
+
17
23
  export const enum Events {
18
24
  BADGE_TRIGGERED = 'BadgeTriggered',
19
25
  }
20
26
 
21
27
  export interface EventTypes {
22
- [Events.BADGE_TRIGGERED]: Badge;
28
+ [Events.BADGE_TRIGGERED]: {badge: Badge, reason: BadgeTriggerReason};
23
29
  }
24
30
 
25
31
  const SNOOZE_TIME_MS = 24 * 60 * 60 * 1000; // 24 hours
@@ -97,24 +103,50 @@ export class UserBadges extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
97
103
  this.#badgeActionEventTarget.dispatchEventToListeners(action);
98
104
  }
99
105
 
106
+ async #resolveBadgeTriggerReason(badge: Badge): Promise<BadgeTriggerReason|undefined> {
107
+ if (!badge.isStarterBadge) {
108
+ return BadgeTriggerReason.AWARD;
109
+ }
110
+
111
+ const getProfileResponse = await Host.GdpClient.GdpClient.instance().getProfile();
112
+ // The `getProfile` call failed and returned a `null`.
113
+ // For that case, we don't show anything.
114
+ if (!getProfileResponse) {
115
+ return;
116
+ }
117
+
118
+ const hasGdpProfile = Boolean(getProfileResponse.profile);
119
+ const receiveBadgesSettingEnabled = Boolean(this.#receiveBadgesSetting.get());
120
+
121
+ // If the user already has a GDP profile and the receive badges setting enabled,
122
+ // starter badge behaves as if it's an activity based badge.
123
+ if (hasGdpProfile && receiveBadgesSettingEnabled) {
124
+ return BadgeTriggerReason.AWARD;
125
+ }
126
+
127
+ if (this.#isStarterBadgeDismissed() || this.#isStarterBadgeSnoozed()) {
128
+ return;
129
+ }
130
+
131
+ // If the user already has a GDP profile and the receive badges setting disabled,
132
+ // starter badge behaves as a nudge for opting into receiving badges.
133
+ if (hasGdpProfile && !receiveBadgesSettingEnabled) {
134
+ return BadgeTriggerReason.STARTER_BADGE_SETTINGS_NUDGE;
135
+ }
136
+
137
+ // The user does not have a GDP profile, starter badge acts as a nudge for creating a GDP profile.
138
+ return BadgeTriggerReason.STARTER_BADGE_PROFILE_NUDGE;
139
+ }
140
+
100
141
  async #onTriggerBadge(badge: Badge, opts?: TriggerOptions): Promise<void> {
101
142
  const triggerTime = Date.now();
102
- let shouldAwardBadge = false;
103
- // By default, we award non-starter badges directly when they are triggered.
104
- if (!badge.isStarterBadge) {
105
- shouldAwardBadge = true;
106
- } else {
107
- const getProfileResponse = await Host.GdpClient.GdpClient.instance().getProfile();
108
- const receiveBadgesSettingEnabled = Boolean(this.#receiveBadgesSetting.get());
109
- // If there is a GDP profile and the user has enabled receiving badges, we award the starter badge as well.
110
- if (getProfileResponse?.profile && receiveBadgesSettingEnabled && !this.#isStarterBadgeDismissed() &&
111
- !this.#isStarterBadgeSnoozed()) {
112
- shouldAwardBadge = true;
113
- }
143
+ const reason = await this.#resolveBadgeTriggerReason(badge);
144
+
145
+ if (!reason) {
146
+ return;
114
147
  }
115
148
 
116
- // Awarding was needed and not successful, we don't show the notification
117
- if (shouldAwardBadge) {
149
+ if (reason === BadgeTriggerReason.AWARD) {
118
150
  const result = await Host.GdpClient.GdpClient.instance().createAward({name: badge.name});
119
151
  if (!result) {
120
152
  return;
@@ -125,7 +157,7 @@ export class UserBadges extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
125
157
  // We want to add exactly 1.5 second delay between the trigger action & the notification.
126
158
  const delay = opts?.immediate ? 0 : Math.max(DELAY_BEFORE_TRIGGER - timeElapsedAfterTriggerCall, 0);
127
159
  setTimeout(() => {
128
- this.dispatchEventToListeners(Events.BADGE_TRIGGERED, badge);
160
+ this.dispatchEventToListeners(Events.BADGE_TRIGGERED, {badge, reason});
129
161
  }, delay);
130
162
  }
131
163
 
@@ -12,6 +12,7 @@ export interface GreenDevSettings {
12
12
  inlineWidgets: Common.Settings.Setting<boolean>;
13
13
  artifactViewer: Common.Settings.Setting<boolean>;
14
14
  aiAnnotations: Common.Settings.Setting<boolean>;
15
+ copyToGemini: Common.Settings.Setting<boolean>;
15
16
  }
16
17
 
17
18
  export class Prototypes {
@@ -51,6 +52,10 @@ export class Prototypes {
51
52
 
52
53
  const artifactViewer =
53
54
  settings.createSetting('greendev-artifact-viewer-enabled', false, Common.Settings.SettingStorageType.LOCAL);
54
- return {inDevToolsFloaty, inlineWidgets, aiAnnotations, artifactViewer};
55
+
56
+ const copyToGemini =
57
+ settings.createSetting('greendev-copy-to-gemini-enabled', false, Common.Settings.SettingStorageType.LOCAL);
58
+
59
+ return {inDevToolsFloaty, inlineWidgets, aiAnnotations, artifactViewer, copyToGemini};
55
60
  }
56
61
  }
@@ -687,7 +687,7 @@ export function generateEventID(event: Types.Events.Event): string {
687
687
  SamplesIntegrator.nativeGroup(event.callFrame.functionName) :
688
688
  event.callFrame.functionName;
689
689
  const location = event.callFrame.scriptId || event.callFrame.url || '';
690
- return `f:${name}@${location}`;
690
+ return `f:${name}@${location}:${event.callFrame.lineNumber}:${event.callFrame.columnNumber}`;
691
691
  }
692
692
 
693
693
  if (Types.Events.isConsoleTimeStamp(event) && event.args.data) {
@@ -235,19 +235,24 @@ function getNavigationForPageLoadEvent(event: Types.Events.PageLoadEvent): AnyNa
235
235
  if (Types.Events.isFirstContentfulPaint(event) || Types.Events.isAnyLargestContentfulPaintCandidate(event) ||
236
236
  Types.Events.isFirstPaint(event)) {
237
237
  const {navigationsByNavigationId, softNavigationsById} = metaHandlerData();
238
+
238
239
  let navigation;
239
240
  if (event.name === Types.Events.Name.MARK_LCP_CANDIDATE_FOR_SOFT_NAVIGATION &&
240
241
  event.args.data?.performanceTimelineNavigationId) {
241
242
  navigation = softNavigationsById.get(event.args.data.performanceTimelineNavigationId);
242
- }
243
- if (!navigation) {
243
+ if (!navigation) {
244
+ // The most recent soft navigation must have been before the trace started.
245
+ return null;
246
+ }
247
+ } else {
244
248
  const navigationId = event.args.data?.navigationId;
245
249
  if (!navigationId) {
246
- throw new Error('Trace event unexpectedly had no navigation ID.');
250
+ throw new Error(`Trace event unexpectedly had no navigation ID: ${JSON.stringify(event, null, 2)}`);
247
251
  }
248
252
 
249
253
  navigation = navigationsByNavigationId.get(navigationId);
250
254
  }
255
+
251
256
  if (!navigation) {
252
257
  // This event's navigation has been filtered out by the meta handler as a noise event.
253
258
  return null;