chrome-devtools-frontend 1.0.947377 → 1.0.948295

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 (97) hide show
  1. package/config/gni/all_devtools_files.gni +1 -6
  2. package/config/gni/devtools_grd_files.gni +5 -6
  3. package/config/gni/devtools_image_files.gni +1 -0
  4. package/front_end/.eslintrc.js +1 -0
  5. package/front_end/Images/src/circled_backslash_icon.svg +3 -0
  6. package/front_end/core/host/UserMetrics.ts +1 -1
  7. package/front_end/core/i18n/locales/en-US.json +17 -14
  8. package/front_end/core/i18n/locales/en-XL.json +17 -14
  9. package/front_end/core/platform/platform.ts +0 -2
  10. package/front_end/core/platform/string-utilities.ts +14 -1
  11. package/front_end/core/platform/utilities.ts +0 -29
  12. package/front_end/core/root/Runtime.ts +4 -207
  13. package/front_end/core/sdk/Cookie.ts +0 -21
  14. package/front_end/core/sdk/sdk-legacy.ts +0 -3
  15. package/front_end/entrypoints/devtools_app/{devtools_app-meta-files.ts → devtools_app.ts} +9 -2
  16. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +2 -1
  17. package/front_end/entrypoints/js_app/{JsMain.ts → js_app.ts} +5 -1
  18. package/front_end/entrypoints/main/MainImpl.ts +0 -1
  19. package/front_end/entrypoints/ndb_app/{ndb_app.js → ndb_app.ts} +0 -2
  20. package/front_end/entrypoints/node_app/node_app.ts +1 -3
  21. package/front_end/entrypoints/shell/{shell.js → shell.ts} +0 -2
  22. package/front_end/entrypoints/worker_app/worker_app.ts +1 -3
  23. package/front_end/legacy/legacy-defs.d.ts +0 -4
  24. package/front_end/legacy_test_runner/test_runner/TestRunner.js +35 -59
  25. package/front_end/models/issues_manager/CorsIssue.ts +15 -15
  26. package/front_end/models/issues_manager/descriptions/{corsInsecurePrivateNetworkPreflight.md → corsPreflightAllowPrivateNetworkError.md} +1 -1
  27. package/front_end/panels/accessibility/AccessibilitySidebarView.ts +3 -1
  28. package/front_end/panels/application/BackForwardCacheStrings.ts +1 -5
  29. package/front_end/panels/application/BackForwardCacheView.ts +150 -58
  30. package/front_end/panels/application/ResourcesPanel.ts +0 -42
  31. package/front_end/panels/application/application-legacy.ts +0 -3
  32. package/front_end/panels/application/application-meta.ts +0 -13
  33. package/front_end/panels/application/backForwardCacheView.css +44 -6
  34. package/front_end/panels/application/components/FrameDetailsView.ts +3 -3
  35. package/front_end/panels/application/components/OriginTrialTreeView.ts +3 -3
  36. package/front_end/panels/application/components/StackTrace.ts +1 -1
  37. package/front_end/panels/coverage/CoverageView.ts +1 -1
  38. package/front_end/panels/css_overview/components/cssOverviewStartView.css +1 -0
  39. package/front_end/panels/css_overview/cssOverviewCompletedView.css +1 -1
  40. package/front_end/panels/developer_resources/DeveloperResourcesView.ts +2 -1
  41. package/front_end/panels/elements/ElementsPanel.ts +9 -1
  42. package/front_end/panels/elements/ElementsTreeElement.ts +1 -1
  43. package/front_end/panels/elements/components/ElementsBreadcrumbs.ts +1 -1
  44. package/front_end/panels/issues/CorsIssueDetailsView.ts +20 -8
  45. package/front_end/panels/network/NetworkWaterfallColumn.ts +2 -0
  46. package/front_end/panels/profiler/CPUProfileFlameChart.ts +3 -1
  47. package/front_end/panels/profiler/ProfileDataGrid.ts +2 -1
  48. package/front_end/panels/settings/components/SyncSection.ts +2 -2
  49. package/front_end/panels/settings/emulation/components/UserAgentClientHintsForm.ts +46 -46
  50. package/front_end/panels/timeline/TimelineTreeView.ts +2 -1
  51. package/front_end/ui/components/diff_view/DiffView.ts +4 -4
  52. package/front_end/ui/components/helpers/component-server-setup.ts +1 -12
  53. package/front_end/ui/components/helpers/helpers.ts +0 -2
  54. package/front_end/ui/components/icon_button/IconButton.ts +1 -1
  55. package/front_end/ui/components/issue_counter/IssueCounter.ts +2 -2
  56. package/front_end/ui/components/linear_memory_inspector/LinearMemoryViewer.ts +3 -3
  57. package/front_end/ui/components/markdown_view/MarkdownView.ts +4 -4
  58. package/front_end/ui/components/panel_feedback/PreviewToggle.ts +98 -0
  59. package/front_end/ui/components/panel_feedback/panel_feedback.ts +1 -0
  60. package/front_end/ui/components/panel_feedback/previewToggle.css +24 -0
  61. package/front_end/ui/components/report_view/ReportView.ts +22 -0
  62. package/front_end/ui/components/report_view/reportSection.css +20 -0
  63. package/front_end/ui/components/request_link_icon/RequestLinkIcon.ts +1 -1
  64. package/front_end/ui/components/settings/SettingCheckbox.ts +2 -2
  65. package/front_end/ui/components/text_editor/config.ts +4 -3
  66. package/front_end/ui/components/text_editor/javascript.ts +8 -4
  67. package/front_end/ui/components/text_prompt/TextPrompt.ts +2 -2
  68. package/front_end/ui/legacy/GlassPane.ts +1 -1
  69. package/front_end/ui/legacy/SearchableView.ts +2 -1
  70. package/front_end/ui/legacy/Treeoutline.ts +1 -1
  71. package/front_end/ui/legacy/Widget.ts +1 -1
  72. package/front_end/ui/legacy/XWidget.ts +0 -5
  73. package/front_end/ui/legacy/components/inline_editor/CSSVarSwatch.ts +2 -2
  74. package/front_end/ui/legacy/components/inline_editor/ColorSwatch.ts +1 -1
  75. package/front_end/ui/legacy/utils/append-style.ts +2 -13
  76. package/front_end/ui/legacy/utils/create-shadow-root-with-core-styles.ts +7 -5
  77. package/package.json +2 -4
  78. package/scripts/build/build_inspector_overlay.py +15 -1
  79. package/scripts/build/rjsmin.py +84 -115
  80. package/scripts/eslint_rules/lib/lit_html_no_attribute_quotes.js +101 -0
  81. package/scripts/eslint_rules/lib/no_only_eslint_tests.js +53 -0
  82. package/scripts/eslint_rules/tests/.eslintrc.js +14 -0
  83. package/scripts/eslint_rules/tests/lit_html_no_attribute_quotes_test.js +45 -0
  84. package/scripts/eslint_rules/tests/no_only_eslint_tests_test.js +94 -0
  85. package/front_end/entrypoints/devtools_app/devtools_app.js +0 -11
  86. package/front_end/entrypoints/devtools_app/devtools_app.json +0 -4
  87. package/front_end/entrypoints/js_app/js_app.js +0 -12
  88. package/front_end/entrypoints/js_app/js_app.json +0 -3
  89. package/front_end/entrypoints/ndb_app/ndb_app.json +0 -4
  90. package/front_end/entrypoints/startup/RuntimeInstantiator.ts +0 -95
  91. package/front_end/entrypoints/startup/startup.ts +0 -9
  92. package/front_end/ui/components/helpers/get-stylesheet.ts +0 -45
  93. package/scripts/build/build_release_applications.py +0 -216
  94. package/scripts/build/modular_build.py +0 -184
  95. package/scripts/check_gn.js +0 -119
  96. package/scripts/json_validator/module.schema.json +0 -19
  97. package/scripts/json_validator/validate_module_json.js +0 -44
