chrome-devtools-frontend 1.0.1591204 → 1.0.1592129

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 (54) hide show
  1. package/docs/ui_engineering.md +1 -1
  2. package/front_end/core/host/AidaClient.ts +38 -15
  3. package/front_end/core/host/DispatchHttpRequestClient.ts +7 -4
  4. package/front_end/core/host/InspectorFrontendHostAPI.ts +2 -0
  5. package/front_end/core/sdk/CSSMetadata.ts +18 -0
  6. package/front_end/core/sdk/RuntimeModel.ts +2 -1
  7. package/front_end/generated/protocol.ts +2 -2
  8. package/front_end/models/ai_assistance/AiConversation.ts +9 -0
  9. package/front_end/models/ai_assistance/AiHistoryStorage.ts +1 -0
  10. package/front_end/models/ai_assistance/agents/AiAgent.ts +6 -1
  11. package/front_end/models/ai_assistance/agents/BreakpointDebuggerAgent.ts +722 -0
  12. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +1 -1
  13. package/front_end/models/ai_assistance/ai_assistance.ts +2 -0
  14. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +12 -12
  15. package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +7 -7
  16. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +7 -7
  17. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +1 -1
  18. package/front_end/models/greendev/Prototypes.ts +7 -1
  19. package/front_end/models/trace/handlers/NetworkRequestsHandler.ts +3 -3
  20. package/front_end/models/trace/helpers/Network.ts +1 -1
  21. package/front_end/models/trace/insights/NetworkDependencyTree.ts +1 -1
  22. package/front_end/models/trace/insights/RenderBlocking.ts +5 -5
  23. package/front_end/models/trace/lantern/metrics/FirstContentfulPaint.ts +6 -6
  24. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +63 -0
  25. package/front_end/panels/ai_assistance/components/ChatInput.ts +1 -4
  26. package/front_end/panels/ai_assistance/components/chatInput.css +0 -8
  27. package/front_end/panels/common/AiCodeGenerationTeaser.ts +9 -4
  28. package/front_end/panels/console/ConsoleViewMessage.ts +100 -4
  29. package/front_end/panels/elements/ComputedStyleWidget.ts +16 -9
  30. package/front_end/panels/elements/ElementsPanel.ts +2 -2
  31. package/front_end/panels/elements/StyleEditorWidget.ts +10 -2
  32. package/front_end/panels/elements/StylesContainer.ts +2 -0
  33. package/front_end/panels/elements/StylesSidebarPane.ts +8 -0
  34. package/front_end/panels/network/NetworkDataGridNode.ts +1 -1
  35. package/front_end/panels/network/NetworkLogViewColumns.ts +1 -1
  36. package/front_end/panels/network/RequestTimingView.ts +3 -3
  37. package/front_end/panels/settings/SettingsScreen.ts +3 -2
  38. package/front_end/panels/settings/WorkspaceSettingsTab.ts +1 -1
  39. package/front_end/panels/sources/BreakpointsView.ts +1 -1
  40. package/front_end/panels/sources/CallStackSidebarPane.ts +1 -1
  41. package/front_end/panels/timeline/NetworkTrackAppender.ts +1 -1
  42. package/front_end/panels/timeline/components/IgnoreListSetting.ts +0 -1
  43. package/front_end/panels/timeline/components/NetworkRequestDetails.ts +4 -4
  44. package/front_end/panels/timeline/components/NetworkRequestTooltip.ts +2 -2
  45. package/front_end/panels/timeline/components/SidebarAnnotationsTab.ts +4 -4
  46. package/front_end/third_party/chromium/README.chromium +4 -2
  47. package/front_end/third_party/lighthouse/lighthouse-dt-bundle.js +5 -1
  48. package/front_end/third_party/lighthouse/locales/en-GB.json +2 -2
  49. package/front_end/third_party/lighthouse/locales/en-US.json +2 -2
  50. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +1 -1
  51. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +31 -8
  52. package/front_end/ui/legacy/components/object_ui/RemoteObjectPreviewFormatter.ts +10 -3
  53. package/front_end/ui/visual_logging/KnownContextValues.ts +2 -0
  54. package/package.json +1 -1
