chrome-devtools-frontend 1.0.946351 → 1.0.948359

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 (217) hide show
  1. package/.eslintrc.js +1 -0
  2. package/config/gni/all_devtools_files.gni +1 -15
  3. package/config/gni/devtools_grd_files.gni +9 -15
  4. package/config/gni/devtools_image_files.gni +1 -0
  5. package/front_end/.eslintrc.js +6 -1
  6. package/front_end/Images/src/circled_backslash_icon.svg +3 -0
  7. package/front_end/core/host/InspectorFrontendHost.ts +0 -3
  8. package/front_end/core/host/InspectorFrontendHostAPI.ts +0 -1
  9. package/front_end/core/host/UserMetrics.ts +1 -22
  10. package/front_end/core/i18n/locales/en-US.json +38 -29
  11. package/front_end/core/i18n/locales/en-XL.json +38 -29
  12. package/front_end/core/platform/platform.ts +0 -2
  13. package/front_end/core/platform/string-utilities.ts +14 -1
  14. package/front_end/core/platform/utilities.ts +0 -29
  15. package/front_end/core/root/Runtime.ts +4 -211
  16. package/front_end/core/sdk/AccessibilityModel.ts +0 -2
  17. package/front_end/core/sdk/CSSProperty.ts +0 -2
  18. package/front_end/core/sdk/CSSRule.ts +0 -2
  19. package/front_end/core/sdk/Cookie.ts +0 -25
  20. package/front_end/core/sdk/EmulationModel.ts +0 -2
  21. package/front_end/core/sdk/HeapProfilerModel.ts +0 -2
  22. package/front_end/core/sdk/NetworkManager.ts +0 -3
  23. package/front_end/core/sdk/Resource.ts +0 -3
  24. package/front_end/core/sdk/ResourceTreeModel.ts +0 -3
  25. package/front_end/core/sdk/ServiceWorkerManager.ts +0 -2
  26. package/front_end/core/sdk/sdk-legacy.ts +0 -3
  27. package/front_end/devtools_compatibility.js +1 -1
  28. package/front_end/entrypoints/devtools_app/{devtools_app-meta-files.ts → devtools_app.ts} +9 -2
  29. package/front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts +2 -1
  30. package/front_end/entrypoints/inspector/{inspector.js → inspector.ts} +0 -3
  31. package/front_end/entrypoints/js_app/{JsMain.ts → js_app.ts} +5 -1
  32. package/front_end/entrypoints/main/MainImpl.ts +0 -1
  33. package/front_end/entrypoints/ndb_app/{ndb_app.js → ndb_app.ts} +0 -2
  34. package/front_end/entrypoints/{node_main → node_app}/NodeConnectionsPanel.ts +1 -1
  35. package/front_end/entrypoints/{node_main → node_app}/NodeMain.ts +2 -4
  36. package/front_end/entrypoints/{node_main → node_app}/nodeConnectionsPanel.css +0 -0
  37. package/front_end/entrypoints/node_app/node_app.ts +79 -0
  38. package/front_end/entrypoints/shell/{shell.js → shell.ts} +0 -2
  39. package/front_end/entrypoints/worker_app/{worker_app.js → worker_app.ts} +3 -2
  40. package/front_end/generated/InspectorBackendCommands.js +5 -1
  41. package/front_end/generated/protocol.d.ts +12 -0
  42. package/front_end/legacy/legacy-defs.d.ts +0 -4
  43. package/front_end/legacy_test_runner/test_runner/TestRunner.js +35 -59
  44. package/front_end/models/bindings/CompilerScriptMapping.ts +0 -1
  45. package/front_end/models/bindings/DebuggerLanguagePlugins.ts +4 -11
  46. package/front_end/models/bindings/SASSSourceMapping.ts +0 -1
  47. package/front_end/models/emulation/DeviceModeModel.ts +0 -2
  48. package/front_end/models/issues_manager/CorsIssue.ts +17 -9
  49. package/front_end/models/issues_manager/descriptions/{corsInsecurePrivateNetworkPreflight.md → corsPreflightAllowPrivateNetworkError.md} +1 -1
  50. package/front_end/panels/accessibility/AccessibilitySidebarView.ts +3 -1
  51. package/front_end/panels/animation/AnimationTimeline.ts +0 -2
  52. package/front_end/panels/animation/AnimationUI.ts +0 -2
  53. package/front_end/panels/application/BackForwardCacheStrings.ts +2 -5
  54. package/front_end/panels/application/BackForwardCacheView.ts +150 -58
  55. package/front_end/panels/application/ResourcesPanel.ts +0 -42
  56. package/front_end/panels/application/application-legacy.ts +0 -3
  57. package/front_end/panels/application/application-meta.ts +0 -13
  58. package/front_end/panels/application/backForwardCacheView.css +44 -6
  59. package/front_end/panels/application/components/FrameDetailsView.ts +3 -3
  60. package/front_end/panels/application/components/OriginTrialTreeView.ts +3 -3
  61. package/front_end/panels/application/components/StackTrace.ts +1 -1
  62. package/front_end/panels/coverage/CoverageView.ts +1 -1
  63. package/front_end/panels/css_overview/CSSOverviewModel.ts +0 -2
  64. package/front_end/panels/css_overview/CSSOverviewPanel.ts +0 -7
  65. package/front_end/panels/css_overview/CSSOverviewProcessingView.ts +0 -2
  66. package/front_end/panels/css_overview/components/cssOverviewStartView.css +1 -0
  67. package/front_end/panels/css_overview/cssOverviewCompletedView.css +1 -1
  68. package/front_end/panels/developer_resources/DeveloperResourcesView.ts +2 -1
  69. package/front_end/panels/elements/ColorSwatchPopoverIcon.ts +0 -11
  70. package/front_end/panels/elements/ElementsPanel.ts +9 -1
  71. package/front_end/panels/elements/ElementsTreeElement.ts +1 -1
  72. package/front_end/panels/elements/StylesSidebarPane.ts +0 -1
  73. package/front_end/panels/elements/components/ElementsBreadcrumbs.ts +1 -1
  74. package/front_end/panels/emulation/DeviceModeToolbar.ts +0 -16
  75. package/front_end/panels/issues/CorsIssueDetailsView.ts +18 -2
  76. package/front_end/panels/lighthouse/lighthouse-meta.ts +0 -3
  77. package/front_end/panels/network/NetworkWaterfallColumn.ts +2 -0
  78. package/front_end/panels/profiler/CPUProfileFlameChart.ts +3 -1
  79. package/front_end/panels/profiler/ProfileDataGrid.ts +2 -1
  80. package/front_end/panels/search/SearchView.ts +24 -4
  81. package/front_end/panels/settings/components/SyncSection.ts +2 -2
  82. package/front_end/panels/settings/emulation/components/UserAgentClientHintsForm.ts +46 -46
  83. package/front_end/panels/sources/CSSPlugin.ts +3 -0
  84. package/front_end/panels/sources/CoveragePlugin.ts +2 -0
  85. package/front_end/panels/sources/DebuggerPlugin.ts +29 -5
  86. package/front_end/panels/sources/JavaScriptCompilerPlugin.ts +3 -0
  87. package/front_end/panels/sources/ProfilePlugin.ts +3 -0
  88. package/front_end/panels/sources/UISourceCodeFrame.ts +11 -2
  89. package/front_end/panels/timeline/TimelineTreeView.ts +3 -1
  90. package/front_end/third_party/codemirror.next/chunk/codemirror.js +1 -1
  91. package/front_end/third_party/codemirror.next/chunk/cpp.js +1 -2
  92. package/front_end/third_party/codemirror.next/chunk/java.js +1 -2
  93. package/front_end/third_party/codemirror.next/chunk/json.js +1 -2
  94. package/front_end/third_party/codemirror.next/chunk/markdown.js +1 -2
  95. package/front_end/third_party/codemirror.next/chunk/php.js +1 -2
  96. package/front_end/third_party/codemirror.next/chunk/python.js +1 -2
  97. package/front_end/third_party/codemirror.next/chunk/wast.js +1 -2
  98. package/front_end/third_party/codemirror.next/chunk/xml.js +1 -2
  99. package/front_end/third_party/codemirror.next/codemirror.next.d.ts +1486 -1423
  100. package/front_end/third_party/codemirror.next/codemirror.next.js +1 -2
  101. package/front_end/third_party/codemirror.next/package.json +10 -9
  102. package/front_end/third_party/lighthouse/lighthouse-dt-bundle.js +168 -164
  103. package/front_end/third_party/lighthouse/locales/ar-XB.json +0 -3
  104. package/front_end/third_party/lighthouse/locales/ar.json +0 -3
  105. package/front_end/third_party/lighthouse/locales/bg.json +17 -20
  106. package/front_end/third_party/lighthouse/locales/ca.json +0 -3
  107. package/front_end/third_party/lighthouse/locales/cs.json +0 -3
  108. package/front_end/third_party/lighthouse/locales/da.json +16 -19
  109. package/front_end/third_party/lighthouse/locales/de.json +0 -3
  110. package/front_end/third_party/lighthouse/locales/el.json +0 -3
  111. package/front_end/third_party/lighthouse/locales/en-GB.json +19 -22
  112. package/front_end/third_party/lighthouse/locales/en-US.json +33 -3
  113. package/front_end/third_party/lighthouse/locales/en-XA.json +0 -3
  114. package/front_end/third_party/lighthouse/locales/en-XL.json +33 -3
  115. package/front_end/third_party/lighthouse/locales/es-419.json +17 -20
  116. package/front_end/third_party/lighthouse/locales/es.json +0 -3
  117. package/front_end/third_party/lighthouse/locales/fi.json +16 -19
  118. package/front_end/third_party/lighthouse/locales/fil.json +33 -36
  119. package/front_end/third_party/lighthouse/locales/fr.json +16 -19
  120. package/front_end/third_party/lighthouse/locales/he.json +16 -19
  121. package/front_end/third_party/lighthouse/locales/hi.json +0 -3
  122. package/front_end/third_party/lighthouse/locales/hr.json +16 -19
  123. package/front_end/third_party/lighthouse/locales/hu.json +16 -19
  124. package/front_end/third_party/lighthouse/locales/id.json +16 -19
  125. package/front_end/third_party/lighthouse/locales/it.json +37 -40
  126. package/front_end/third_party/lighthouse/locales/ja.json +16 -19
  127. package/front_end/third_party/lighthouse/locales/ko.json +16 -19
  128. package/front_end/third_party/lighthouse/locales/lt.json +17 -20
  129. package/front_end/third_party/lighthouse/locales/lv.json +0 -3
  130. package/front_end/third_party/lighthouse/locales/nl.json +16 -19
  131. package/front_end/third_party/lighthouse/locales/no.json +17 -20
  132. package/front_end/third_party/lighthouse/locales/pl.json +16 -19
  133. package/front_end/third_party/lighthouse/locales/pt-PT.json +37 -40
  134. package/front_end/third_party/lighthouse/locales/pt.json +16 -19
  135. package/front_end/third_party/lighthouse/locales/ro.json +0 -3
  136. package/front_end/third_party/lighthouse/locales/ru.json +16 -19
  137. package/front_end/third_party/lighthouse/locales/sk.json +0 -3
  138. package/front_end/third_party/lighthouse/locales/sl.json +0 -3
  139. package/front_end/third_party/lighthouse/locales/sr-Latn.json +16 -19
  140. package/front_end/third_party/lighthouse/locales/sr.json +16 -19
  141. package/front_end/third_party/lighthouse/locales/sv.json +17 -20
  142. package/front_end/third_party/lighthouse/locales/ta.json +0 -3
  143. package/front_end/third_party/lighthouse/locales/te.json +0 -3
  144. package/front_end/third_party/lighthouse/locales/th.json +0 -3
  145. package/front_end/third_party/lighthouse/locales/tr.json +0 -3
  146. package/front_end/third_party/lighthouse/locales/uk.json +17 -20
  147. package/front_end/third_party/lighthouse/locales/vi.json +0 -3
  148. package/front_end/third_party/lighthouse/locales/zh-HK.json +0 -3
  149. package/front_end/third_party/lighthouse/locales/zh-TW.json +0 -3
  150. package/front_end/third_party/lighthouse/locales/zh.json +0 -3
  151. package/front_end/third_party/lighthouse/report/bundle.d.ts +63 -61
  152. package/front_end/third_party/lighthouse/report/bundle.js +36 -7
  153. package/front_end/third_party/lighthouse/report-assets/report-generator.js +205 -192
  154. package/front_end/ui/components/diff_view/DiffView.ts +4 -4
  155. package/front_end/ui/components/helpers/component-server-setup.ts +1 -12
  156. package/front_end/ui/components/helpers/helpers.ts +0 -2
  157. package/front_end/ui/components/icon_button/IconButton.ts +1 -1
  158. package/front_end/ui/components/issue_counter/IssueCounter.ts +2 -2
  159. package/front_end/ui/components/linear_memory_inspector/LinearMemoryViewer.ts +3 -3
  160. package/front_end/ui/components/markdown_view/MarkdownView.ts +4 -4
  161. package/front_end/ui/components/panel_feedback/PreviewToggle.ts +98 -0
  162. package/front_end/ui/components/panel_feedback/panel_feedback.ts +1 -0
  163. package/front_end/ui/components/panel_feedback/previewToggle.css +24 -0
  164. package/front_end/ui/components/report_view/ReportView.ts +22 -0
  165. package/front_end/ui/components/report_view/reportSection.css +20 -0
  166. package/front_end/ui/components/request_link_icon/RequestLinkIcon.ts +1 -1
  167. package/front_end/ui/components/settings/SettingCheckbox.ts +2 -2
  168. package/front_end/ui/components/text_editor/config.ts +9 -7
  169. package/front_end/ui/components/text_editor/javascript.ts +15 -11
  170. package/front_end/ui/components/text_prompt/TextPrompt.ts +2 -2
  171. package/front_end/ui/legacy/GlassPane.ts +1 -1
  172. package/front_end/ui/legacy/InspectorView.ts +10 -0
  173. package/front_end/ui/legacy/SearchableView.ts +2 -1
  174. package/front_end/ui/legacy/Treeoutline.ts +1 -1
  175. package/front_end/ui/legacy/Widget.ts +1 -1
  176. package/front_end/ui/legacy/XWidget.ts +0 -5
  177. package/front_end/ui/legacy/components/inline_editor/CSSVarSwatch.ts +2 -2
  178. package/front_end/ui/legacy/components/inline_editor/ColorSwatch.ts +1 -1
  179. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +40 -32
  180. package/front_end/ui/legacy/themeColors.css +1 -1
  181. package/front_end/ui/legacy/utils/append-style.ts +2 -13
  182. package/front_end/ui/legacy/utils/create-shadow-root-with-core-styles.ts +7 -5
  183. package/inspector_overlay/main.ts +2 -12
  184. package/package.json +2 -4
  185. package/scripts/build/build_inspector_overlay.py +15 -1
  186. package/scripts/build/rjsmin.py +84 -115
  187. package/scripts/eslint_rules/lib/l10n_filename_matches.js +4 -4
  188. package/scripts/eslint_rules/lib/lit_html_no_attribute_quotes.js +101 -0
  189. package/scripts/eslint_rules/lib/no_only_eslint_tests.js +53 -0
  190. package/scripts/eslint_rules/tests/.eslintrc.js +14 -0
  191. package/scripts/eslint_rules/tests/l10n_filename_matches_test.js +4 -0
  192. package/scripts/eslint_rules/tests/lit_html_no_attribute_quotes_test.js +45 -0
  193. package/scripts/eslint_rules/tests/no_only_eslint_tests_test.js +94 -0
  194. package/front_end/entrypoints/devtools_app/devtools_app.js +0 -11
  195. package/front_end/entrypoints/devtools_app/devtools_app.json +0 -5
  196. package/front_end/entrypoints/inspector/inspector.json +0 -4
  197. package/front_end/entrypoints/js_app/js_app.js +0 -12
  198. package/front_end/entrypoints/js_app/js_app.json +0 -3
  199. package/front_end/entrypoints/ndb_app/ndb_app.json +0 -4
  200. package/front_end/entrypoints/node_app/node_app-meta.ts +0 -43
  201. package/front_end/entrypoints/node_app/node_app.js +0 -16
  202. package/front_end/entrypoints/node_app/node_app.json +0 -3
  203. package/front_end/entrypoints/node_main/node_main-meta.ts +0 -48
  204. package/front_end/entrypoints/node_main/node_main.ts +0 -11
  205. package/front_end/entrypoints/startup/RuntimeInstantiator.ts +0 -95
  206. package/front_end/entrypoints/startup/startup.ts +0 -9
  207. package/front_end/entrypoints/worker_app/worker_app.json +0 -3
  208. package/front_end/panels/lighthouse/module.json +0 -6
  209. package/front_end/third_party/lighthouse/report-assets/report.d.ts +0 -1
  210. package/front_end/third_party/lighthouse/report-assets/report.js +0 -233
  211. package/front_end/third_party/lighthouse/report-assets/standalone-template.html +0 -38
  212. package/front_end/ui/components/helpers/get-stylesheet.ts +0 -45
  213. package/scripts/build/build_release_applications.py +0 -216
  214. package/scripts/build/modular_build.py +0 -184
  215. package/scripts/check_gn.js +0 -119
  216. package/scripts/json_validator/module.schema.json +0 -19
  217. package/scripts/json_validator/validate_module_json.js +0 -44
