chrome-devtools-frontend 1.0.1660788 → 1.0.1662289
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/.agents/skills/evaluate-ai-css-completion/SKILL.md +143 -0
- package/.agents/skills/evaluate-ai-css-completion/scripts/evaluate.js +104 -0
- package/.agents/skills/migrate-chromium-test/SKILL.md +7 -2
- package/.agents/skills/ui-eng-vision-local-lit-renderer/SKILL.md +7 -1
- package/docs/ui_engineering.md +75 -42
- package/eslint.config.mjs +7 -0
- package/extension-api/ExtensionAPI.d.ts +88 -0
- package/front_end/core/common/SettingRegistration.ts +0 -5
- package/front_end/core/host/InspectorFrontendHost.ts +1 -0
- package/front_end/core/host/InspectorFrontendHostStub.ts +2 -0
- package/front_end/core/platform/ArrayUtilities.ts +10 -0
- package/front_end/core/platform/StringUtilities.ts +20 -4
- package/front_end/core/sdk/CPUThrottlingManager.ts +2 -0
- package/front_end/core/sdk/DOMDebuggerModel.ts +2 -0
- package/front_end/core/sdk/DOMModel.ts +1 -0
- package/front_end/core/sdk/DebuggerModel.ts +4 -4
- package/front_end/core/sdk/EventBreakpointsModel.ts +2 -0
- package/front_end/core/sdk/FrameManager.ts +1 -0
- package/front_end/core/sdk/IsolateManager.ts +1 -0
- package/front_end/core/sdk/NetworkManager.ts +2 -0
- package/front_end/core/sdk/NetworkRequest.ts +1 -0
- package/front_end/core/sdk/PageResourceLoader.ts +2 -0
- package/front_end/core/sdk/SourceMap.ts +5 -5
- package/front_end/core/sdk/SourceMapManager.ts +3 -2
- package/front_end/core/sdk/TargetManager.ts +4 -0
- package/front_end/entrypoints/main/MainImpl.ts +2 -1
- package/front_end/foundation/README.md +86 -0
- package/front_end/generated/InspectorBackendCommands.ts +4 -5
- package/front_end/generated/protocol.ts +20 -38
- package/front_end/models/bindings/CompilerScriptMapping.ts +5 -5
- package/front_end/models/bindings/ContentProviderBasedProject.ts +2 -3
- package/front_end/models/bindings/DebuggerLanguagePlugins.ts +3 -3
- package/front_end/models/bindings/DefaultScriptMapping.ts +3 -3
- package/front_end/models/bindings/ResourceMapping.ts +3 -3
- package/front_end/models/bindings/ResourceScriptMapping.ts +2 -2
- package/front_end/models/bindings/SASSSourceMapping.ts +3 -3
- package/front_end/models/bindings/TempFile.ts +8 -3
- package/front_end/models/extensions/ExtensionAPI.ts +110 -46
- package/front_end/models/extensions/RecorderExtensionEndpoint.ts +7 -5
- package/front_end/models/formatter/ScriptFormatter.ts +8 -11
- package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +14 -5
- package/front_end/models/issues_manager/CheckFormsIssuesTrigger.ts +8 -9
- package/front_end/models/issues_manager/CookieIssue.ts +21 -9
- package/front_end/models/issues_manager/Issue.ts +3 -4
- package/front_end/models/issues_manager/IssueAggregator.ts +0 -9
- package/front_end/models/issues_manager/IssueResolver.ts +2 -2
- package/front_end/models/issues_manager/IssuesManager.ts +136 -137
- package/front_end/models/issues_manager/RelatedIssue.ts +10 -8
- package/front_end/models/issues_manager/issues_manager.ts +0 -2
- package/front_end/models/javascript_metadata/NativeFunctions.js +1 -1
- package/front_end/models/logs/RequestResolver.ts +2 -2
- package/front_end/models/source_map_scopes/FunctionCodeResolver.ts +12 -9
- package/front_end/models/trace/handlers/FramesHandler.ts +4 -7
- package/front_end/models/trace/handlers/ModelHandlers.ts +0 -1
- package/front_end/models/trace/handlers/RendererHandler.ts +2 -15
- package/front_end/models/trace/handlers/Threads.ts +4 -11
- package/front_end/models/trace/insights/DOMSize.ts +1 -1
- package/front_end/models/workspace_diff/WorkspaceDiff.ts +10 -4
- package/front_end/panels/ai_assistance/components/ChatMessage.ts +2 -1
- package/front_end/panels/application/ApplicationPanelSidebar.ts +0 -44
- package/front_end/panels/application/CookieItemsView.ts +1 -1
- package/front_end/panels/application/ServiceWorkersView.ts +494 -411
- package/front_end/panels/application/WebMCPView.ts +38 -43
- package/front_end/panels/application/application.ts +0 -6
- package/front_end/panels/application/components/AdsView.ts +201 -30
- package/front_end/panels/application/components/adsView.css +25 -0
- package/front_end/panels/application/components/components.ts +0 -2
- package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +1 -1
- package/front_end/panels/application/preloading/components/RuleSetDetailsView.ts +2 -2
- package/front_end/panels/application/serviceWorkersView.css +40 -4
- package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +147 -123
- package/front_end/panels/common/ExtensionServer.ts +3 -3
- package/front_end/panels/console/ConsoleView.ts +3 -2
- package/front_end/panels/console/PromptBuilder.ts +2 -1
- package/front_end/panels/emulation/DeviceModeView.ts +164 -113
- package/front_end/panels/issues/AffectedResourcesView.ts +1 -1
- package/front_end/panels/issues/IssueView.ts +0 -2
- package/front_end/panels/issues/IssuesPane.ts +1 -8
- package/front_end/panels/js_timeline/js_timeline-meta.ts +3 -2
- package/front_end/panels/lighthouse/LighthouseProtocolService.ts +53 -12
- package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorController.ts +3 -3
- package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorPane.ts +5 -5
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryHighlightChipList.ts +4 -4
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +2 -2
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryNavigator.ts +6 -6
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +3 -3
- package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplay.ts +8 -9
- package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplayUtils.ts +2 -2
- package/front_end/panels/linear_memory_inspector/components/ValueInterpreterSettings.ts +1 -1
- package/front_end/panels/linear_memory_inspector/linear_memory_inspector-meta.ts +2 -2
- package/front_end/panels/network/RequestPayloadView.ts +92 -52
- package/front_end/panels/network/RequestTimingView.ts +95 -127
- package/front_end/panels/network/components/ResponseHeaderSection.ts +5 -3
- package/front_end/panels/profiler/HeapSnapshotView.ts +3 -3
- package/front_end/panels/profiler/WritableProfileHeader.ts +2 -2
- package/front_end/panels/recorder/{components/ControlButton.ts → ControlButton.ts} +9 -10
- package/front_end/panels/recorder/{components/CreateRecordingView.ts → CreateRecordingView.ts} +48 -47
- package/front_end/panels/recorder/{components/ExtensionView.ts → ExtensionView.ts} +8 -8
- package/front_end/panels/recorder/RecorderController.ts +302 -127
- package/front_end/panels/recorder/RecorderPanel.ts +1 -1
- package/front_end/panels/recorder/{components/RecordingListView.ts → RecordingListView.ts} +19 -20
- package/front_end/panels/recorder/{components/RecordingView.ts → RecordingView.ts} +88 -88
- package/front_end/panels/recorder/{components/ReplaySection.ts → ReplaySection.ts} +11 -11
- package/front_end/panels/recorder/{components/SelectorPicker.ts → SelectorPicker.ts} +13 -13
- package/front_end/panels/recorder/{components/StepEditor.ts → StepEditor.ts} +15 -15
- package/front_end/panels/recorder/{components/StepView.ts → StepView.ts} +10 -10
- package/front_end/panels/recorder/{components/TimelineSection.ts → TimelineSection.ts} +2 -2
- package/front_end/panels/recorder/recorder.ts +23 -1
- package/front_end/panels/recorder/util/util.ts +113 -0
- package/front_end/panels/sources/SourcesView.ts +0 -17
- package/front_end/panels/sources/TabbedEditorContainer.ts +1 -1
- package/front_end/panels/sources/UISourceCodeFrame.ts +42 -0
- package/front_end/panels/sources/sources.ts +0 -2
- package/front_end/panels/timeline/CompatibilityTracksAppender.ts +0 -17
- package/front_end/panels/timeline/IsolateSelector.ts +10 -8
- package/front_end/panels/timeline/ThreadAppender.ts +0 -106
- package/front_end/panels/timeline/TimelinePanel.ts +18 -7
- package/front_end/panels/timeline/TimelineUIUtils.ts +144 -129
- package/front_end/panels/timeline/timeline-meta.ts +3 -2
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/ui/components/report_view/ReportView.ts +11 -5
- package/front_end/ui/components/report_view/report.css +4 -1
- package/front_end/ui/legacy/TextPrompt.ts +49 -1
- package/front_end/ui/legacy/Treeoutline.ts +3 -0
- package/front_end/ui/legacy/UIUtils.ts +11 -1
- package/front_end/ui/legacy/Widget.ts +14 -15
- package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +2 -2
- package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +11 -7
- package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +2 -1
- package/front_end/ui/legacy/components/utils/JSPresentationUtils.ts +10 -1
- package/front_end/ui/legacy/textPrompt.css +10 -0
- package/front_end/ui/visual_logging/KnownContextValues.ts +1 -0
- package/package.json +1 -1
- package/front_end/models/issues_manager/AttributionReportingIssue.ts +0 -247
- package/front_end/models/issues_manager/descriptions/arInsecureContext.md +0 -7
- package/front_end/models/issues_manager/descriptions/arInvalidInfoHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arInvalidRegisterOsSourceHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arInvalidRegisterOsTriggerHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arInvalidRegisterSourceHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arInvalidRegisterTriggerHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNavigationRegistrationUniqueScopeAlreadySet.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNavigationRegistrationWithoutTransientUserActivation.md +0 -6
- package/front_end/models/issues_manager/descriptions/arNoRegisterOsSourceHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNoRegisterOsTriggerHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNoRegisterSourceHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNoRegisterTriggerHeader.md +0 -5
- package/front_end/models/issues_manager/descriptions/arNoWebOrOsSupport.md +0 -4
- package/front_end/models/issues_manager/descriptions/arOsSourceIgnored.md +0 -18
- package/front_end/models/issues_manager/descriptions/arOsTriggerIgnored.md +0 -19
- package/front_end/models/issues_manager/descriptions/arPermissionPolicyDisabled.md +0 -8
- package/front_end/models/issues_manager/descriptions/arSourceAndTriggerHeaders.md +0 -9
- package/front_end/models/issues_manager/descriptions/arSourceIgnored.md +0 -13
- package/front_end/models/issues_manager/descriptions/arTriggerIgnored.md +0 -12
- package/front_end/models/issues_manager/descriptions/arUntrustworthyReportingOrigin.md +0 -10
- package/front_end/models/issues_manager/descriptions/arWebAndOsHeaders.md +0 -11
- package/front_end/models/trace/handlers/AuctionWorkletsHandler.ts +0 -183
- package/front_end/panels/application/InterestGroupStorageModel.ts +0 -81
- package/front_end/panels/application/InterestGroupStorageView.ts +0 -151
- package/front_end/panels/application/InterestGroupTreeElement.ts +0 -65
- package/front_end/panels/application/components/InterestGroupAccessGrid.ts +0 -135
- package/front_end/panels/application/components/interestGroupAccessGrid.css +0 -27
- package/front_end/panels/application/interestGroupStorageView.css +0 -9
- package/front_end/panels/issues/AttributionReportingIssueDetailsView.ts +0 -182
- package/front_end/panels/recorder/components/components.ts +0 -25
- package/front_end/panels/recorder/components/util.ts +0 -116
- package/front_end/panels/sources/InplaceFormatterEditorAction.ts +0 -149
- /package/front_end/panels/recorder/{components/controlButton.css → controlButton.css} +0 -0
- /package/front_end/panels/recorder/{components/createRecordingView.css → createRecordingView.css} +0 -0
- /package/front_end/panels/recorder/{components/extensionView.css → extensionView.css} +0 -0
- /package/front_end/panels/recorder/{components/recordingListView.css → recordingListView.css} +0 -0
- /package/front_end/panels/recorder/{components/recordingView.css → recordingView.css} +0 -0
- /package/front_end/panels/recorder/{components/replaySection.css → replaySection.css} +0 -0
- /package/front_end/panels/recorder/{components/selectorPicker.css → selectorPicker.css} +0 -0
- /package/front_end/panels/recorder/{components/startView.css → startView.css} +0 -0
- /package/front_end/panels/recorder/{components/stepEditor.css → stepEditor.css} +0 -0
- /package/front_end/panels/recorder/{components/stepView.css → stepView.css} +0 -0
- /package/front_end/panels/recorder/{components/timelineSection.css → timelineSection.css} +0 -0
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
// Use of this source code is governed by a BSD-style license that can be
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
|
|
5
|
-
/* eslint-disable @devtools/no-imperative-dom-api */
|
|
6
5
|
import '../../ui/kit/kit.js';
|
|
7
6
|
|
|
8
7
|
import * as Common from '../../core/common/common.js';
|
|
@@ -297,22 +296,22 @@ function getLocalizedResponseSourceForCode(swResponseSource: Protocol.Network.Se
|
|
|
297
296
|
}
|
|
298
297
|
|
|
299
298
|
interface ViewInput {
|
|
300
|
-
|
|
301
|
-
requestStartTime: number;
|
|
302
|
-
requestIssueTime: number;
|
|
299
|
+
request: SDK.NetworkRequest.NetworkRequest;
|
|
303
300
|
totalDuration: number;
|
|
304
301
|
startTime: number;
|
|
305
302
|
endTime: number;
|
|
306
303
|
timeRanges: NetworkTimeCalculator.RequestTimeRange[];
|
|
307
304
|
calculator: NetworkTimeCalculator.NetworkTimeCalculator;
|
|
308
|
-
serverTimings: SDK.ServerTiming.ServerTiming[];
|
|
309
|
-
fetchDetails?: UI.TreeOutline.TreeOutlineInShadow;
|
|
310
|
-
routerDetails?: UI.TreeOutline.TreeOutlineInShadow;
|
|
311
305
|
wasThrottled?: SDK.NetworkManager.AppliedNetworkConditions;
|
|
312
306
|
}
|
|
313
307
|
|
|
314
308
|
type View = (input: ViewInput, output: object, target: HTMLElement) => void;
|
|
315
309
|
export const DEFAULT_VIEW: View = (input, output, target) => {
|
|
310
|
+
const serverTimings = input.request.serverTimings ?? [];
|
|
311
|
+
const requestStartTime = input.request.startTime;
|
|
312
|
+
const requestIssueTime = input.request.issueTime();
|
|
313
|
+
const requestUnfinished = !input.request.finished;
|
|
314
|
+
const routerDetails = input.request.serviceWorkerRouterInfo;
|
|
316
315
|
const revealThrottled = (): void => {
|
|
317
316
|
if (input.wasThrottled) {
|
|
318
317
|
void Common.Revealer.reveal(input.wasThrottled);
|
|
@@ -367,6 +366,80 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
|
|
|
367
366
|
// clang-format on
|
|
368
367
|
};
|
|
369
368
|
|
|
369
|
+
const routerDetailsTree = (serviceWorkerRouterInfo: Protocol.Network.ServiceWorkerRouterInfo): LitTemplate => {
|
|
370
|
+
const matchedSourceType = serviceWorkerRouterInfo.matchedSourceType;
|
|
371
|
+
const matchedSourceTypeString = String(matchedSourceType) || i18nString(UIStrings.unknown);
|
|
372
|
+
const actualSourceType = serviceWorkerRouterInfo.actualSourceType;
|
|
373
|
+
const actualSourceTypeString = String(actualSourceType) || i18nString(UIStrings.unknown);
|
|
374
|
+
// clang-format off
|
|
375
|
+
return html`<devtools-tree>
|
|
376
|
+
<ul role=tree>
|
|
377
|
+
<li role=treeitem>
|
|
378
|
+
<div class=network-fetch-details-treeitem>
|
|
379
|
+
${i18nString(UIStrings.routerMatchedSource, {PH1: matchedSourceTypeString})}
|
|
380
|
+
</div>
|
|
381
|
+
</li>
|
|
382
|
+
<li role=treeitem>
|
|
383
|
+
<div class=network-fetch-details-treeitem>
|
|
384
|
+
${i18nString(UIStrings.routerActualSource, {PH1: actualSourceTypeString})}
|
|
385
|
+
</div>
|
|
386
|
+
</li>
|
|
387
|
+
</ul>
|
|
388
|
+
</devtools-tree>`;
|
|
389
|
+
// clang-format on
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
const fetchDetailsTree = (): LitTemplate => {
|
|
393
|
+
const origRequest = Logs.NetworkLog.NetworkLog.instance().originalRequestForURL(input.request.url());
|
|
394
|
+
const origRequestTree = origRequest &&
|
|
395
|
+
new ObjectUI.ObjectPropertiesSection.ObjectTree(SDK.RemoteObject.RemoteObject.fromLocalObject(origRequest), {
|
|
396
|
+
readOnly: true,
|
|
397
|
+
propertiesMode: ObjectUI.ObjectPropertiesSection.ObjectPropertiesMode.OWN_AND_INTERNAL_AND_INHERITED,
|
|
398
|
+
});
|
|
399
|
+
const response = Logs.NetworkLog.NetworkLog.instance().originalResponseForURL(input.request.url());
|
|
400
|
+
const responseTree = response &&
|
|
401
|
+
new ObjectUI.ObjectPropertiesSection.ObjectTree(SDK.RemoteObject.RemoteObject.fromLocalObject(response), {
|
|
402
|
+
readOnly: true,
|
|
403
|
+
propertiesMode: ObjectUI.ObjectPropertiesSection.ObjectPropertiesMode.OWN_AND_INTERNAL_AND_INHERITED,
|
|
404
|
+
});
|
|
405
|
+
const swResponseSource = input.request.serviceWorkerResponseSource();
|
|
406
|
+
const responseCacheStorageName = input.request.getResponseCacheStorageCacheName();
|
|
407
|
+
const retrievalTime = input.request.getResponseRetrievalTime();
|
|
408
|
+
// clang-format off
|
|
409
|
+
return html`<devtools-tree>
|
|
410
|
+
<ul role=tree>
|
|
411
|
+
${origRequestTree ? html`<li role=treeitem class="object-properties-section-root-element object-properties-section" open>
|
|
412
|
+
${i18nString(UIStrings.originalRequest)}
|
|
413
|
+
${ObjectUI.ObjectPropertiesSection.renderObjectTree(origRequestTree)}
|
|
414
|
+
</li>` : nothing}
|
|
415
|
+
${responseTree ? html`<li role=treeitem class="object-properties-section-root-element object-properties-section" open>
|
|
416
|
+
${i18nString(UIStrings.responseReceived)}
|
|
417
|
+
${ObjectUI.ObjectPropertiesSection.renderObjectTree(responseTree)}
|
|
418
|
+
</li>` : nothing}
|
|
419
|
+
<li role=treeitem>
|
|
420
|
+
<div class=network-fetch-details-treeitem>
|
|
421
|
+
${i18nString(UIStrings.sourceOfResponseS, {PH1: swResponseSource ?
|
|
422
|
+
getLocalizedResponseSourceForCode(swResponseSource) :
|
|
423
|
+
i18nString(UIStrings.unknown)})}
|
|
424
|
+
</div>
|
|
425
|
+
</li>
|
|
426
|
+
<li role=treeitem>
|
|
427
|
+
<div class=network-fetch-details-treeitem>
|
|
428
|
+
${responseCacheStorageName ?
|
|
429
|
+
i18nString(UIStrings.cacheStorageCacheNameS, {PH1: responseCacheStorageName}) :
|
|
430
|
+
i18nString(UIStrings.cacheStorageCacheNameUnknown)}
|
|
431
|
+
</div>
|
|
432
|
+
</li>
|
|
433
|
+
${retrievalTime ? html`<li role=treeitem>
|
|
434
|
+
<div class=network-fetch-details-treeitem>
|
|
435
|
+
${i18nString(UIStrings.retrievalTimeS, {PH1: retrievalTime.toString()})}
|
|
436
|
+
</div>
|
|
437
|
+
</li>` : nothing}
|
|
438
|
+
</ul>
|
|
439
|
+
</devtools-tree>`;
|
|
440
|
+
// clang-format on
|
|
441
|
+
};
|
|
442
|
+
|
|
370
443
|
const onActivate = (e: KeyboardEvent|MouseEvent): void => {
|
|
371
444
|
if ('key' in e && !Platform.KeyboardUtilities.isEnterOrSpaceKey(e)) {
|
|
372
445
|
return;
|
|
@@ -434,12 +507,12 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
|
|
|
434
507
|
</tr>
|
|
435
508
|
<tr>
|
|
436
509
|
<td colspan = 3>
|
|
437
|
-
${i18nString(UIStrings.queuedAtS, {PH1: input.calculator.formatValue(
|
|
510
|
+
${i18nString(UIStrings.queuedAtS, {PH1: input.calculator.formatValue(requestIssueTime, 2)})}
|
|
438
511
|
</td>
|
|
439
512
|
</tr>
|
|
440
513
|
<tr>
|
|
441
514
|
<td colspan=3>
|
|
442
|
-
${i18nString(UIStrings.startedAtS, {PH1: input.calculator.formatValue(
|
|
515
|
+
${i18nString(UIStrings.startedAtS, {PH1: input.calculator.formatValue(requestStartTime, 2)})}
|
|
443
516
|
</td>
|
|
444
517
|
</tr>
|
|
445
518
|
</thead>
|
|
@@ -481,19 +554,19 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
|
|
|
481
554
|
</div>
|
|
482
555
|
</td>
|
|
483
556
|
</tr>
|
|
484
|
-
${range.name === 'serviceworker-respondwith' && input.
|
|
557
|
+
${range.name === 'serviceworker-respondwith' && input.request.fetchedViaServiceWorker ? html`
|
|
485
558
|
<tr class="network-fetch-timing-bar-details network-fetch-timing-bar-details-collapsed">
|
|
486
|
-
${
|
|
559
|
+
${fetchDetailsTree()}
|
|
487
560
|
</tr>`
|
|
488
561
|
: nothing}
|
|
489
|
-
${range.name === 'serviceworker-routerevaluation' &&
|
|
562
|
+
${range.name === 'serviceworker-routerevaluation' && routerDetails ? html`
|
|
490
563
|
<tr class="router-evaluation-timing-bar-details network-fetch-timing-bar-details-collapsed">
|
|
491
|
-
${
|
|
564
|
+
${routerDetailsTree(routerDetails)}
|
|
492
565
|
</tr>`
|
|
493
566
|
: nothing}
|
|
494
567
|
`)}
|
|
495
568
|
`)}
|
|
496
|
-
${
|
|
569
|
+
${requestUnfinished ? html`
|
|
497
570
|
<tr>
|
|
498
571
|
<td class=caution colspan=3>
|
|
499
572
|
${i18nString(UIStrings.cautionRequestIsNotFinishedYet)}
|
|
@@ -502,9 +575,9 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
|
|
|
502
575
|
<tr class=network-timing-footer>
|
|
503
576
|
<td colspan=1>
|
|
504
577
|
<devtools-link
|
|
505
|
-
href=
|
|
578
|
+
href='https://developer.chrome.com/docs/devtools/network/reference/#timing-explanation'
|
|
506
579
|
class=devtools-link
|
|
507
|
-
jslogcontext=
|
|
580
|
+
jslogcontext='explanation'>
|
|
508
581
|
${i18nString(UIStrings.explanation)}
|
|
509
582
|
</devtools-link>
|
|
510
583
|
<td></td>
|
|
@@ -523,9 +596,9 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
|
|
|
523
596
|
<td></td>
|
|
524
597
|
<td>${i18nString(UIStrings.time)}</td>
|
|
525
598
|
</tr>
|
|
526
|
-
${repeat(
|
|
527
|
-
${repeat(
|
|
528
|
-
${
|
|
599
|
+
${repeat(serverTimings.filter(item => item.metric.toLowerCase() !== 'total'), addServerTiming)}
|
|
600
|
+
${repeat(serverTimings.filter(item => item.metric.toLowerCase() === 'total'), addServerTiming)}
|
|
601
|
+
${serverTimings.length === 0 ? html`
|
|
529
602
|
<tr>
|
|
530
603
|
<td colspan=3>
|
|
531
604
|
${uiI18n.getFormatLocalizedStringTemplate(str_, UIStrings.duringDevelopmentYouCanUseSToAdd, {PH1:
|
|
@@ -546,8 +619,8 @@ export class RequestTimingView extends UI.Widget.VBox {
|
|
|
546
619
|
this.#view = view;
|
|
547
620
|
}
|
|
548
621
|
|
|
549
|
-
static create(request: SDK.NetworkRequest.NetworkRequest,
|
|
550
|
-
|
|
622
|
+
static create(request: SDK.NetworkRequest.NetworkRequest,
|
|
623
|
+
calculator: NetworkTimeCalculator.NetworkTimeCalculator): RequestTimingView {
|
|
551
624
|
const view = new RequestTimingView();
|
|
552
625
|
view.request = request;
|
|
553
626
|
view.calculator = calculator;
|
|
@@ -571,119 +644,14 @@ export class RequestTimingView extends UI.Widget.VBox {
|
|
|
571
644
|
startTime,
|
|
572
645
|
endTime,
|
|
573
646
|
totalDuration,
|
|
574
|
-
serverTimings: this.#request.serverTimings ?? [],
|
|
575
647
|
calculator: this.#calculator,
|
|
576
|
-
|
|
577
|
-
requestIssueTime: this.#request.issueTime(),
|
|
578
|
-
requestUnfinished: !this.#request.finished,
|
|
579
|
-
fetchDetails: this.#fetchDetailsTree(),
|
|
580
|
-
routerDetails: this.#routerDetailsTree(),
|
|
648
|
+
request: this.#request,
|
|
581
649
|
wasThrottled: conditions?.urlPattern ? conditions : undefined,
|
|
582
650
|
timeRanges,
|
|
583
651
|
};
|
|
584
652
|
this.#view(input, {}, this.contentElement);
|
|
585
653
|
}
|
|
586
654
|
|
|
587
|
-
#fetchDetailsTree(): UI.TreeOutline.TreeOutlineInShadow|undefined {
|
|
588
|
-
if (!this.#request?.fetchedViaServiceWorker) {
|
|
589
|
-
return undefined;
|
|
590
|
-
}
|
|
591
|
-
const detailsView = new UI.TreeOutline.TreeOutlineInShadow();
|
|
592
|
-
|
|
593
|
-
const origRequest = Logs.NetworkLog.NetworkLog.instance().originalRequestForURL(this.#request.url());
|
|
594
|
-
if (origRequest) {
|
|
595
|
-
const requestObject = SDK.RemoteObject.RemoteObject.fromLocalObject(origRequest);
|
|
596
|
-
const requestTreeElement = new ObjectUI.ObjectPropertiesSection.RootElement(
|
|
597
|
-
new ObjectUI.ObjectPropertiesSection.ObjectTree(requestObject, {
|
|
598
|
-
readOnly: true,
|
|
599
|
-
propertiesMode: ObjectUI.ObjectPropertiesSection.ObjectPropertiesMode.OWN_AND_INTERNAL_AND_INHERITED,
|
|
600
|
-
}));
|
|
601
|
-
requestTreeElement.title = i18nString(UIStrings.originalRequest);
|
|
602
|
-
detailsView.appendChild(requestTreeElement);
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
const response = Logs.NetworkLog.NetworkLog.instance().originalResponseForURL(this.#request.url());
|
|
606
|
-
if (response) {
|
|
607
|
-
const responseObject = SDK.RemoteObject.RemoteObject.fromLocalObject(response);
|
|
608
|
-
const responseTreeElement = new ObjectUI.ObjectPropertiesSection.RootElement(
|
|
609
|
-
new ObjectUI.ObjectPropertiesSection.ObjectTree(responseObject, {
|
|
610
|
-
readOnly: true,
|
|
611
|
-
propertiesMode: ObjectUI.ObjectPropertiesSection.ObjectPropertiesMode.OWN_AND_INTERNAL_AND_INHERITED,
|
|
612
|
-
}));
|
|
613
|
-
responseTreeElement.title = i18nString(UIStrings.responseReceived);
|
|
614
|
-
detailsView.appendChild(responseTreeElement);
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
const serviceWorkerResponseSource = document.createElement('div');
|
|
618
|
-
serviceWorkerResponseSource.classList.add('network-fetch-details-treeitem');
|
|
619
|
-
let swResponseSourceString = i18nString(UIStrings.unknown);
|
|
620
|
-
const swResponseSource = this.#request.serviceWorkerResponseSource();
|
|
621
|
-
if (swResponseSource) {
|
|
622
|
-
swResponseSourceString = getLocalizedResponseSourceForCode(swResponseSource);
|
|
623
|
-
}
|
|
624
|
-
serviceWorkerResponseSource.textContent = i18nString(UIStrings.sourceOfResponseS, {PH1: swResponseSourceString});
|
|
625
|
-
|
|
626
|
-
const responseSourceTreeElement = new UI.TreeOutline.TreeElement(serviceWorkerResponseSource);
|
|
627
|
-
detailsView.appendChild(responseSourceTreeElement);
|
|
628
|
-
|
|
629
|
-
const cacheNameElement = document.createElement('div');
|
|
630
|
-
cacheNameElement.classList.add('network-fetch-details-treeitem');
|
|
631
|
-
const responseCacheStorageName = this.#request.getResponseCacheStorageCacheName();
|
|
632
|
-
if (responseCacheStorageName) {
|
|
633
|
-
cacheNameElement.textContent = i18nString(UIStrings.cacheStorageCacheNameS, {PH1: responseCacheStorageName});
|
|
634
|
-
} else {
|
|
635
|
-
cacheNameElement.textContent = i18nString(UIStrings.cacheStorageCacheNameUnknown);
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
const cacheNameTreeElement = new UI.TreeOutline.TreeElement(cacheNameElement);
|
|
639
|
-
detailsView.appendChild(cacheNameTreeElement);
|
|
640
|
-
|
|
641
|
-
const retrievalTime = this.#request.getResponseRetrievalTime();
|
|
642
|
-
if (retrievalTime) {
|
|
643
|
-
const responseTimeElement = document.createElement('div');
|
|
644
|
-
responseTimeElement.classList.add('network-fetch-details-treeitem');
|
|
645
|
-
responseTimeElement.textContent = i18nString(UIStrings.retrievalTimeS, {PH1: retrievalTime.toString()});
|
|
646
|
-
const responseTimeTreeElement = new UI.TreeOutline.TreeElement(responseTimeElement);
|
|
647
|
-
detailsView.appendChild(responseTimeTreeElement);
|
|
648
|
-
}
|
|
649
|
-
return detailsView;
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
#routerDetailsTree(): UI.TreeOutline.TreeOutlineInShadow|undefined {
|
|
653
|
-
if (!this.#request?.serviceWorkerRouterInfo) {
|
|
654
|
-
return undefined;
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
const detailsView = new UI.TreeOutline.TreeOutlineInShadow();
|
|
658
|
-
|
|
659
|
-
const {serviceWorkerRouterInfo} = this.#request;
|
|
660
|
-
if (!serviceWorkerRouterInfo) {
|
|
661
|
-
return;
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
// Add matched source type element
|
|
665
|
-
const matchedSourceTypeElement = document.createElement('div');
|
|
666
|
-
matchedSourceTypeElement.classList.add('network-fetch-details-treeitem');
|
|
667
|
-
const matchedSourceType = serviceWorkerRouterInfo.matchedSourceType;
|
|
668
|
-
const matchedSourceTypeString = String(matchedSourceType) || i18nString(UIStrings.unknown);
|
|
669
|
-
matchedSourceTypeElement.textContent = i18nString(UIStrings.routerMatchedSource, {PH1: matchedSourceTypeString});
|
|
670
|
-
|
|
671
|
-
const matchedSourceTypeTreeElement = new UI.TreeOutline.TreeElement(matchedSourceTypeElement);
|
|
672
|
-
detailsView.appendChild(matchedSourceTypeTreeElement);
|
|
673
|
-
|
|
674
|
-
// Add actual source type element
|
|
675
|
-
const actualSourceTypeElement = document.createElement('div');
|
|
676
|
-
actualSourceTypeElement.classList.add('network-fetch-details-treeitem');
|
|
677
|
-
const actualSourceType = serviceWorkerRouterInfo.actualSourceType;
|
|
678
|
-
const actualSourceTypeString = String(actualSourceType) || i18nString(UIStrings.unknown);
|
|
679
|
-
actualSourceTypeElement.textContent = i18nString(UIStrings.routerActualSource, {PH1: actualSourceTypeString});
|
|
680
|
-
|
|
681
|
-
const actualSourceTypeTreeElement = new UI.TreeOutline.TreeElement(actualSourceTypeElement);
|
|
682
|
-
detailsView.appendChild(actualSourceTypeTreeElement);
|
|
683
|
-
|
|
684
|
-
return detailsView;
|
|
685
|
-
}
|
|
686
|
-
|
|
687
655
|
set request(request: SDK.NetworkRequest.NetworkRequest) {
|
|
688
656
|
this.#request = request;
|
|
689
657
|
if (this.isShowing()) {
|
|
@@ -170,12 +170,14 @@ export class ResponseHeaderSection extends ResponseHeaderSectionBase {
|
|
|
170
170
|
BlockedReasonDetails.get((this.#request.blockedReason() as Protocol.Network.BlockedReason));
|
|
171
171
|
if (headerWithIssues) {
|
|
172
172
|
if (IssuesManager.RelatedIssue.hasIssueOfCategory(
|
|
173
|
-
this.#request, IssuesManager.Issue.IssueCategory.CROSS_ORIGIN_EMBEDDER_POLICY
|
|
173
|
+
this.#request, IssuesManager.Issue.IssueCategory.CROSS_ORIGIN_EMBEDDER_POLICY,
|
|
174
|
+
IssuesManager.IssuesManager.IssuesManager.instance())) {
|
|
174
175
|
const followLink = (): void => {
|
|
175
176
|
Host.userMetrics.issuesPanelOpenedFrom(Host.UserMetrics.IssueOpener.LEARN_MORE_LINK_COEP);
|
|
176
177
|
if (this.#request) {
|
|
177
|
-
void IssuesManager.RelatedIssue.reveal(
|
|
178
|
-
|
|
178
|
+
void IssuesManager.RelatedIssue.reveal(this.#request,
|
|
179
|
+
IssuesManager.IssuesManager.IssuesManager.instance(),
|
|
180
|
+
IssuesManager.Issue.IssueCategory.CROSS_ORIGIN_EMBEDDER_POLICY);
|
|
179
181
|
}
|
|
180
182
|
};
|
|
181
183
|
if (headerWithIssues.blockedDetails) {
|
|
@@ -1795,8 +1795,8 @@ export class HeapProfileHeader extends ProfileHeader {
|
|
|
1795
1795
|
|
|
1796
1796
|
setupWorker(): void {
|
|
1797
1797
|
console.assert(!this.workerProxy, 'HeapSnapshotWorkerProxy already exists');
|
|
1798
|
-
this.workerProxy =
|
|
1799
|
-
|
|
1798
|
+
this.workerProxy = new HeapSnapshotModel.HeapSnapshotProxy.HeapSnapshotWorkerProxy(
|
|
1799
|
+
this.handleWorkerEvent.bind(this), Common.Console.Console.instance());
|
|
1800
1800
|
this.workerProxy.addEventListener(
|
|
1801
1801
|
HeapSnapshotModel.HeapSnapshotProxy.HeapSnapshotWorkerProxy.Events.WAIT, event => {
|
|
1802
1802
|
this.updateStatus(null, event.data);
|
|
@@ -1836,7 +1836,7 @@ export class HeapProfileHeader extends ProfileHeader {
|
|
|
1836
1836
|
|
|
1837
1837
|
transferChunk(chunk: string): void {
|
|
1838
1838
|
if (!this.bufferedWriter) {
|
|
1839
|
-
this.bufferedWriter = new Bindings.TempFile.TempFile();
|
|
1839
|
+
this.bufferedWriter = new Bindings.TempFile.TempFile(Common.Console.Console.instance());
|
|
1840
1840
|
}
|
|
1841
1841
|
this.bufferedWriter.write([chunk]);
|
|
1842
1842
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Use of this source code is governed by a BSD-style license that can be
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import * as Common from '../../core/common/common.js';
|
|
6
6
|
import * as i18n from '../../core/i18n/i18n.js';
|
|
7
7
|
import * as Platform from '../../core/platform/platform.js';
|
|
8
8
|
import type * as SDK from '../../core/sdk/sdk.js';
|
|
@@ -145,7 +145,7 @@ export class WritableProfileHeader extends ProfileHeader implements Common.Strin
|
|
|
145
145
|
setProtocolProfile(profile: Protocol.Profiler.Profile): void {
|
|
146
146
|
this.setProfile(profile);
|
|
147
147
|
this.protocolProfileInternal = profile;
|
|
148
|
-
this.tempFile = new Bindings.TempFile.TempFile();
|
|
148
|
+
this.tempFile = new Bindings.TempFile.TempFile(Common.Console.Console.instance());
|
|
149
149
|
this.tempFile.write([JSON.stringify(profile)]);
|
|
150
150
|
this.#profileReceivedPromise.resolve();
|
|
151
151
|
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
// Use of this source code is governed by a BSD-style license that can be
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
|
|
5
|
-
import * as UI from '
|
|
6
|
-
import * as Lit from '
|
|
5
|
+
import * as UI from '../../ui/legacy/legacy.js';
|
|
6
|
+
import * as Lit from '../../ui/lit/lit.js';
|
|
7
7
|
|
|
8
8
|
import controlButtonStyles from './controlButton.css.js';
|
|
9
9
|
|
|
@@ -74,13 +74,12 @@ export class ControlButton extends UI.Widget.Widget<ShadowRoot> {
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
override performUpdate(): void {
|
|
77
|
-
this.#view(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
{}, this.contentElement);
|
|
77
|
+
this.#view({
|
|
78
|
+
label: this.#label,
|
|
79
|
+
shape: this.#shape,
|
|
80
|
+
disabled: this.#disabled,
|
|
81
|
+
onClick: this.#onClick,
|
|
82
|
+
},
|
|
83
|
+
{}, this.contentElement);
|
|
85
84
|
}
|
|
86
85
|
}
|
package/front_end/panels/recorder/{components/CreateRecordingView.ts → CreateRecordingView.ts}
RENAMED
|
@@ -2,20 +2,20 @@
|
|
|
2
2
|
// Use of this source code is governed by a BSD-style license that can be
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
|
|
5
|
-
import '
|
|
5
|
+
import '../../ui/kit/kit.js';
|
|
6
6
|
|
|
7
|
-
import * as i18n from '
|
|
8
|
-
import * as Badges from '
|
|
9
|
-
import * as Buttons from '
|
|
10
|
-
import * as Input from '
|
|
11
|
-
import * as UI from '
|
|
12
|
-
import * as Lit from '
|
|
13
|
-
import * as VisualLogging from '
|
|
14
|
-
import * as Models from '../models/models.js';
|
|
15
|
-
import * as Actions from '../recorder-actions/recorder-actions.js';
|
|
7
|
+
import * as i18n from '../../core/i18n/i18n.js';
|
|
8
|
+
import * as Badges from '../../models/badges/badges.js';
|
|
9
|
+
import * as Buttons from '../../ui/components/buttons/buttons.js';
|
|
10
|
+
import * as Input from '../../ui/components/input/input.js';
|
|
11
|
+
import * as UI from '../../ui/legacy/legacy.js';
|
|
12
|
+
import * as Lit from '../../ui/lit/lit.js';
|
|
13
|
+
import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
|
|
16
14
|
|
|
17
15
|
import {ControlButton} from './ControlButton.js';
|
|
18
16
|
import createRecordingViewStyles from './createRecordingView.css.js';
|
|
17
|
+
import * as Models from './models/models.js';
|
|
18
|
+
import * as Actions from './recorder-actions/recorder-actions.js';
|
|
19
19
|
|
|
20
20
|
const {html, Directives: {ref, createRef, repeat}} = Lit;
|
|
21
21
|
|
|
@@ -97,7 +97,7 @@ const UIStrings = {
|
|
|
97
97
|
learnMore: 'Learn more',
|
|
98
98
|
} as const;
|
|
99
99
|
const str_ = i18n.i18n.registerUIStrings(
|
|
100
|
-
'panels/recorder/
|
|
100
|
+
'panels/recorder/CreateRecordingView.ts',
|
|
101
101
|
UIStrings,
|
|
102
102
|
);
|
|
103
103
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
@@ -301,9 +301,11 @@ export class CreateRecordingView extends UI.Widget.Widget {
|
|
|
301
301
|
#output: ViewOutput = {};
|
|
302
302
|
#recorderSettings?: Models.RecorderSettings.RecorderSettings;
|
|
303
303
|
|
|
304
|
-
onRecordingStarted:
|
|
305
|
-
|
|
306
|
-
|
|
304
|
+
onRecordingStarted: (data: {
|
|
305
|
+
name: string,
|
|
306
|
+
selectorTypesToRecord: Models.Schema.SelectorType[],
|
|
307
|
+
selectorAttribute?: string,
|
|
308
|
+
}) => void = () => {};
|
|
307
309
|
onRecordingCancelled = (): void => {};
|
|
308
310
|
|
|
309
311
|
set recorderSettings(value: Models.RecorderSettings.RecorderSettings) {
|
|
@@ -373,39 +375,38 @@ export class CreateRecordingView extends UI.Widget.Widget {
|
|
|
373
375
|
}
|
|
374
376
|
|
|
375
377
|
override performUpdate(): void {
|
|
376
|
-
this.#view(
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
};
|
|
395
|
-
}
|
|
396
|
-
return item;
|
|
397
|
-
});
|
|
378
|
+
this.#view({
|
|
379
|
+
name: this.#name,
|
|
380
|
+
selectorAttribute: this.#selectorAttribute,
|
|
381
|
+
selectorTypes: this.#selectorTypes,
|
|
382
|
+
error: this.#error,
|
|
383
|
+
onRecordingCancelled: this.onRecordingCancelled,
|
|
384
|
+
onUpdate: update => {
|
|
385
|
+
if ('name' in update) {
|
|
386
|
+
this.#name = update.name;
|
|
387
|
+
} else if ('selectorAttribute' in update) {
|
|
388
|
+
this.#selectorAttribute = update.selectorAttribute;
|
|
389
|
+
} else {
|
|
390
|
+
this.#selectorTypes = this.#selectorTypes.map(item => {
|
|
391
|
+
if (item.selectorType === update.selectorType) {
|
|
392
|
+
return {
|
|
393
|
+
...item,
|
|
394
|
+
checked: update.checked,
|
|
395
|
+
};
|
|
398
396
|
}
|
|
399
|
-
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
this
|
|
397
|
+
return item;
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
this.requestUpdate();
|
|
401
|
+
},
|
|
402
|
+
onRecordingStarted: (): void => {
|
|
403
|
+
this.startRecording();
|
|
404
|
+
},
|
|
405
|
+
onErrorReset: () => {
|
|
406
|
+
this.#error = undefined;
|
|
407
|
+
this.requestUpdate();
|
|
408
|
+
},
|
|
409
|
+
},
|
|
410
|
+
this.#output, this.contentElement);
|
|
410
411
|
}
|
|
411
412
|
}
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
// Use of this source code is governed by a BSD-style license that can be
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
|
|
5
|
-
import * as i18n from '
|
|
6
|
-
import type * as PublicExtensions from '
|
|
7
|
-
import * as Buttons from '
|
|
8
|
-
import * as UI from '
|
|
9
|
-
import * as Lit from '
|
|
10
|
-
import * as VisualLogging from '
|
|
11
|
-
import * as Extensions from '../extensions/extensions.js';
|
|
5
|
+
import * as i18n from '../../core/i18n/i18n.js';
|
|
6
|
+
import type * as PublicExtensions from '../../models/extensions/extensions.js';
|
|
7
|
+
import * as Buttons from '../../ui/components/buttons/buttons.js';
|
|
8
|
+
import * as UI from '../../ui/legacy/legacy.js';
|
|
9
|
+
import * as Lit from '../../ui/lit/lit.js';
|
|
10
|
+
import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
|
|
12
11
|
|
|
12
|
+
import * as Extensions from './extensions/extensions.js';
|
|
13
13
|
import extensionViewStyles from './extensionView.css.js';
|
|
14
14
|
|
|
15
15
|
const {html} = Lit;
|
|
@@ -24,7 +24,7 @@ const UIStrings = {
|
|
|
24
24
|
*/
|
|
25
25
|
extension: 'Content provided by a browser extension',
|
|
26
26
|
} as const;
|
|
27
|
-
const str_ = i18n.i18n.registerUIStrings('panels/recorder/
|
|
27
|
+
const str_ = i18n.i18n.registerUIStrings('panels/recorder/ExtensionView.ts', UIStrings);
|
|
28
28
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
|
29
29
|
|
|
30
30
|
export interface ViewInput {
|