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.
- package/docs/ui_engineering.md +1 -1
- package/front_end/core/host/AidaClient.ts +38 -15
- package/front_end/core/host/DispatchHttpRequestClient.ts +7 -4
- package/front_end/core/host/InspectorFrontendHostAPI.ts +2 -0
- package/front_end/core/sdk/CSSMetadata.ts +18 -0
- package/front_end/core/sdk/RuntimeModel.ts +2 -1
- package/front_end/generated/protocol.ts +2 -2
- package/front_end/models/ai_assistance/AiConversation.ts +9 -0
- package/front_end/models/ai_assistance/AiHistoryStorage.ts +1 -0
- package/front_end/models/ai_assistance/agents/AiAgent.ts +6 -1
- package/front_end/models/ai_assistance/agents/BreakpointDebuggerAgent.ts +722 -0
- package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +1 -1
- package/front_end/models/ai_assistance/ai_assistance.ts +2 -0
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.snapshot.txt +12 -12
- package/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.ts +7 -7
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.snapshot.txt +7 -7
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +1 -1
- package/front_end/models/greendev/Prototypes.ts +7 -1
- package/front_end/models/trace/handlers/NetworkRequestsHandler.ts +3 -3
- package/front_end/models/trace/helpers/Network.ts +1 -1
- package/front_end/models/trace/insights/NetworkDependencyTree.ts +1 -1
- package/front_end/models/trace/insights/RenderBlocking.ts +5 -5
- package/front_end/models/trace/lantern/metrics/FirstContentfulPaint.ts +6 -6
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +63 -0
- package/front_end/panels/ai_assistance/components/ChatInput.ts +1 -4
- package/front_end/panels/ai_assistance/components/chatInput.css +0 -8
- package/front_end/panels/common/AiCodeGenerationTeaser.ts +9 -4
- package/front_end/panels/console/ConsoleViewMessage.ts +100 -4
- package/front_end/panels/elements/ComputedStyleWidget.ts +16 -9
- package/front_end/panels/elements/ElementsPanel.ts +2 -2
- package/front_end/panels/elements/StyleEditorWidget.ts +10 -2
- package/front_end/panels/elements/StylesContainer.ts +2 -0
- package/front_end/panels/elements/StylesSidebarPane.ts +8 -0
- package/front_end/panels/network/NetworkDataGridNode.ts +1 -1
- package/front_end/panels/network/NetworkLogViewColumns.ts +1 -1
- package/front_end/panels/network/RequestTimingView.ts +3 -3
- package/front_end/panels/settings/SettingsScreen.ts +3 -2
- package/front_end/panels/settings/WorkspaceSettingsTab.ts +1 -1
- package/front_end/panels/sources/BreakpointsView.ts +1 -1
- package/front_end/panels/sources/CallStackSidebarPane.ts +1 -1
- package/front_end/panels/timeline/NetworkTrackAppender.ts +1 -1
- package/front_end/panels/timeline/components/IgnoreListSetting.ts +0 -1
- package/front_end/panels/timeline/components/NetworkRequestDetails.ts +4 -4
- package/front_end/panels/timeline/components/NetworkRequestTooltip.ts +2 -2
- package/front_end/panels/timeline/components/SidebarAnnotationsTab.ts +4 -4
- package/front_end/third_party/chromium/README.chromium +4 -2
- package/front_end/third_party/lighthouse/lighthouse-dt-bundle.js +5 -1
- package/front_end/third_party/lighthouse/locales/en-GB.json +2 -2
- package/front_end/third_party/lighthouse/locales/en-US.json +2 -2
- package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +1 -1
- package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +31 -8
- package/front_end/ui/legacy/components/object_ui/RemoteObjectPreviewFormatter.ts +10 -3
- package/front_end/ui/visual_logging/KnownContextValues.ts +2 -0
- package/package.json +1 -1
package/docs/ui_engineering.md
CHANGED
|
@@ -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"
|
|
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.
|
|
532
|
-
throw new Error('
|
|
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
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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;
|
|
@@ -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
|
-
|
|
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
|
};
|