@@ -174,11 +174,16 @@ export class CorsIssueDetailsView extends AffectedResourcesView {
174
174
  this.appendColumnTitle(header, i18nString(UIStrings.allowCredentialsValueFromHeader));
175
175
  break;
176
176
  case IssuesManager.CorsIssue.IssueCode.InsecurePrivateNetwork:
177
- case IssuesManager.CorsIssue.IssueCode.InsecurePrivateNetworkPreflight:
178
177
  this.appendColumnTitle(header, i18nString(UIStrings.resourceAddressSpace));
179
178
  this.appendColumnTitle(header, i18nString(UIStrings.initiatorAddressSpace));
180
179
  this.appendColumnTitle(header, i18nString(UIStrings.initiatorContext));
181
180
  break;
181
+ case IssuesManager.CorsIssue.IssueCode.PreflightAllowPrivateNetworkError:
182
+ this.appendColumnTitle(header, i18nString(UIStrings.preflightRequest));
183
+ this.appendColumnTitle(header, i18nString(UIStrings.invalidValue));
184
+ this.appendColumnTitle(header, i18nString(UIStrings.initiatorAddressSpace));
185
+ this.appendColumnTitle(header, i18nString(UIStrings.initiatorContext));
186
+ break;
182
187
  case IssuesManager.CorsIssue.IssueCode.MethodDisallowedByPreflightResponse:
183
188
  this.appendColumnTitle(header, i18nString(UIStrings.preflightRequest));
184
189
  this.appendColumnTitle(header, i18nString(UIStrings.disallowedRequestMethod));
@@ -207,9 +212,7 @@ export class CorsIssueDetailsView extends AffectedResourcesView {
207
212
  IssuesManager.CorsIssue.IssueCode.PreflightInvalidAllowExternal|
208
213
  IssuesManager.CorsIssue.IssueCode.InvalidResponse|
209
214
  IssuesManager.CorsIssue.IssueCode.InvalidPrivateNetworkAccess|
210
- IssuesManager.CorsIssue.IssueCode.UnexpectedPrivateNetworkAccess|
211
- IssuesManager.CorsIssue.IssueCode.PreflightMissingAllowPrivateNetwork|
212
- IssuesManager.CorsIssue.IssueCode.PreflightInvalidAllowPrivateNetwork>(issueCode);
215
+ IssuesManager.CorsIssue.IssueCode.UnexpectedPrivateNetworkAccess>(issueCode);
213
216
  }
214
217
 
215
218
  this.affectedResources.appendChild(header);
@@ -251,6 +254,9 @@ export class CorsIssueDetailsView extends AffectedResourcesView {
251
254
  case Protocol.Network.CorsError.InvalidAllowCredentials:
252
255
  case Protocol.Network.CorsError.PreflightInvalidAllowCredentials:
253
256
  return 'Access-Control-Allow-Credentials';
257
+ case Protocol.Network.CorsError.PreflightMissingAllowPrivateNetwork:
258
+ case Protocol.Network.CorsError.PreflightInvalidAllowPrivateNetwork:
259
+ return 'Access-Control-Allow-Private-Network';
254
260
  case Protocol.Network.CorsError.RedirectContainsCredentials:
255
261
  case Protocol.Network.CorsError.PreflightDisallowedRedirect:
256
262
  return 'Location';
@@ -362,13 +368,21 @@ export class CorsIssueDetailsView extends AffectedResourcesView {
362
368
  this.appendIssueDetailCell(element, details.corsErrorStatus.failedParameter, 'code-example');
363
369
  break;
364
370
  case IssuesManager.CorsIssue.IssueCode.InsecurePrivateNetwork:
365
- case IssuesManager.CorsIssue.IssueCode.InsecurePrivateNetworkPreflight:
366
371
  element.appendChild(this.createRequestCell(details.request, opts));
367
372
  this.appendStatus(element, details.isWarning);
368
373
  this.appendIssueDetailCell(element, details.resourceIPAddressSpace ?? '');
369
374
  this.appendIssueDetailCell(element, details.clientSecurityState?.initiatorIPAddressSpace ?? '');
370
375
  this.appendSecureContextCell(element, details.clientSecurityState?.initiatorIsSecureContext);
371
376
  break;
377
+ case IssuesManager.CorsIssue.IssueCode.PreflightAllowPrivateNetworkError: {
378
+ element.appendChild(this.createRequestCell(details.request, opts));
379
+ this.appendStatus(element, details.isWarning);
380
+ element.appendChild(this.createRequestCell(details.request, {...opts, linkToPreflight: true, highlightHeader}));
381
+ this.appendIssueDetailCell(element, details.corsErrorStatus.failedParameter, 'code-example');
382
+ this.appendIssueDetailCell(element, details.clientSecurityState?.initiatorIPAddressSpace ?? '');
383
+ this.appendSecureContextCell(element, details.clientSecurityState?.initiatorIsSecureContext);
384
+ break;
385
+ }
372
386
  case IssuesManager.CorsIssue.IssueCode.MethodDisallowedByPreflightResponse:
373
387
  element.appendChild(this.createRequestCell(details.request, opts));
374
388
  this.appendStatus(element, details.isWarning);
@@ -435,9 +449,7 @@ export class CorsIssueDetailsView extends AffectedResourcesView {
435
449
  IssuesManager.CorsIssue.IssueCode.PreflightInvalidAllowExternal|
436
450
  IssuesManager.CorsIssue.IssueCode.InvalidResponse|
437
451
  IssuesManager.CorsIssue.IssueCode.InvalidPrivateNetworkAccess|
438
- IssuesManager.CorsIssue.IssueCode.UnexpectedPrivateNetworkAccess|
439
- IssuesManager.CorsIssue.IssueCode.PreflightMissingAllowPrivateNetwork|
440
- IssuesManager.CorsIssue.IssueCode.PreflightInvalidAllowPrivateNetwork>(issueCode);
452
+ IssuesManager.CorsIssue.IssueCode.UnexpectedPrivateNetworkAccess>(issueCode);
441
453
  break;
442
454
  }
443
455
 
@@ -16,6 +16,7 @@ import {RequestTimeRangeNameToColor} from './NetworkOverview.js';
16
16
  import type {Label, NetworkTimeCalculator} from './NetworkTimeCalculator.js';
17
17
  import type {RequestTimeRange} from './RequestTimingView.js';
18
18
  import {RequestTimeRangeNames, RequestTimingView} from './RequestTimingView.js';
19
+ import networkingTimingTableStyles from './networkTimingTable.css.js';
19
20
 
20
21
  const BAR_SPACING = 1;
21
22
 
@@ -271,6 +272,7 @@ export class NetworkWaterfallColumn extends UI.Widget.VBox {
271
272
  show: (popover: UI.GlassPane.GlassPane): Promise<true> => {
272
273
  const content =
273
274
  RequestTimingView.createTimingTable((request as SDK.NetworkRequest.NetworkRequest), this.calculator);
275
+ popover.registerCSSFiles([networkingTimingTableStyles]);
274
276
  popover.contentElement.appendChild(content);
275
277
  return Promise.resolve(true);
276
278
  },
@@ -30,6 +30,7 @@
30
30
 
31
31
  import * as Common from '../../core/common/common.js';
32
32
  import * as Host from '../../core/host/host.js';
33
+ import * as Platform from '../../core/platform/platform.js';
33
34
  import * as PerfUI from '../../ui/legacy/components/perf_ui/perf_ui.js';
34
35
  import type * as SDK from '../../core/sdk/sdk.js';
35
36
  import * as UI from '../../ui/legacy/legacy.js';
@@ -217,7 +218,8 @@ export class CPUProfileFlameChart extends
217
218
  }
218
219
 
219
220
  performSearch(searchConfig: UI.SearchableView.SearchConfig, _shouldJump: boolean, jumpBackwards?: boolean): void {
220
- const matcher = createPlainTextSearchRegex(searchConfig.query, searchConfig.caseSensitive ? '' : 'i');
221
+ const matcher =
222
+ Platform.StringUtilities.createPlainTextSearchRegex(searchConfig.query, searchConfig.caseSensitive ? '' : 'i');
221
223
 
222
224
  const selectedEntryIndex: number = this.searchResultIndex !== -1 ? this.searchResults[this.searchResultIndex] : -1;
223
225
  this.searchResults = [];
@@ -28,6 +28,7 @@
28
28
  */
29
29
 
30
30
  import * as i18n from '../../core/i18n/i18n.js';
31
+ import * as Platform from '../../core/platform/platform.js';
31
32
  import * as DataGrid from '../../ui/legacy/components/data_grid/data_grid.js';
32
33
 
33
34
  import type * as SDK from '../../core/sdk/sdk.js';
@@ -528,7 +529,7 @@ export class ProfileDataGridTree implements UI.SearchableView.Searchable {
528
529
  equalTo = true;
529
530
  }
530
531
 
531
- const matcher = createPlainTextSearchRegex(query, 'i');
532
+ const matcher = Platform.StringUtilities.createPlainTextSearchRegex(query, 'i');
532
533
 
533
534
  function matchesQuery(profileDataGridNode: ProfileDataGridNode): boolean {
534
535
  profileDataGridNode.searchMatchedSelfColumn = false;
@@ -92,7 +92,7 @@ function renderAccountInfoOrWarning(syncInfo: Host.InspectorFrontendHostAPI.Sync
92
92
  // clang-format off
93
93
  return LitHtml.html`
94
94
  <span class="warning">
95
- ${i18nString(UIStrings.syncDisabled)} <a href="${link}" class="link" target="_blank"
95
+ ${i18nString(UIStrings.syncDisabled)} <a href=${link} class="link" target="_blank"
96
96
  @click=${(e: Event): void => openSettingsTab(link, e)}
97
97
  @keydown=${(e: Event): void => openSettingsTab(link, e)}>${i18nString(UIStrings.settings)}</x-link>
98
98
  </span>`;
@@ -104,7 +104,7 @@ function renderAccountInfoOrWarning(syncInfo: Host.InspectorFrontendHostAPI.Sync
104
104
  // clang-format off
105
105
  return LitHtml.html`
106
106
  <span class="warning">
107
- ${i18nString(UIStrings.preferencesSyncDisabled)} <a href="${link}" class="link" target="_blank"
107
+ ${i18nString(UIStrings.preferencesSyncDisabled)} <a href=${link} class="link" target="_blank"
108
108
  @click=${(e: Event): void => openSettingsTab(link, e)}
109
109
  @keydown=${(e: Event): void => openSettingsTab(link, e)}>${i18nString(UIStrings.settings)}</x-link>
110
110
  </span>`;
@@ -356,9 +356,9 @@ export class UserAgentClientHintsForm extends HTMLElement {
356
356
  <input
357
357
  class="input-field"
358
358
  type="text"
359
- @input="${handleInputChange}"
360
- .value="${value}"
361
- placeholder="${placeholder}"
359
+ @input=${handleInputChange}
360
+ .value=${value}
361
+ placeholder=${placeholder}
362
362
  />
363
363
  </label>
364
364
  `;
@@ -376,22 +376,22 @@ export class UserAgentClientHintsForm extends HTMLElement {
376
376
  };
377
377
  return LitHtml.html`
378
378
  <span class="full-row label">${i18nString(UIStrings.platformLabel)}</span>
379
- <div class="full-row brand-row" aria-label="${i18nString(UIStrings.platformProperties)}" role="group">
379
+ <div class="full-row brand-row" aria-label=${i18nString(UIStrings.platformProperties)} role="group">
380
380
  <input
381
381
  class="input-field half-row"
382
382
  type="text"
383
- @input="${handlePlatformNameChange}"
384
- .value="${platform}"
385
- placeholder="${i18nString(UIStrings.platformPlaceholder)}"
386
- aria-label="${i18nString(UIStrings.platformLabel)}"
383
+ @input=${handlePlatformNameChange}
384
+ .value=${platform}
385
+ placeholder=${i18nString(UIStrings.platformPlaceholder)}
386
+ aria-label=${i18nString(UIStrings.platformLabel)}
387
387
  />
388
388
  <input
389
389
  class="input-field half-row"
390
390
  type="text"
391
- @input="${handlePlatformVersionChange}"
392
- .value="${platformVersion}"
393
- placeholder="${i18nString(UIStrings.platformVersion)}"
394
- aria-label="${i18nString(UIStrings.platformVersion)}"
391
+ @input=${handlePlatformVersionChange}
392
+ .value=${platformVersion}
393
+ placeholder=${i18nString(UIStrings.platformVersion)}
394
+ aria-label=${i18nString(UIStrings.platformVersion)}
395
395
  />
396
396
  </div>
397
397
  `;
@@ -409,20 +409,20 @@ export class UserAgentClientHintsForm extends HTMLElement {
409
409
  };
410
410
  const mobileCheckboxInput = this.showMobileCheckbox ? LitHtml.html`
411
411
  <label class="mobile-checkbox-container">
412
- <input type="checkbox" @input="${handleMobileChange}" .checked="${mobile}" />
412
+ <input type="checkbox" @input=${handleMobileChange} .checked=${mobile} />
413
413
  ${i18nString(UIStrings.mobileCheckboxLabel)}
414
414
  </label>
415
415
  ` :
416
416
  LitHtml.html``;
417
417
  return LitHtml.html`
418
418
  <span class="full-row label">${i18nString(UIStrings.deviceModel)}</span>
419
- <div class="full-row brand-row" aria-label="${i18nString(UIStrings.deviceProperties)}" role="group">
419
+ <div class="full-row brand-row" aria-label=${i18nString(UIStrings.deviceProperties)} role="group">
420
420
  <input
421
421
  class="input-field ${this.showMobileCheckbox ? 'device-model-input' : 'full-row'}"
422
422
  type="text"
423
- @input="${handleDeviceModelChange}"
424
- .value="${model}"
425
- placeholder="${i18nString(UIStrings.deviceModel)}"
423
+ @input=${handleDeviceModelChange}
424
+ .value=${model}
425
+ placeholder=${i18nString(UIStrings.deviceModel)}
426
426
  />
427
427
  ${mobileCheckboxInput}
428
428
  </div>
@@ -459,41 +459,41 @@ export class UserAgentClientHintsForm extends HTMLElement {
459
459
  this.handleBrandInputChange(value, index, 'brandVersion');
460
460
  };
461
461
  return LitHtml.html`
462
- <div class="full-row brand-row" aria-label="${i18nString(UIStrings.brandProperties)}" role="group">
462
+ <div class="full-row brand-row" aria-label=${i18nString(UIStrings.brandProperties)} role="group">
463
463
  <input
464
464
  class="input-field brand-name-input"
465
465
  type="text"
466
- @input="${handleBrandBrowserChange}"
467
- .value="${brand}"
466
+ @input=${handleBrandBrowserChange}
467
+ .value=${brand}
468
468
  id="brand-${index + 1}-input"
469
- placeholder="${i18nString(UIStrings.brandName)}"
470
- aria-label="${i18nString(UIStrings.brandNameAriaLabel, {
469
+ placeholder=${i18nString(UIStrings.brandName)}
470
+ aria-label=${i18nString(UIStrings.brandNameAriaLabel, {
471
471
  PH1: index + 1,
472
- })}"
472
+ })}
473
473
  />
474
474
  <input
475
475
  class="input-field"
476
476
  type="text"
477
- @input="${handleBrandVersionChange}"
478
- .value="${version}"
479
- placeholder="${i18nString(UIStrings.version)}"
480
- aria-label="${i18nString(UIStrings.brandVersionAriaLabel, {
477
+ @input=${handleBrandVersionChange}
478
+ .value=${version}
479
+ placeholder=${i18nString(UIStrings.version)}
480
+ aria-label=${i18nString(UIStrings.brandVersionAriaLabel, {
481
481
  PH1: index + 1,
482
- })}"
482
+ })}
483
483
  />
484
484
  <${IconButton.Icon.Icon.litTagName}
485
485
  .data=${
486
486
  {color: 'var(--client-hints-form-icon-color)', iconName: 'trash_bin_icon', width: '10px', height: '14px'} as
487
487
  IconButton.Icon.IconData}
488
- title="${i18nString(UIStrings.deleteTooltip)}"
488
+ title=${i18nString(UIStrings.deleteTooltip)}
489
489
  class="delete-icon"
490
490
  tabindex="0"
491
491
  role="button"
492
- @click="${handleDeleteClick}"
493
- @keypress="${handleKeyPress}"
494
- aria-label="${i18nString(UIStrings.brandDeleteAriaLabel, {
492
+ @click=${handleDeleteClick}
493
+ @keypress=${handleKeyPress}
494
+ aria-label=${i18nString(UIStrings.brandDeleteAriaLabel, {
495
495
  PH1: index + 1,
496
- })}"
496
+ })}
497
497
  >
498
498
  </${IconButton.Icon.Icon.litTagName}>
499
499
  </div>
@@ -507,9 +507,9 @@ export class UserAgentClientHintsForm extends HTMLElement {
507
507
  role="button"
508
508
  tabindex="0"
509
509
  id="add-brand-button"
510
- aria-label="${i18nString(UIStrings.addBrand)}"
511
- @click="${this.handleAddBrandClick}"
512
- @keypress="${this.handleAddBrandKeyPress}"
510
+ aria-label=${i18nString(UIStrings.addBrand)}
511
+ @click=${this.handleAddBrandClick}
512
+ @keypress=${this.handleAddBrandKeyPress}
513
513
  >
514
514
  <${IconButton.Icon.Icon.litTagName}
515
515
  aria-hidden="true"
@@ -547,16 +547,16 @@ export class UserAgentClientHintsForm extends HTMLElement {
547
547
  <div
548
548
  class="tree-title"
549
549
  role="button"
550
- @click="${this.handleTreeClick}"
550
+ @click=${this.handleTreeClick}
551
551
  tabindex="0"
552
- @keydown="${this.handleTreeExpand}"
553
- aria-expanded="${this.isFormOpened}"
552
+ @keydown=${this.handleTreeExpand}
553
+ aria-expanded=${this.isFormOpened}
554
554
  aria-controls="form-container"
555
- @disabled="${this.isFormDisabled}"
556
- aria-disabled="${this.isFormDisabled}"
555
+ @disabled=${this.isFormDisabled}
556
+ aria-disabled=${this.isFormDisabled}
557
557
  >
558
558
  <${IconButton.Icon.Icon.litTagName}
559
- class="${this.isFormOpened ? '' : 'rotate-icon'}"
559
+ class=${this.isFormOpened ? '' : 'rotate-icon'}
560
560
  .data=${
561
561
  {color: 'var(--client-hints-form-icon-color)', iconName: 'chromeSelect', width: '20px'} as
562
562
  IconButton.Icon.IconData}
@@ -568,8 +568,8 @@ export class UserAgentClientHintsForm extends HTMLElement {
568
568
  href="https://web.dev/user-agent-client-hints/"
569
569
  target="_blank"
570
570
  class="info-link"
571
- @keypress="${this.handleLinkPress}"
572
- aria-label="${i18nString(UIStrings.userAgentClientHintsInfo)}"
571
+ @keypress=${this.handleLinkPress}
572
+ aria-label=${i18nString(UIStrings.userAgentClientHintsInfo)}
573
573
  >
574
574
  <${IconButton.Icon.Icon.litTagName}
575
575
  .data=${
@@ -582,7 +582,7 @@ export class UserAgentClientHintsForm extends HTMLElement {
582
582
  <form
583
583
  id="form-container"
584
584
  class="form-container ${this.isFormOpened ? '' : 'hide-container'}"
585
- @submit="${this.handleSubmit}"
585
+ @submit=${this.handleSubmit}
586
586
  >
587
587
  ${brandSection}
588
588
  ${fullBrowserInput}
@@ -591,7 +591,7 @@ export class UserAgentClientHintsForm extends HTMLElement {
591
591
  ${deviceModelSection}
592
592
  ${submitButton}
593
593
  </form>
594
- <div aria-live="polite" aria-label="${this.brandsModifiedAriaMessage}"></div>
594
+ <div aria-live="polite" aria-label=${this.brandsModifiedAriaMessage}></div>
595
595
  </section>
596
596
  `;
597
597
  // clang-format off
@@ -284,7 +284,8 @@ export class TimelineTreeView extends UI.Widget.VBox implements UI.SearchableVie
284
284
  new UI.Toolbar.ToolbarInput(i18nString(UIStrings.filter), this.getToolbarInputAccessiblePlaceHolder());
285
285
  textFilterUI.addEventListener(UI.Toolbar.ToolbarInput.Event.TextChanged, () => {
286
286
  const searchQuery = textFilterUI.value();
287
- this.textFilterInternal.setRegExp(searchQuery ? createPlainTextSearchRegex(searchQuery, 'i') : null);
287
+ this.textFilterInternal.setRegExp(
288
+ searchQuery ? Platform.StringUtilities.createPlainTextSearchRegex(searchQuery, 'i') : null);
288
289
  this.refreshTree();
289
290
  }, this);
290
291
  this.textFilterUI = textFilterUI;
@@ -191,7 +191,7 @@ class DiffRenderer {
191
191
 
192
192
  private render(rows: readonly Row[]): LitHtml.TemplateResult {
193
193
  return LitHtml.html`
194
- <div class="diff-listing" aria-label="${i18nString(UIStrings.changesDiffViewer)}">
194
+ <div class="diff-listing" aria-label=${i18nString(UIStrings.changesDiffViewer)}>
195
195
  ${rows.map(row => this.renderRow(row))}
196
196
  </div>`;
197
197
  }
@@ -213,7 +213,7 @@ class DiffRenderer {
213
213
  return LitHtml.html`
214
214
  <div class="diff-line-number" aria-hidden="true">${baseNumber}</div>
215
215
  <div class="diff-line-number" aria-hidden="true">${curNumber}</div>
216
- <div class="${markerClass}" aria-hidden="true">${marker}</div>
216
+ <div class=${markerClass} aria-hidden="true">${marker}</div>
217
217
  <div class="diff-line-content diff-line-${row.type}" data-line-number=${curNumber}>${screenReaderText}${
218
218
  this.renderRowContent(row)}</div>`;
219
219
  }
@@ -230,10 +230,10 @@ class DiffRenderer {
230
230
  for (const token of row.tokens) {
231
231
  const tokenContent: (LitHtml.TemplateResult|string)[] = [];
232
232
  doc.highlightRange(pos, pos + token.text.length, (text, style) => {
233
- tokenContent.push(style ? LitHtml.html`<span class="${style}">${text}</span>` : text);
233
+ tokenContent.push(style ? LitHtml.html`<span class=${style}>${text}</span>` : text);
234
234
  });
235
235
  content.push(
236
- token.className ? LitHtml.html`<span class="${token.className}">${tokenContent}</span>` :
236
+ token.className ? LitHtml.html`<span class=${token.className}>${tokenContent}</span>` :
237
237
  LitHtml.html`${tokenContent}`);
238
238
  pos += token.text.length;
239
239
  }
@@ -3,28 +3,17 @@
3
3
  // found in the LICENSE file.
4
4
 
5
5
  import type * as Common from '../../../core/common/common.js';
6
- import * as Root from '../../../core/root/root.js';
7
6
  import * as ThemeSupport from '../../legacy/theme_support/theme_support.js';
8
7
 
9
- import {CSS_RESOURCES_TO_LOAD_INTO_RUNTIME} from './get-stylesheet.js';
10
-
11
8
  /**
12
9
  * Houses any setup required to run the component docs server. Currently this is
13
10
  * only populating the runtime CSS cache but may be extended in the future.
14
11
  */
15
- export async function setup(resourcesPrefix = ''): Promise<void> {
12
+ export async function setup(): Promise<void> {
16
13
  const setting = {
17
14
  get() {
18
15
  return 'default';
19
16
  },
20
17
  } as Common.Settings.Setting<string>;
21
18
  ThemeSupport.ThemeSupport.instance({forceNew: true, setting});
22
-
23
- const allPromises = CSS_RESOURCES_TO_LOAD_INTO_RUNTIME.map(resourcePath => {
24
- return fetch(resourcesPrefix + '/front_end/' + resourcePath).then(response => response.text()).then(cssText => {
25
- Root.Runtime.cachedResources.set(resourcePath, cssText);
26
- });
27
- });
28
-
29
- await Promise.all(allPromises);
30
19
  }
@@ -6,7 +6,6 @@ import * as ComponentServerSetup from './component-server-setup.js';
6
6
  import * as CustomElements from './custom-elements.js';
7
7
  import * as Directives from './directives.js';
8
8
  import * as GetRootNode from './get-root-node.js';
9
- import * as LegacyGetStylesheet from './get-stylesheet.js';
10
9
  import * as ScheduledRender from './scheduled-render.js';
11
10
  import * as SetCSSProperty from './set-css-property.js';
12
11
 
@@ -15,7 +14,6 @@ export {
15
14
  CustomElements,
16
15
  Directives,
17
16
  GetRootNode,
18
- LegacyGetStylesheet,
19
17
  ScheduledRender,
20
18
  SetCSSProperty,
21
19
  };
@@ -80,7 +80,7 @@ export class IconButton extends HTMLElement {
80
80
  // Disabled until https://crbug.com/1079231 is fixed.
81
81
  // clang-format off
82
82
  LitHtml.render(LitHtml.html`
83
- <button class="${buttonClasses}" @click=${this.onClickHandler} aria-label="${LitHtml.Directives.ifDefined(this.#accessibleName)}">
83
+ <button class=${buttonClasses} @click=${this.onClickHandler} aria-label=${LitHtml.Directives.ifDefined(this.#accessibleName)}>
84
84
  ${(!this.#compact && this.#leadingText) ? LitHtml.html`<span class="icon-button-title">${this.#leadingText}</span>` : LitHtml.nothing}
85
85
  ${filteredGroups.map(counter =>
86
86
  LitHtml.html`
@@ -192,8 +192,8 @@ export class IssueCounter extends HTMLElement {
192
192
  };
193
193
  LitHtml.render(
194
194
  LitHtml.html`
195
- <icon-button .data=${data as IconButton.IconButton.IconButtonData} .accessibleName="${
196
- this.#accessibleName}"></icon-button>
195
+ <icon-button .data=${data as IconButton.IconButton.IconButtonData} .accessibleName=${
196
+ this.#accessibleName}></icon-button>
197
197
  `,
198
198
  this.#shadow, {host: this});
199
199
  this.#tooltipCallback?.();
@@ -212,7 +212,7 @@ export class LinearMemoryViewer extends HTMLElement {
212
212
  };
213
213
  return html`
214
214
  <div class="row">
215
- <span class="${LitHtml.Directives.classMap(classMap)}">${toHexString({number: startIndex + this.#memoryOffset, pad: 8, prefix: false})}</span>
215
+ <span class=${LitHtml.Directives.classMap(classMap)}>${toHexString({number: startIndex + this.#memoryOffset, pad: 8, prefix: false})}</span>
216
216
  <span class="divider"></span>
217
217
  ${this.renderByteValues(startIndex, endIndex)}
218
218
  <span class="divider"></span>
@@ -237,7 +237,7 @@ export class LinearMemoryViewer extends HTMLElement {
237
237
  const byteValue = isSelectableCell ? html`${toHexString({number: this.#memory[i], pad: 2, prefix: false})}` : '';
238
238
  const actualIndex = i + this.#memoryOffset;
239
239
  const onSelectedByte = isSelectableCell ? this.onSelectedByte.bind(this, actualIndex) : '';
240
- cells.push(html`<span class="${LitHtml.Directives.classMap(classMap)}" @click=${onSelectedByte}>${byteValue}</span>`);
240
+ cells.push(html`<span class=${LitHtml.Directives.classMap(classMap)} @click=${onSelectedByte}>${byteValue}</span>`);
241
241
  }
242
242
  return html`${cells}`;
243
243
  }
@@ -253,7 +253,7 @@ export class LinearMemoryViewer extends HTMLElement {
253
253
  const isSelectableCell = i < this.#memory.length;
254
254
  const value = isSelectableCell ? html`${this.toAscii(this.#memory[i])}` : '';
255
255
  const onSelectedByte = isSelectableCell ? this.onSelectedByte.bind(this, i + this.#memoryOffset) : '';
256
- cells.push(html`<span class="${LitHtml.Directives.classMap(classMap)}" @click=${onSelectedByte}>${value}</span>`);
256
+ cells.push(html`<span class=${LitHtml.Directives.classMap(classMap)} @click=${onSelectedByte}>${value}</span>`);
257
257
  }
258
258
  return html`${cells}`;
259
259
  }
@@ -105,13 +105,13 @@ const tokenRenderers = new Map<string, (token: any) => LitHtml.TemplateResult>([
105
105
  ['space', (): LitHtml.TemplateResult => html``],
106
106
  [
107
107
  'link',
108
- (token): LitHtml.TemplateResult => html`<${MarkdownLink.litTagName} .data="${
109
- {key: token.href, title: token.text} as MarkdownLinkData}"></${MarkdownLink.litTagName}>`,
108
+ (token): LitHtml.TemplateResult => html`<${MarkdownLink.litTagName} .data=${
109
+ {key: token.href, title: token.text} as MarkdownLinkData}></${MarkdownLink.litTagName}>`,
110
110
  ],
111
111
  [
112
112
  'image',
113
- (token): LitHtml.TemplateResult => html`<${MarkdownImage.litTagName} .data="${
114
- {key: token.href, title: token.text} as MarkdownImageData}"></${MarkdownImage.litTagName}>`,
113
+ (token): LitHtml.TemplateResult => html`<${MarkdownImage.litTagName} .data=${
114
+ {key: token.href, title: token.text} as MarkdownImageData}></${MarkdownImage.litTagName}>`,
115
115
  ],
116
116
  ]);
117
117
 
@@ -0,0 +1,98 @@
1
+ // Copyright (c) 2021 The Chromium Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+
5
+ import * as i18n from '../../../core/i18n/i18n.js';
6
+ import * as Root from '../../../core/root/root.js';
7
+ import * as LitHtml from '../../../ui/lit-html/lit-html.js';
8
+ import * as ComponentHelpers from '../helpers/helpers.js';
9
+ import * as IconButton from '../icon_button/icon_button.js';
10
+
11
+ import previewToggleStyles from './previewToggle.css.js';
12
+
13
+ const {render, html, nothing} = LitHtml;
14
+
15
+ export interface PreviewToggleData {
16
+ name: string;
17
+ helperText: string|null;
18
+ feedbackURL: string|null;
19
+ experiment: Root.Runtime.ExperimentName;
20
+ onChangeCallback?: (checked: boolean) => void;
21
+ }
22
+
23
+ const UIStrings = {
24
+ /**
25
+ *@description Link text the user can click to provide feedback to the team.
26
+ */
27
+ previewTextFeedbackLink: 'Send us your feedback.',
28
+ };
29
+
30
+ const str_ = i18n.i18n.registerUIStrings('ui/components/panel_feedback/PreviewToggle.ts', UIStrings);
31
+ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
32
+
33
+ export class PreviewToggle extends HTMLElement {
34
+ static readonly litTagName = LitHtml.literal`devtools-preview-toggle`;
35
+ readonly #shadow = this.attachShadow({mode: 'open'});
36
+
37
+ #name = '';
38
+ #helperText: string|null = null;
39
+ #feedbackURL: string|null = null;
40
+ #experiment: string = '';
41
+ #onChangeCallback?: (checked: boolean) => void;
42
+
43
+ connectedCallback(): void {
44
+ this.#shadow.adoptedStyleSheets = [previewToggleStyles];
45
+ }
46
+
47
+ set data(data: PreviewToggleData) {
48
+ this.#name = data.name;
49
+ this.#helperText = data.helperText;
50
+ this.#feedbackURL = data.feedbackURL;
51
+ this.#experiment = data.experiment;
52
+ this.#onChangeCallback = data.onChangeCallback;
53
+ this.render();
54
+ }
55
+
56
+ private render(): void {
57
+ const checked = Root.Runtime.experiments.isEnabled(this.#experiment);
58
+ // Disabled until https://crbug.com/1079231 is fixed.
59
+ // clang-format off
60
+ render(
61
+ html`
62
+ <div class="experiment-preview">
63
+ <input type="checkbox" ?checked=${checked} @change=${this.checkboxChanged} aria-label=${this.#name}/>
64
+ <${IconButton.Icon.Icon.litTagName} .data=${{
65
+ iconName: 'ic_preview_feature',
66
+ width: '16px',
67
+ height: '16px',
68
+ color: 'var(--color-text-secondary)',
69
+ } as IconButton.Icon.IconData}>
70
+ </${IconButton.Icon.Icon.litTagName}>${this.#name}
71
+ </div>
72
+ <div class="helper">
73
+ ${this.#helperText && this.#feedbackURL
74
+ ? html`<p>${this.#helperText} <x-link href=${this.#feedbackURL}>${i18nString(UIStrings.previewTextFeedbackLink)}</x-link></p>`
75
+ : nothing}
76
+ </div>`,
77
+ this.#shadow,
78
+ {
79
+ host: this,
80
+ });
81
+ // clang-format on
82
+ }
83
+
84
+ private checkboxChanged(event: Event): void {
85
+ const checked = (event.target as HTMLInputElement).checked;
86
+ Root.Runtime.experiments.setEnabled(this.#experiment, checked);
87
+ this.#onChangeCallback?.(checked);
88
+ }
89
+ }
90
+
91
+ ComponentHelpers.CustomElements.defineComponent('devtools-preview-toggle', PreviewToggle);
92
+
93
+ declare global {
94
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
95
+ interface HTMLElementTagNameMap {
96
+ 'devtools-preview-toggle': PreviewToggle;
97
+ }
98
+ }
@@ -4,3 +4,4 @@
4
4
 
5
5
  export * as FeedbackButton from './FeedbackButton.js';
6
6
  export * as PanelFeedback from './PanelFeedback.js';
7
+ export * as PreviewToggle from './PreviewToggle.js';
@@ -0,0 +1,24 @@
1
+ /*
2
+ * Copyright 2021 The Chromium Authors. All rights reserved.
3
+ * Use of this source code is governed by a BSD-style license that can be
4
+ * found in the LICENSE file.
5
+ */
6
+
7
+ :host {
8
+ display: block;
9
+ }
10
+
11
+ .experiment-preview {
12
+ display: flex;
13
+ align-items: center;
14
+ }
15
+
16
+ .helper {
17
+ text-align: center;
18
+ font-style: italic;
19
+ }
20
+
21
+ x-link { /* stylelint-disable-line selector-type-no-unknown */
22
+ color: var(--color-primary);
23
+ text-decoration-line: underline;
24
+ }