@@ -611,7 +611,7 @@ export const DEFAULT_VIEW = (input, _output, target) => {
611
611
  <a href="https://www.google.com" data-some-key="some-value" role="some-role">some-text</a>
612
612
  <img src="https://www.google.com/some-image.png" alt="some-alt" draggable="true" height="100"
613
613
  hidden="hidden" href="https://www.google.com" id="some-id" name="some-name" rel="some-rel"
614
- scope="some-scope"></img>
614
+ scope="some-scope">
615
615
  <input type="text" placeholder="some-placeholder" value="some-value"
616
616
  ?disabled=${!this.enabled} checked>
617
617
  </div>`,
@@ -528,8 +528,8 @@ export class AidaClient {
528
528
  async *
529
529
  doConversation(request: DoConversationRequest, options?: {signal?: AbortSignal}):
530
530
  AsyncGenerator<DoConversationResponse, void, void> {
531
- if (!InspectorFrontendHostInstance.doAidaConversation) {
532
- throw new Error('doAidaConversation is not available');
531
+ if (!InspectorFrontendHostInstance.dispatchHttpRequest) {
532
+ throw new Error('dispatchHttpRequest is not available');
533
533
  }
534
534
 
535
535
  // Disable logging for now.
@@ -559,19 +559,42 @@ export class AidaClient {
559
559
  };
560
560
  })();
561
561
  const streamId = bindOutputStream(stream);
562
- InspectorFrontendHostInstance.doAidaConversation(JSON.stringify(request), streamId, result => {
563
- if (result.statusCode === 403) {
564
- stream.fail(new Error('Server responded: permission denied'));
565
- } else if (result.error) {
566
- stream.fail(new Error(`Cannot send request: ${result.error} ${result.detail || ''}`));
567
- } else if (result.netErrorName === 'net::ERR_TIMED_OUT') {
568
- stream.fail(new Error('doAidaConversation timed out'));
569
- } else if (result.statusCode !== 200) {
570
- stream.fail(new Error(`Request failed: ${JSON.stringify(result)}`));
571
- } else {
572
- void stream.close();
573
- }
574
- });
562
+ DispatchHttpRequestClient
563
+ .makeHttpRequest(
564
+ {
565
+ service: SERVICE_NAME,
566
+ path: '/v1/aida:doConversation',
567
+ method: 'POST',
568
+ body: JSON.stringify(request),
569
+ streamId,
570
+ },
571
+ options)
572
+ .then(
573
+ () => {
574
+ void stream.close();
575
+ },
576
+ err => {
577
+ if (err instanceof DispatchHttpRequestClient.DispatchHttpRequestError && err.response) {
578
+ const result = err.response;
579
+ if (result.statusCode === 403) {
580
+ stream.fail(new Error('Server responded: permission denied'));
581
+ return;
582
+ }
583
+ if ('error' in result && result.error) {
584
+ stream.fail(new Error(`Cannot send request: ${result.error} ${result.detail || ''}`));
585
+ return;
586
+ }
587
+ if ('netErrorName' in result && result.netErrorName === 'net::ERR_TIMED_OUT') {
588
+ stream.fail(new Error('doAidaConversation timed out'));
589
+ return;
590
+ }
591
+ if (result.statusCode !== 200) {
592
+ stream.fail(new Error(`Request failed: ${JSON.stringify(result)}`));
593
+ return;
594
+ }
595
+ }
596
+ stream.fail(err);
597
+ });
575
598
  let chunk;
576
599
  const text = [];
577
600
  let inCodeChunk = false;
@@ -12,7 +12,7 @@ export enum ErrorType {
12
12
  }
13
13
 
14
14
  export class DispatchHttpRequestError extends Error {
15
- constructor(readonly type: ErrorType, options?: ErrorOptions) {
15
+ constructor(readonly type: ErrorType, readonly response?: DispatchHttpRequestResult, options?: ErrorOptions) {
16
16
  super(undefined, options);
17
17
  }
18
18
  }
@@ -38,18 +38,21 @@ export async function makeHttpRequest<R>(
38
38
 
39
39
  debugLog({request, response});
40
40
  if (response.statusCode === 404) {
41
- throw new DispatchHttpRequestError(ErrorType.NOT_FOUND);
41
+ throw new DispatchHttpRequestError(ErrorType.NOT_FOUND, response);
42
42
  }
43
43
 
44
44
  if ('response' in response && response.statusCode === 200) {
45
+ if (request.streamId && !response.response) {
46
+ return null as R;
47
+ }
45
48
  try {
46
49
  return JSON.parse(response.response) as R;
47
50
  } catch (err) {
48
- throw new DispatchHttpRequestError(ErrorType.HTTP_RESPONSE_UNAVAILABLE, {cause: err});
51
+ throw new DispatchHttpRequestError(ErrorType.HTTP_RESPONSE_UNAVAILABLE, response, {cause: err});
49
52
  }
50
53
  }
51
54
 
52
- throw new DispatchHttpRequestError(ErrorType.HTTP_RESPONSE_UNAVAILABLE);
55
+ throw new DispatchHttpRequestError(ErrorType.HTTP_RESPONSE_UNAVAILABLE, response);
53
56
  }
54
57
 
55
58
  function isDebugMode(): boolean {
@@ -263,12 +263,14 @@ export type DispatchHttpRequestRequest = {
263
263
  path: string,
264
264
  method: 'GET',
265
265
  queryParams?: Record<string, string|string[]>,
266
+ streamId?: number,
266
267
  body?: never,
267
268
  }|{
268
269
  service: string,
269
270
  path: string,
270
271
  method: 'POST',
271
272
  queryParams?: Record<string, string|string[]>,
273
+ streamId?: number,
272
274
  // A JSON string containing the request body.
273
275
  body?: string,
274
276
  };
@@ -1344,6 +1344,24 @@ const extraPropertyValues = new Map<string, Set<string>>([
1344
1344
  ['-webkit-transform-origin-x', new Set(['left', 'right', 'center'])],
1345
1345
  ['-webkit-transform-origin-y', new Set(['top', 'bottom', 'center'])],
1346
1346
  ['width', new Set(['-webkit-fill-available', 'stretch'])],
1347
+ [
1348
+ 'animation-trigger',
1349
+ new Set([
1350
+ 'play',
1351
+ 'pause',
1352
+ 'play-once',
1353
+ 'play-alternate',
1354
+ 'play-forwards',
1355
+ 'play-backwards',
1356
+ 'play-pause',
1357
+ 'replay',
1358
+ ]),
1359
+ ],
1360
+ ['timeline-trigger-activation-range-start', new Set(['normal'])],
1361
+ ['timeline-trigger-activation-range-end', new Set(['normal'])],
1362
+ ['timeline-trigger-active-range-start', new Set(['normal'])],
1363
+ ['timeline-trigger-active-range-end', new Set(['normal'])],
1364
+
1347
1365
  ['contain-intrinsic-width', new Set(['auto none', 'auto 100px'])],
1348
1366
  ['contain-intrinsic-height', new Set(['auto none', 'auto 100px'])],
1349
1367
  ['contain-intrinsic-size', new Set(['auto none', 'auto 100px'])],
@@ -262,7 +262,8 @@ export class RuntimeModel extends SDKModel<EventTypes> {
262
262
  }
263
263
 
264
264
  if (object.isNode()) {
265
- void Common.Revealer.reveal(object).then(object.release.bind(object));
265
+ const omitFocus = hints !== null && typeof hints === 'object' && 'omitFocus' in hints && Boolean(hints.omitFocus);
266
+ void Common.Revealer.reveal(object, omitFocus).then(object.release.bind(object));
266
267
  return;
267
268
  }
268
269
 
@@ -10157,7 +10157,7 @@ export namespace Network {
10157
10157
  }
10158
10158
 
10159
10159
  /**
10160
- * The render blocking behavior of a resource request.
10160
+ * The render-blocking behavior of a resource request.
10161
10161
  */
10162
10162
  export const enum RenderBlockingBehavior {
10163
10163
  Blocking = 'Blocking',
@@ -12674,7 +12674,7 @@ export namespace Network {
12674
12674
  */
12675
12675
  hasUserGesture?: boolean;
12676
12676
  /**
12677
- * The render blocking behavior of the request.
12677
+ * The render-blocking behavior of the request.
12678
12678
  */
12679
12679
  renderBlockingBehavior?: RenderBlockingBehavior;
12680
12680
  }
@@ -6,6 +6,7 @@ import * as Host from '../../core/host/host.js';
6
6
  import * as Root from '../../core/root/root.js';
7
7
  import * as SDK from '../../core/sdk/sdk.js';
8
8
  import * as Trace from '../../models/trace/trace.js';
9
+ import * as Greendev from '../greendev/greendev.js';
9
10
  import * as NetworkTimeCalculator from '../network_time_calculator/network_time_calculator.js';
10
11
 
11
12
  import {
@@ -17,6 +18,7 @@ import {
17
18
  ResponseType,
18
19
  type UserQuery
19
20
  } from './agents/AiAgent.js';
21
+ import {BreakpointDebuggerAgent} from './agents/BreakpointDebuggerAgent.js';
20
22
  import {ContextSelectionAgent} from './agents/ContextSelectionAgent.js';
21
23
  import {FileAgent, FileContext} from './agents/FileAgent.js';
22
24
  import {NetworkAgent, RequestContext} from './agents/NetworkAgent.js';
@@ -326,6 +328,13 @@ export class AiConversation {
326
328
  this.#agent = new PerformanceAgent(options);
327
329
  break;
328
330
  }
331
+ case ConversationType.BREAKPOINT: {
332
+ const breakpointAgentEnabled = Greendev.Prototypes.instance().isEnabled('breakpointDebuggerAgent');
333
+ if (breakpointAgentEnabled) {
334
+ this.#agent = new BreakpointDebuggerAgent(options);
335
+ }
336
+ break;
337
+ }
329
338
  case ConversationType.NONE: {
330
339
  this.#agent = new ContextSelectionAgent(options);
331
340
  break;
@@ -13,6 +13,7 @@ export const enum ConversationType {
13
13
  FILE = 'drjones-file',
14
14
  NETWORK = 'drjones-network-request',
15
15
  PERFORMANCE = 'drjones-performance-full',
16
+ BREAKPOINT = 'breakpoint',
16
17
  }
17
18
 
18
19
  export interface SerializedConversation {
@@ -5,6 +5,7 @@
5
5
  import * as Host from '../../../core/host/host.js';
6
6
  import * as Root from '../../../core/root/root.js';
7
7
  import type * as SDK from '../../../core/sdk/sdk.js';
8
+ import * as Greendev from '../../greendev/greendev.js';
8
9
  import {debugLog, isStructuredLogEnabled} from '../debug.js';
9
10
 
10
11
  export const enum ResponseType {
@@ -534,7 +535,11 @@ export abstract class AiAgent<T> {
534
535
 
535
536
  yield* this.handleContextDetails(options.selected);
536
537
 
537
- for (let i = 0; i < MAX_STEPS; i++) {
538
+ const breakpointAgentEnabled = Greendev.Prototypes.instance().isEnabled('breakpointDebuggerAgent');
539
+ const isBreakpointDebuggerAgent = this.constructor.name === 'BreakpointDebuggerAgent';
540
+ const finalMaxSteps = (isBreakpointDebuggerAgent && breakpointAgentEnabled) ? 1000 : MAX_STEPS;
541
+
542
+ for (let i = 0; i < finalMaxSteps; i++) {
538
543
  yield {
539
544
  type: ResponseType.QUERYING,
540
545
  };