@@ -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
+ }
@@ -7,6 +7,7 @@ import * as LitHtml from '../../lit-html/lit-html.js';
7
7
 
8
8
  import reportStyles from './report.css.js';
9
9
  import reportKeyStyles from './reportKey.css.js';
10
+ import reportSectionStyles from './reportSection.css.js';
10
11
  import reportSectionDividerStyles from './reportSectionDivider.css.js';
11
12
  import reportSectionHeaderStyles from './reportSectionHeader.css.js';
12
13
  import reportValueStyles from './reportValue.css.js';
@@ -66,6 +67,25 @@ export interface ReportSectionData {
66
67
  sectionTitle: string;
67
68
  }
68
69
 
70
+ export class ReportSection extends HTMLElement {
71
+ static readonly litTagName = LitHtml.literal`devtools-report-section`;
72
+ private readonly shadow = this.attachShadow({mode: 'open'});
73
+ connectedCallback(): void {
74
+ this.shadow.adoptedStyleSheets = [reportSectionStyles];
75
+ this.render();
76
+ }
77
+ private render(): void {
78
+ // Disabled until https://crbug.com/1079231 is fixed.
79
+ // clang-format off
80
+ LitHtml.render(LitHtml.html`
81
+ <div class="section">
82
+ <slot></slot>
83
+ </div>
84
+ `, this.shadow, {host: this});
85
+ // clang-format on
86
+ }
87
+ }
88
+
69
89
  export class ReportSectionHeader extends HTMLElement {
70
90
  static readonly litTagName = LitHtml.literal`devtools-report-section-header`;
71
91
 
@@ -146,6 +166,7 @@ export class ReportValue extends HTMLElement {
146
166
  }
147
167
 
148
168
  ComponentHelpers.CustomElements.defineComponent('devtools-report', Report);
169
+ ComponentHelpers.CustomElements.defineComponent('devtools-report-section', ReportSection);
149
170
  ComponentHelpers.CustomElements.defineComponent('devtools-report-section-header', ReportSectionHeader);
150
171
  ComponentHelpers.CustomElements.defineComponent('devtools-report-key', ReportKey);
151
172
  ComponentHelpers.CustomElements.defineComponent('devtools-report-value', ReportValue);
@@ -155,6 +176,7 @@ declare global {
155
176
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
156
177
  interface HTMLElementTagNameMap {
157
178
  'devtools-report': Report;
179
+ 'devtools-report-section': ReportSection;
158
180
  'devtools-report-section-header': ReportSectionHeader;
159
181
  'devtools-report-key': ReportKey;
160
182
  'devtools-report-value': ReportValue;
@@ -0,0 +1,20 @@
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
+ grid-column-start: span 2;
9
+ }
10
+
11
+ .section {
12
+ padding: 12px;
13
+ margin-left: 18px;
14
+ display: flex;
15
+ flex-direction: row;
16
+ align-items: center;
17
+ flex: auto;
18
+ overflow-wrap: break-word;
19
+ overflow: hidden;
20
+ }
@@ -179,7 +179,7 @@ export class RequestLinkIcon extends HTMLElement {
179
179
  return LitHtml.nothing;
180
180
  }
181
181
  const filename = extractShortPath(url);
182
- return LitHtml.html`<span aria-label="${i18nString(UIStrings.shortenedURL)}" title="${url}">${filename}</span>`;
182
+ return LitHtml.html`<span aria-label=${i18nString(UIStrings.shortenedURL)} title=${url}>${filename}</span>`;
183
183
  }
184
184
 
185
185
  private render(): Promise<void> {
@@ -55,8 +55,8 @@ export class SettingCheckbox extends HTMLElement {
55
55
  LitHtml.html`
56
56
  <p>
57
57
  <label>
58
- <input type="checkbox" ?checked=${this.#setting.get()} ?disabled=${this.#disabled} @change="${
59
- this.checkboxChanged}" aria-label="${this.#setting.title()}" /> ${this.#setting.title()}
58
+ <input type="checkbox" ?checked=${this.#setting.get()} ?disabled=${this.#disabled} @change=${
59
+ this.checkboxChanged} aria-label=${this.#setting.title()} /> ${this.#setting.title()}
60
60
  </label>
61
61
  </p>`,
62
62
  this.#shadow, {host: this});
@@ -26,9 +26,10 @@ const empty: CM.Extension = [];
26
26
  export const dynamicSetting = CM.Facet.define<DynamicSetting<unknown>>();
27
27
 
28
28
  // The code below is used to wire up dynamic settings to editors. When
29
- // you include one of these objects in an editor configuration, the
30
- // TextEditor class will take care of listening to changes in the
31
- // setting, and updating the configuration as appropriate.
29
+ // you include the result of calling `instance()` in an editor
30
+ // configuration, the TextEditor class will take care of listening to
31
+ // changes in the setting, and updating the configuration as
32
+ // appropriate.
32
33
 
33
34
  export class DynamicSetting<T> {
34
35
  compartment = new CM.Compartment();
@@ -246,7 +247,7 @@ export const closeBrackets: CM.Extension = [
246
247
  // element with the editor styles mounted in it for them. This is
247
248
  // annoying, but necessary because a scrollable parent node clips them
248
249
  // otherwise, `position: fixed` doesn't work due to `contain` styles,
249
- // and appending them diretly to `document.body` doesn't work because
250
+ // and appending them directly to `document.body` doesn't work because
250
251
  // the necessary style sheets aren't available there.
251
252
  let tooltipHost: ShadowRoot|null = null;
252
253
 
@@ -324,11 +325,12 @@ export const showCompletionHint = CM.ViewPlugin.fromClass(class {
324
325
  if (pos !== lineBefore.to) {
325
326
  return null;
326
327
  }
327
- const wordBefore = /#?[\w$]+$/.exec(lineBefore.text);
328
- if (wordBefore && !label.startsWith(wordBefore[0])) {
328
+ const partBefore = (label[0] === '\'' ? /'(\\.|[^'\\])*$/ : label[0] === '"' ? /"(\\.|[^"\\])*$/ : /#?[\w$]+$/)
329
+ .exec(lineBefore.text);
330
+ if (partBefore && !label.startsWith(partBefore[0])) {
329
331
  return null;
330
332
  }
331
- return label.slice(wordBefore ? wordBefore[0].length : 0);
333
+ return label.slice(partBefore ? partBefore[0].length : 0);
332
334
  }
333
335
  }, {decorations: p => p.decorations});
334
336
 
@@ -52,10 +52,10 @@ class CompletionSet {
52
52
  }
53
53
 
54
54
  const javascriptKeywords = [
55
- 'async', 'await', 'break', 'case', 'catch', 'class', 'const', 'continue', 'debugger', 'default',
56
- 'delete', 'do', 'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import',
57
- 'in', 'instanceof', 'let', 'new', 'of', 'return', 'static', 'super', 'switch', 'this',
58
- 'throw', 'try', 'typeof', 'var', 'void', 'while', 'with', 'yield',
55
+ 'async', 'await', 'break', 'case', 'catch', 'class', 'const', 'continue', 'debugger', 'default', 'delete',
56
+ 'do', 'else', 'export', 'extends', 'false', 'finally', 'for', 'function', 'if', 'import', 'in',
57
+ 'instanceof', 'let', 'new', 'null', 'of', 'return', 'static', 'super', 'switch', 'this', 'throw',
58
+ 'true', 'try', 'typeof', 'var', 'void', 'while', 'with', 'yield',
59
59
  ];
60
60
  const consoleBuiltinFunctions = [
61
61
  'clear',
@@ -159,6 +159,7 @@ export async function javascriptCompletionSource(cx: CodeMirror.CompletionContex
159
159
  }
160
160
 
161
161
  let result: CompletionSet;
162
+ let quote: string|undefined = undefined;
162
163
  if (query.type === QueryType.Expression) {
163
164
  const [scope, global] = await Promise.all([
164
165
  completeExpressionInScope(),
@@ -174,7 +175,6 @@ export async function javascriptCompletionSource(cx: CodeMirror.CompletionContex
174
175
  }
175
176
  } else if (query.type === QueryType.PropertyName || query.type === QueryType.PropertyExpression) {
176
177
  const objectExpr = (query.relatedNode as CodeMirror.SyntaxNode).getChild('Expression');
177
- let quote = undefined;
178
178
  if (query.type === QueryType.PropertyExpression) {
179
179
  quote = query.from === undefined ? '\'' : cx.state.sliceDoc(query.from, query.from + 1);
180
180
  }
@@ -189,10 +189,13 @@ export async function javascriptCompletionSource(cx: CodeMirror.CompletionContex
189
189
  return {
190
190
  from: query.from ?? cx.pos,
191
191
  options: result.completions,
192
- span: /^#?[\w\P{ASCII}]*/u,
192
+ span: !quote ? SPAN_IDENT : quote === '\'' ? SPAN_SINGLE_QUOTE : SPAN_DOUBLE_QUOTE,
193
193
  };
194
194
  }
195
195
 
196
+ const SPAN_IDENT = /^#?[\w\P{ASCII}]*$/u, SPAN_SINGLE_QUOTE = /^\'(\\.|[^\\'\n])*'?$/,
197
+ SPAN_DOUBLE_QUOTE = /^"(\\.|[^\\"\n])*"?$/;
198
+
196
199
  function getExecutionContext(): SDK.RuntimeModel.ExecutionContext|null {
197
200
  return UI.Context.Context.instance().flavor(SDK.RuntimeModel.ExecutionContext);
198
201
  }
@@ -323,15 +326,16 @@ async function completePropertiesInner(
323
326
  object = await evaluateExpression(context, toPrototype + '.prototype', 'completion');
324
327
  }
325
328
 
326
- const functionType = expression === 'window' ? 'function' : 'method';
327
- const otherType = expression === 'window' ? 'variable' : 'property';
329
+ const functionType = expression === 'globalThis' ? 'function' : 'method';
330
+ const otherType = expression === 'globalThis' ? 'variable' : 'property';
328
331
  if (object && (object.type === 'object' || object.type === 'function')) {
329
332
  const properties = await object.getAllProperties(false, false);
330
333
  const isFunction = object.type === 'function';
331
334
  for (const prop of properties.properties || []) {
332
335
  if (!prop.symbol && !(isFunction && (prop.name === 'arguments' || prop.name === 'caller')) &&
333
- (!prop.private || expression === 'this')) {
334
- const label = quoted ? quoted + prop.name + quoted : prop.name;
336
+ (!prop.private || expression === 'this') && (quoted || SPAN_IDENT.test(prop.name))) {
337
+ const label =
338
+ quoted ? quoted + prop.name.replaceAll('\\', '\\\\').replaceAll(quoted, '\\' + quoted) + quoted : prop.name;
335
339
  const completion: CodeMirror.Completion = {
336
340
  label,
337
341
  type: prop.value?.type === 'function' ? functionType : otherType,
@@ -383,7 +387,7 @@ async function completeExpressionGlobal(): Promise<CompletionSet> {
383
387
  }
384
388
  const result = baseCompletions.copy();
385
389
 
386
- const fetchNames = completePropertiesInner('window', context).then(fromWindow => {
390
+ const fetchNames = completePropertiesInner('globalThis', context).then(fromWindow => {
387
391
  return context.globalLexicalScopeNames().then(globals => {
388
392
  for (const option of fromWindow.completions) {
389
393
  result.add(option);
@@ -127,8 +127,8 @@ export class TextPrompt extends HTMLElement {
127
127
  const output = LitHtml.html`
128
128
  <span class="prefix">${this.#prefixText} </span>
129
129
  <span class="text-prompt-input"><input aria-label=${this.#ariaLabelText} spellcheck="false" @input=${
130
- this.onInput} @keydown=${this.onKeyDown}/><span class='suggestion' suggestion="${
131
- this.#suggestionText}"></span></span>`;
130
+ this.onInput} @keydown=${this.onKeyDown}/><span class='suggestion' suggestion=${
131
+ this.#suggestionText}></span></span>`;
132
132
  LitHtml.render(output, this.#shadow, {host: this});
133
133
  }
134
134
  }
@@ -55,7 +55,7 @@ export class GlassPane {
55
55
  return this.widgetInternal.isShowing();
56
56
  }
57
57
 
58
- registerRequiredCSS(cssFile: string|{cssContent: string}): void {
58
+ registerRequiredCSS(cssFile: {cssContent: string}): void {
59
59
  // eslint-disable-next-line no-restricted-syntax -- Should import styles https://crbug.com/1106746
60
60
  this.widgetInternal.registerRequiredCSS(cssFile);
61
61
  }
@@ -107,6 +107,14 @@ const UIStrings = {
107
107
  *@description The aria label for the drawer.
108
108
  */
109
109
  drawer: 'Tool drawer',
110
+ /**
111
+ *@description The aria label for the drawer shown.
112
+ */
113
+ drawerShown: 'Drawer shown',
114
+ /**
115
+ *@description The aria label for the drawer hidden.
116
+ */
117
+ drawerHidden: 'Drawer hidden',
110
118
  };
111
119
  const str_ = i18n.i18n.registerUIStrings('ui/legacy/InspectorView.ts', UIStrings);
112
120
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
@@ -312,6 +320,7 @@ export class InspectorView extends VBox implements ViewLocationResolver {
312
320
  this.focusRestorer = null;
313
321
  }
314
322
  this.emitDrawerChangeEvent(true);
323
+ ARIAUtils.alert(i18nString(UIStrings.drawerShown));
315
324
  }
316
325
 
317
326
  drawerVisible(): boolean {
@@ -328,6 +337,7 @@ export class InspectorView extends VBox implements ViewLocationResolver {
328
337
  this.drawerSplitWidget.hideSidebar(true);
329
338
 
330
339
  this.emitDrawerChangeEvent(false);
340
+ ARIAUtils.alert(i18nString(UIStrings.drawerHidden));
331
341
  }
332
342
 
333
343
  setDrawerMinimized(minimized: boolean): void {
@@ -35,6 +35,7 @@
35
35
 
36
36
  import * as Common from '../../core/common/common.js';
37
37
  import * as i18n from '../../core/i18n/i18n.js';
38
+ import * as Platform from '../../core/platform/platform.js';
38
39
 
39
40
  import * as ARIAUtils from './ARIAUtils.js';
40
41
  import {HistoryInput} from './HistoryInput.js';
@@ -629,7 +630,7 @@ export class SearchConfig {
629
630
 
630
631
  // Otherwise just do a plain text search.
631
632
  if (!regex) {
632
- regex = createPlainTextSearchRegex(query, modifiers);
633
+ regex = Platform.StringUtilities.createPlainTextSearchRegex(query, modifiers);
633
634
  }
634
635
 
635
636
  return regex;
@@ -399,7 +399,7 @@ export class TreeOutlineInShadow extends TreeOutline {
399
399
  this.renderSelection = true;
400
400
  }
401
401
 
402
- registerRequiredCSS(cssFile: string|{cssContent: string}): void {
402
+ registerRequiredCSS(cssFile: {cssContent: string}): void {
403
403
  Utils.appendStyle(this.shadowRoot, cssFile);
404
404
  }
405
405
 
@@ -458,7 +458,7 @@ export class Widget {
458
458
  this.doResize();
459
459
  }
460
460
 
461
- registerRequiredCSS(cssFile: string|{cssContent: string}): void {
461
+ registerRequiredCSS(cssFile: {cssContent: string}): void {
462
462
  if (this.isWebComponent) {
463
463
  Utils.appendStyle((this.shadowRoot as DocumentFragment), cssFile);
464
464
  } else {
@@ -3,7 +3,6 @@
3
3
  // found in the LICENSE file.
4
4
 
5
5
  import * as ComponentHelpers from '../components/helpers/helpers.js';
6
- import * as Utils from './utils/utils.js';
7
6
 
8
7
  import {XElement} from './XElement.js';
9
8
 
@@ -55,10 +54,6 @@ export class XWidget extends XElement {
55
54
  return this.visible;
56
55
  }
57
56
 
58
- registerRequiredCSS(cssFile: string): void {
59
- Utils.appendStyle(this.shadowRootInternal || this, cssFile);
60
- }
61
-
62
57
  setOnShown(callback: (() => void)|null): void {
63
58
  this.onShownCallback = callback;
64
59
  }
@@ -113,7 +113,7 @@ export class CSSVarSwatch extends HTMLElement {
113
113
  // The this.variableName's space must be removed, otherwise it cannot be triggered when clicked.
114
114
  const onActivate = isDefined ? this.onLinkActivate.bind(this, this.variableName.trim()) : null;
115
115
 
116
- return html`<span class="${classes}" title="${title}" @mousedown=${onActivate} @keydown=${
116
+ return html`<span class=${classes} title=${title} @mousedown=${onActivate} @keydown=${
117
117
  onActivate} role="link" tabindex="-1">${variableName}</span>`;
118
118
  }
119
119
 
@@ -129,7 +129,7 @@ export class CSSVarSwatch extends HTMLElement {
129
129
  // Disabled until https://crbug.com/1079231 is fixed.
130
130
  // clang-format off
131
131
  render(
132
- html`<span title="${this.computedValue || ''}">${functionParts.pre}${link}${functionParts.post}</span>`,
132
+ html`<span title=${this.computedValue || ''}>${functionParts.pre}${link}${functionParts.post}</span>`,
133
133
  this.shadow, { host: this });
134
134
  // clang-format on
135
135
  }
@@ -118,7 +118,7 @@ export class ColorSwatch extends HTMLElement {
118
118
  // Note also that whitespace between nodes is removed on purpose to avoid pushing these elements apart. Do not
119
119
  // re-format the HTML code.
120
120
  LitHtml.render(
121
- LitHtml.html`<span class="color-swatch" title="${this.tooltip}"><span class="color-swatch-inner"
121
+ LitHtml.html`<span class="color-swatch" title=${this.tooltip}><span class="color-swatch-inner"
122
122
  style="background-color: ${this.text};"
123
123
  @click=${this.onClick}
124
124
  @mousedown=${this.consume}