monaco-editor-core 0.55.0-dev-20251020 → 0.55.0-dev-20251022

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 (210) hide show
  1. package/esm/nls.keys.json +1 -1
  2. package/esm/nls.messages.cs.js +2 -2
  3. package/esm/nls.messages.de.js +2 -2
  4. package/esm/nls.messages.es.js +2 -2
  5. package/esm/nls.messages.fr.js +2 -2
  6. package/esm/nls.messages.it.js +2 -2
  7. package/esm/nls.messages.ja.js +2 -2
  8. package/esm/nls.messages.js +1 -1
  9. package/esm/nls.messages.json +1 -1
  10. package/esm/nls.messages.ko.js +2 -2
  11. package/esm/nls.messages.pl.js +2 -2
  12. package/esm/nls.messages.pt-br.js +2 -2
  13. package/esm/nls.messages.ru.js +2 -2
  14. package/esm/nls.messages.tr.js +2 -2
  15. package/esm/nls.messages.zh-cn.js +2 -2
  16. package/esm/nls.messages.zh-tw.js +2 -2
  17. package/esm/nls.metadata.json +17 -5
  18. package/esm/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  19. package/esm/vs/base/browser/ui/iconLabel/iconlabel.css +2 -3
  20. package/esm/vs/base/common/actions.js +5 -0
  21. package/esm/vs/base/common/actions.js.map +1 -1
  22. package/esm/vs/base/common/async.js +5 -5
  23. package/esm/vs/base/common/async.js.map +1 -1
  24. package/esm/vs/base/common/codiconsLibrary.js +1 -0
  25. package/esm/vs/base/common/codiconsLibrary.js.map +1 -1
  26. package/esm/vs/base/common/policy.js +40 -1
  27. package/esm/vs/base/common/policy.js.map +1 -1
  28. package/esm/vs/editor/browser/controller/editContext/native/nativeEditContext.js +20 -12
  29. package/esm/vs/editor/browser/controller/editContext/native/nativeEditContext.js.map +1 -1
  30. package/esm/vs/editor/browser/controller/editContext/native/screenReaderSupport.js +1 -1
  31. package/esm/vs/editor/browser/controller/editContext/screenReaderUtils.js +4 -4
  32. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContext.js +1 -1
  33. package/esm/vs/editor/browser/coreCommands.js +3 -3
  34. package/esm/vs/editor/browser/editorExtensions.js +9 -9
  35. package/esm/vs/editor/browser/gpu/viewGpuContext.js +1 -1
  36. package/esm/vs/editor/browser/services/hoverService/hoverWidget.js +1 -3
  37. package/esm/vs/editor/browser/services/hoverService/hoverWidget.js.map +1 -1
  38. package/esm/vs/editor/browser/services/hoverService/updatableHoverWidget.js +1 -1
  39. package/esm/vs/editor/browser/services/inlineCompletionsService.js +4 -4
  40. package/esm/vs/editor/browser/services/inlineCompletionsService.js.map +1 -1
  41. package/esm/vs/editor/browser/widget/codeEditor/codeEditorWidget.js +2 -2
  42. package/esm/vs/editor/browser/widget/diffEditor/commands.js +12 -12
  43. package/esm/vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer.js +14 -14
  44. package/esm/vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer.js.map +1 -1
  45. package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.js +1 -1
  46. package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/copySelection.js +1 -1
  47. package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin.js +7 -7
  48. package/esm/vs/editor/browser/widget/diffEditor/diffEditor.contribution.js +5 -5
  49. package/esm/vs/editor/browser/widget/diffEditor/diffEditorWidget.js +6 -0
  50. package/esm/vs/editor/browser/widget/diffEditor/diffEditorWidget.js.map +1 -1
  51. package/esm/vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature.js +7 -7
  52. package/esm/vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature.js +2 -2
  53. package/esm/vs/editor/browser/widget/diffEditor/features/revertButtonsFeature.js +2 -2
  54. package/esm/vs/editor/browser/widget/diffEditor/registrations.contribution.js +5 -5
  55. package/esm/vs/editor/browser/widget/multiDiffEditor/colors.js +3 -3
  56. package/esm/vs/editor/browser/widget/multiDiffEditor/diffEditorItemTemplate.js +1 -0
  57. package/esm/vs/editor/browser/widget/multiDiffEditor/diffEditorItemTemplate.js.map +1 -1
  58. package/esm/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.js +2 -2
  59. package/esm/vs/editor/common/config/editorConfigurationSchema.js +54 -54
  60. package/esm/vs/editor/common/config/editorOptions.js +406 -406
  61. package/esm/vs/editor/common/core/editorColorRegistry.js +68 -68
  62. package/esm/vs/editor/common/editorContextKeys.js +46 -46
  63. package/esm/vs/editor/common/languages/modesRegistry.js +1 -1
  64. package/esm/vs/editor/common/languages.js +56 -56
  65. package/esm/vs/editor/common/model/editStack.js +1 -1
  66. package/esm/vs/editor/common/standaloneStrings.js +10 -10
  67. package/esm/vs/editor/common/viewLayout/viewLineRenderer.js +2 -2
  68. package/esm/vs/editor/contrib/anchorSelect/browser/anchorSelect.js +6 -6
  69. package/esm/vs/editor/contrib/bracketMatching/browser/bracketMatching.js +6 -6
  70. package/esm/vs/editor/contrib/caretOperations/browser/caretOperations.js +2 -2
  71. package/esm/vs/editor/contrib/caretOperations/browser/transpose.js +1 -1
  72. package/esm/vs/editor/contrib/clipboard/browser/clipboard.js +17 -17
  73. package/esm/vs/editor/contrib/codeAction/browser/codeAction.js +1 -1
  74. package/esm/vs/editor/contrib/codeAction/browser/codeActionCommands.js +29 -29
  75. package/esm/vs/editor/contrib/codeAction/browser/codeActionContributions.js +3 -3
  76. package/esm/vs/editor/contrib/codeAction/browser/codeActionController.js +3 -3
  77. package/esm/vs/editor/contrib/codeAction/browser/codeActionMenu.js +8 -8
  78. package/esm/vs/editor/contrib/codeAction/browser/lightBulbWidget.js +9 -9
  79. package/esm/vs/editor/contrib/codelens/browser/codelensController.js +2 -2
  80. package/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerCloseButton.js +1 -1
  81. package/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerHeader.js +1 -1
  82. package/esm/vs/editor/contrib/colorPicker/browser/standaloneColorPicker/standaloneColorPickerActions.js +7 -7
  83. package/esm/vs/editor/contrib/comment/browser/comment.js +6 -6
  84. package/esm/vs/editor/contrib/contextmenu/browser/contextmenu.js +10 -10
  85. package/esm/vs/editor/contrib/cursorUndo/browser/cursorUndo.js +2 -2
  86. package/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js +4 -4
  87. package/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.js +9 -9
  88. package/esm/vs/editor/contrib/dropOrPasteInto/browser/defaultProviders.js +8 -8
  89. package/esm/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.js +3 -3
  90. package/esm/vs/editor/contrib/dropOrPasteInto/browser/postEditWidget.js +2 -2
  91. package/esm/vs/editor/contrib/editorState/browser/keybindingCancellation.js +1 -1
  92. package/esm/vs/editor/contrib/find/browser/findController.js +16 -16
  93. package/esm/vs/editor/contrib/find/browser/findWidget.js +26 -26
  94. package/esm/vs/editor/contrib/folding/browser/folding.js +20 -20
  95. package/esm/vs/editor/contrib/folding/browser/folding.js.map +1 -1
  96. package/esm/vs/editor/contrib/folding/browser/foldingDecorations.js +9 -9
  97. package/esm/vs/editor/contrib/folding/browser/foldingDecorations.js.map +1 -1
  98. package/esm/vs/editor/contrib/fontZoom/browser/fontZoom.js +3 -3
  99. package/esm/vs/editor/contrib/format/browser/formatActions.js +2 -2
  100. package/esm/vs/editor/contrib/gotoError/browser/gotoError.js +8 -8
  101. package/esm/vs/editor/contrib/gotoError/browser/gotoErrorWidget.js +14 -14
  102. package/esm/vs/editor/contrib/gotoSymbol/browser/goToCommands.js +39 -39
  103. package/esm/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js +1 -1
  104. package/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesController.js +3 -3
  105. package/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesTree.js +3 -3
  106. package/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget.js +3 -3
  107. package/esm/vs/editor/contrib/gotoSymbol/browser/referencesModel.js +8 -8
  108. package/esm/vs/editor/contrib/gotoSymbol/browser/symbolNavigation.js +3 -3
  109. package/esm/vs/editor/contrib/gpu/browser/gpuActions.js +4 -4
  110. package/esm/vs/editor/contrib/hover/browser/glyphHoverWidget.js +22 -2
  111. package/esm/vs/editor/contrib/hover/browser/glyphHoverWidget.js.map +1 -1
  112. package/esm/vs/editor/contrib/hover/browser/hoverActionIds.js +2 -2
  113. package/esm/vs/editor/contrib/hover/browser/hoverActions.js +24 -24
  114. package/esm/vs/editor/contrib/hover/browser/markdownHoverParticipant.js +9 -9
  115. package/esm/vs/editor/contrib/hover/browser/markerHoverParticipant.js +5 -5
  116. package/esm/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace.js +2 -2
  117. package/esm/vs/editor/contrib/indentation/browser/indentation.js +20 -20
  118. package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsHover.js +8 -8
  119. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commands.js +18 -51
  120. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commands.js.map +1 -1
  121. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionContextKeys.js +12 -12
  122. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js +1 -1
  123. package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/hoverParticipant.js +1 -1
  124. package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/inlineCompletionsHintsWidget.js +5 -5
  125. package/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js +2 -4
  126. package/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js.map +1 -1
  127. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.js +0 -1
  128. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.js.map +1 -1
  129. package/esm/vs/editor/contrib/inlineCompletions/browser/telemetry.js.map +1 -1
  130. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js +6 -6
  131. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js +1 -1
  132. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js +20 -20
  133. package/esm/vs/editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js +1 -1
  134. package/esm/vs/editor/contrib/lineSelection/browser/lineSelection.js +1 -1
  135. package/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js +31 -31
  136. package/esm/vs/editor/contrib/linkedEditing/browser/linkedEditing.js +2 -2
  137. package/esm/vs/editor/contrib/links/browser/links.js +10 -10
  138. package/esm/vs/editor/contrib/message/browser/messageController.js +1 -1
  139. package/esm/vs/editor/contrib/multicursor/browser/multicursor.js +22 -22
  140. package/esm/vs/editor/contrib/parameterHints/browser/parameterHints.js +1 -1
  141. package/esm/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.js +4 -4
  142. package/esm/vs/editor/contrib/peekView/browser/peekView.js +18 -18
  143. package/esm/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.js +1 -1
  144. package/esm/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.js +35 -28
  145. package/esm/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.js.map +1 -1
  146. package/esm/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.js +32 -32
  147. package/esm/vs/editor/contrib/readOnlyMessage/browser/contribution.js +2 -2
  148. package/esm/vs/editor/contrib/rename/browser/rename.js +11 -11
  149. package/esm/vs/editor/contrib/rename/browser/renameWidget.js +8 -11
  150. package/esm/vs/editor/contrib/rename/browser/renameWidget.js.map +1 -1
  151. package/esm/vs/editor/contrib/smartSelect/browser/smartSelect.js +4 -4
  152. package/esm/vs/editor/contrib/snippet/browser/snippetController2.js +4 -4
  153. package/esm/vs/editor/contrib/snippet/browser/snippetVariables.js +4 -4
  154. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollActions.js +11 -11
  155. package/esm/vs/editor/contrib/suggest/browser/suggest.js +8 -8
  156. package/esm/vs/editor/contrib/suggest/browser/suggestController.js +10 -10
  157. package/esm/vs/editor/contrib/suggest/browser/suggestWidget.js +17 -17
  158. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js +2 -2
  159. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.js +2 -2
  160. package/esm/vs/editor/contrib/suggest/browser/wordContextKey.js +1 -1
  161. package/esm/vs/editor/contrib/symbolIcons/browser/symbolIcons.js +33 -33
  162. package/esm/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js +4 -4
  163. package/esm/vs/editor/contrib/tokenization/browser/tokenization.js +1 -1
  164. package/esm/vs/editor/contrib/unicodeHighlighter/browser/bannerController.js +1 -1
  165. package/esm/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js +24 -24
  166. package/esm/vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js +5 -5
  167. package/esm/vs/editor/contrib/wordHighlighter/browser/highlightDecorations.js +9 -9
  168. package/esm/vs/editor/contrib/wordHighlighter/browser/wordHighlighter.js +3 -3
  169. package/esm/vs/editor/contrib/wordOperations/browser/wordOperations.js +1 -1
  170. package/esm/vs/platform/accessibilitySignal/browser/accessibilitySignalService.js +62 -62
  171. package/esm/vs/platform/action/common/actionCommonCategories.js +6 -6
  172. package/esm/vs/platform/actionWidget/browser/actionList.js +4 -4
  173. package/esm/vs/platform/actionWidget/browser/actionWidget.js +7 -7
  174. package/esm/vs/platform/actions/browser/menuEntryActionViewItem.js +5 -5
  175. package/esm/vs/platform/actions/browser/toolbar.js +2 -2
  176. package/esm/vs/platform/actions/common/menuService.js +2 -2
  177. package/esm/vs/platform/configuration/common/configurationRegistry.js +10 -10
  178. package/esm/vs/platform/contextkey/browser/contextKeyService.js +1 -1
  179. package/esm/vs/platform/contextkey/common/contextkey.js +9 -9
  180. package/esm/vs/platform/contextkey/common/contextkeys.js +9 -9
  181. package/esm/vs/platform/contextkey/common/scanner.js +5 -5
  182. package/esm/vs/platform/history/browser/contextScopedHistoryWidget.js +1 -1
  183. package/esm/vs/platform/keybinding/common/abstractKeybindingService.js +4 -4
  184. package/esm/vs/platform/list/browser/listService.js +27 -27
  185. package/esm/vs/platform/markers/common/markerService.js +2 -2
  186. package/esm/vs/platform/markers/common/markers.js +6 -6
  187. package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js +7 -7
  188. package/esm/vs/platform/quickinput/browser/helpQuickAccess.js +1 -1
  189. package/esm/vs/platform/quickinput/browser/quickInput.js +10 -10
  190. package/esm/vs/platform/quickinput/browser/quickInputActions.js +5 -5
  191. package/esm/vs/platform/quickinput/browser/quickInputController.js +6 -6
  192. package/esm/vs/platform/quickinput/browser/quickInputList.js +1 -1
  193. package/esm/vs/platform/quickinput/browser/quickInputUtils.js +1 -1
  194. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeAccessibilityProvider.js +1 -1
  195. package/esm/vs/platform/theme/common/colorUtils.js +2 -2
  196. package/esm/vs/platform/theme/common/colors/baseColors.js +17 -17
  197. package/esm/vs/platform/theme/common/colors/chartsColors.js +8 -8
  198. package/esm/vs/platform/theme/common/colors/editorColors.js +95 -95
  199. package/esm/vs/platform/theme/common/colors/inputColors.js +47 -47
  200. package/esm/vs/platform/theme/common/colors/listColors.js +36 -36
  201. package/esm/vs/platform/theme/common/colors/menuColors.js +7 -7
  202. package/esm/vs/platform/theme/common/colors/minimapColors.js +11 -11
  203. package/esm/vs/platform/theme/common/colors/miscColors.js +15 -15
  204. package/esm/vs/platform/theme/common/colors/quickpickColors.js +9 -9
  205. package/esm/vs/platform/theme/common/colors/searchColors.js +3 -3
  206. package/esm/vs/platform/theme/common/iconRegistry.js +6 -6
  207. package/esm/vs/platform/undoRedo/common/undoRedoService.js +20 -20
  208. package/esm/vs/platform/workspace/common/workspace.js +1 -1
  209. package/package.json +2 -2
  210. package/version.txt +1 -1
@@ -52,6 +52,7 @@ let NativeEditContext = class NativeEditContext extends AbstractEditContext {
52
52
  this._targetWindowId = -1;
53
53
  this._scrollTop = 0;
54
54
  this._scrollLeft = 0;
55
+ this._linesVisibleRanges = null;
55
56
  this.domNode = new FastDomNode(document.createElement('div'));
56
57
  this.domNode.setClassName(`native-edit-context`);
57
58
  this._imeTextArea = new FastDomNode(document.createElement('textarea'));
@@ -200,7 +201,10 @@ let NativeEditContext = class NativeEditContext extends AbstractEditContext {
200
201
  }
201
202
  prepareRender(ctx) {
202
203
  this._screenReaderSupport.prepareRender(ctx);
203
- this._updateSelectionAndControlBounds(ctx);
204
+ this._updateSelectionAndControlBoundsData(ctx);
205
+ }
206
+ onDidRender() {
207
+ this._updateSelectionAndControlBoundsAfterRender();
204
208
  }
205
209
  render(ctx) {
206
210
  this._screenReaderSupport.render(ctx);
@@ -409,24 +413,31 @@ let NativeEditContext = class NativeEditContext extends AbstractEditContext {
409
413
  });
410
414
  this._decorations = this._context.viewModel.model.deltaDecorations(this._decorations, decorations);
411
415
  }
412
- _updateSelectionAndControlBounds(ctx) {
413
- if (!this._parent) {
414
- return;
416
+ _updateSelectionAndControlBoundsData(ctx) {
417
+ const viewSelection = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(this._primarySelection);
418
+ if (this._primarySelection.isEmpty()) {
419
+ const linesVisibleRanges = ctx.visibleRangeForPosition(viewSelection.getStartPosition());
420
+ this._linesVisibleRanges = linesVisibleRanges;
421
+ }
422
+ else {
423
+ this._linesVisibleRanges = null;
415
424
  }
425
+ }
426
+ _updateSelectionAndControlBoundsAfterRender() {
416
427
  const options = this._context.configuration.options;
417
428
  const contentLeft = options.get(165 /* EditorOption.layoutInfo */).contentLeft;
418
- const parentBounds = this._parent.getBoundingClientRect();
419
429
  const viewSelection = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(this._primarySelection);
420
430
  const verticalOffsetStart = this._context.viewLayout.getVerticalOffsetForLineNumber(viewSelection.startLineNumber);
421
- const top = parentBounds.top + verticalOffsetStart - this._scrollTop;
422
431
  const verticalOffsetEnd = this._context.viewLayout.getVerticalOffsetAfterLineNumber(viewSelection.endLineNumber);
432
+ // Make sure this doesn't force an extra layout (i.e. don't call it before rendering finished)
433
+ const parentBounds = this._parent.getBoundingClientRect();
434
+ const top = parentBounds.top + verticalOffsetStart - this._scrollTop;
423
435
  const height = verticalOffsetEnd - verticalOffsetStart;
424
436
  let left = parentBounds.left + contentLeft - this._scrollLeft;
425
437
  let width;
426
438
  if (this._primarySelection.isEmpty()) {
427
- const linesVisibleRanges = ctx.visibleRangeForPosition(viewSelection.getStartPosition());
428
- if (linesVisibleRanges) {
429
- left += linesVisibleRanges.left;
439
+ if (this._linesVisibleRanges) {
440
+ left += this._linesVisibleRanges.left;
430
441
  }
431
442
  width = 0;
432
443
  }
@@ -438,9 +449,6 @@ let NativeEditContext = class NativeEditContext extends AbstractEditContext {
438
449
  this._editContext.updateControlBounds(selectionBounds);
439
450
  }
440
451
  _updateCharacterBounds(e) {
441
- if (!this._parent) {
442
- return;
443
- }
444
452
  const options = this._context.configuration.options;
445
453
  const typicalHalfWidthCharacterWidth = options.get(59 /* EditorOption.fontInfo */).typicalHalfwidthCharacterWidth;
446
454
  const contentLeft = options.get(165 /* EditorOption.layoutInfo */).contentLeft;
@@ -1 +1 @@
1
- {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/browser/controller/editContext/native/nativeEditContext.ts","vs/editor/browser/controller/editContext/native/nativeEditContext.ts"],"names":[],"mappings":"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","file":"nativeEditContext.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport './nativeEditContext.css';\nimport { isFirefox } from '../../../../../base/browser/browser.js';\nimport { addDisposableListener, getActiveElement, getWindow, getWindowId } from '../../../../../base/browser/dom.js';\nimport { FastDomNode } from '../../../../../base/browser/fastDomNode.js';\nimport { StandardKeyboardEvent } from '../../../../../base/browser/keyboardEvent.js';\nimport { KeyCode } from '../../../../../base/common/keyCodes.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { EditorOption } from '../../../../common/config/editorOptions.js';\nimport { EndOfLinePreference, IModelDeltaDecoration } from '../../../../common/model.js';\nimport { ViewConfigurationChangedEvent, ViewCursorStateChangedEvent, ViewDecorationsChangedEvent, ViewFlushedEvent, ViewLinesChangedEvent, ViewLinesDeletedEvent, ViewLinesInsertedEvent, ViewScrollChangedEvent, ViewZonesChangedEvent } from '../../../../common/viewEvents.js';\nimport { ViewContext } from '../../../../common/viewModel/viewContext.js';\nimport { RestrictedRenderingContext, RenderingContext } from '../../../view/renderingContext.js';\nimport { ViewController } from '../../../view/viewController.js';\nimport { ClipboardEventUtils, ClipboardStoredMetadata, getDataToCopy, InMemoryClipboardMetadataManager } from '../clipboardUtils.js';\nimport { AbstractEditContext } from '../editContext.js';\nimport { editContextAddDisposableListener, FocusTracker, ITypeData } from './nativeEditContextUtils.js';\nimport { ScreenReaderSupport } from './screenReaderSupport.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { Selection } from '../../../../common/core/selection.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { IVisibleRangeProvider } from '../textArea/textAreaEditContext.js';\nimport { PositionOffsetTransformer } from '../../../../common/core/text/positionToOffset.js';\nimport { EditContext } from './editContextFactory.js';\nimport { NativeEditContextRegistry } from './nativeEditContextRegistry.js';\nimport { IEditorAriaOptions } from '../../../editorBrowser.js';\nimport { isHighSurrogate, isLowSurrogate } from '../../../../../base/common/strings.js';\nimport { IME } from '../../../../../base/common/ime.js';\nimport { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';\nimport { ILogService, LogLevel } from '../../../../../platform/log/common/log.js';\nimport { generateUuid } from '../../../../../base/common/uuid.js';\n\n// Corresponds to classes in nativeEditContext.css\nenum CompositionClassName {\n\tNONE = 'edit-context-composition-none',\n\tSECONDARY = 'edit-context-composition-secondary',\n\tPRIMARY = 'edit-context-composition-primary',\n}\n\ninterface ITextUpdateEvent {\n\ttext: string;\n\tselectionStart: number;\n\tselectionEnd: number;\n\tupdateRangeStart: number;\n\tupdateRangeEnd: number;\n}\n\nexport class NativeEditContext extends AbstractEditContext {\n\n\t// Text area used to handle paste events\n\tpublic readonly domNode: FastDomNode<HTMLDivElement>;\n\tprivate readonly _imeTextArea: FastDomNode<HTMLTextAreaElement>;\n\tprivate readonly _editContext: EditContext;\n\tprivate readonly _screenReaderSupport: ScreenReaderSupport;\n\tprivate _previousEditContextSelection: OffsetRange = new OffsetRange(0, 0);\n\tprivate _editContextPrimarySelection: Selection = new Selection(1, 1, 1, 1);\n\n\t// Overflow guard container\n\tprivate _parent: HTMLElement | undefined;\n\tprivate _decorations: string[] = [];\n\tprivate _primarySelection: Selection = new Selection(1, 1, 1, 1);\n\n\n\tprivate _targetWindowId: number = -1;\n\tprivate _scrollTop: number = 0;\n\tprivate _scrollLeft: number = 0;\n\n\tprivate readonly _focusTracker: FocusTracker;\n\n\tconstructor(\n\t\townerID: string,\n\t\tcontext: ViewContext,\n\t\toverflowGuardContainer: FastDomNode<HTMLElement>,\n\t\tprivate readonly _viewController: ViewController,\n\t\tprivate readonly _visibleRangeProvider: IVisibleRangeProvider,\n\t\t@IInstantiationService instantiationService: IInstantiationService,\n\t\t@ILogService private readonly logService: ILogService\n\t) {\n\t\tsuper(context);\n\n\t\tthis.domNode = new FastDomNode(document.createElement('div'));\n\t\tthis.domNode.setClassName(`native-edit-context`);\n\t\tthis._imeTextArea = new FastDomNode(document.createElement('textarea'));\n\t\tthis._imeTextArea.setClassName(`ime-text-area`);\n\t\tthis._imeTextArea.setAttribute('readonly', 'true');\n\t\tthis._imeTextArea.setAttribute('tabindex', '-1');\n\t\tthis._imeTextArea.setAttribute('aria-hidden', 'true');\n\t\tthis.domNode.setAttribute('autocorrect', 'off');\n\t\tthis.domNode.setAttribute('autocapitalize', 'off');\n\t\tthis.domNode.setAttribute('autocomplete', 'off');\n\t\tthis.domNode.setAttribute('spellcheck', 'false');\n\n\t\tthis._updateDomAttributes();\n\n\t\toverflowGuardContainer.appendChild(this.domNode);\n\t\toverflowGuardContainer.appendChild(this._imeTextArea);\n\t\tthis._parent = overflowGuardContainer.domNode;\n\n\t\tthis._focusTracker = this._register(new FocusTracker(logService, this.domNode.domNode, (newFocusValue: boolean) => {\n\t\t\tlogService.trace('NativeEditContext#handleFocusChange : ', newFocusValue);\n\t\t\tthis._screenReaderSupport.handleFocusChange(newFocusValue);\n\t\t\tthis._context.viewModel.setHasFocus(newFocusValue);\n\t\t}));\n\n\t\tconst window = getWindow(this.domNode.domNode);\n\t\tthis._editContext = EditContext.create(window);\n\t\tthis.setEditContextOnDomNode();\n\n\t\tthis._screenReaderSupport = this._register(instantiationService.createInstance(ScreenReaderSupport, this.domNode, context, this._viewController));\n\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'copy', (e) => {\n\t\t\tthis.logService.trace('NativeEditContext#copy');\n\t\t\tthis._ensureClipboardGetsEditorSelection(e);\n\t\t}));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'cut', (e) => {\n\t\t\tthis.logService.trace('NativeEditContext#cut');\n\t\t\t// Pretend here we touched the text area, as the `cut` event will most likely\n\t\t\t// result in a `selectionchange` event which we want to ignore\n\t\t\tthis._screenReaderSupport.onWillCut();\n\t\t\tthis._ensureClipboardGetsEditorSelection(e);\n\t\t\tthis.logService.trace('NativeEditContext#cut (before viewController.cut)');\n\t\t\tthis._viewController.cut();\n\t\t}));\n\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'keyup', (e) => this._onKeyUp(e)));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'keydown', async (e) => this._onKeyDown(e)));\n\t\tthis._register(addDisposableListener(this._imeTextArea.domNode, 'keyup', (e) => this._onKeyUp(e)));\n\t\tthis._register(addDisposableListener(this._imeTextArea.domNode, 'keydown', async (e) => this._onKeyDown(e)));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'beforeinput', async (e) => {\n\t\t\tif (e.inputType === 'insertParagraph' || e.inputType === 'insertLineBreak') {\n\t\t\t\tthis._onType(this._viewController, { text: '\\n', replacePrevCharCnt: 0, replaceNextCharCnt: 0, positionDelta: 0 });\n\t\t\t}\n\t\t}));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'paste', (e) => {\n\t\t\tthis.logService.trace('NativeEditContext#paste');\n\t\t\te.preventDefault();\n\t\t\tif (!e.clipboardData) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet [text, metadata] = ClipboardEventUtils.getTextData(e.clipboardData);\n\t\t\tthis.logService.trace('NativeEditContext#paste with id : ', metadata?.id, ' with text.length: ', text.length);\n\t\t\tif (!text) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmetadata = metadata || InMemoryClipboardMetadataManager.INSTANCE.get(text);\n\t\t\tlet pasteOnNewLine = false;\n\t\t\tlet multicursorText: string[] | null = null;\n\t\t\tlet mode: string | null = null;\n\t\t\tif (metadata) {\n\t\t\t\tconst options = this._context.configuration.options;\n\t\t\t\tconst emptySelectionClipboard = options.get(EditorOption.emptySelectionClipboard);\n\t\t\t\tpasteOnNewLine = emptySelectionClipboard && !!metadata.isFromEmptySelection;\n\t\t\t\tmulticursorText = typeof metadata.multicursorText !== 'undefined' ? metadata.multicursorText : null;\n\t\t\t\tmode = metadata.mode;\n\t\t\t}\n\t\t\tthis.logService.trace('NativeEditContext#paste (before viewController.paste)');\n\t\t\tthis._viewController.paste(text, pasteOnNewLine, multicursorText, mode);\n\t\t}));\n\n\t\t// Edit context events\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'textformatupdate', (e) => this._handleTextFormatUpdate(e)));\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'characterboundsupdate', (e) => this._updateCharacterBounds(e)));\n\t\tlet highSurrogateCharacter: string | undefined;\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'textupdate', (e) => {\n\t\t\tconst text = e.text;\n\t\t\tif (text.length === 1) {\n\t\t\t\tconst charCode = text.charCodeAt(0);\n\t\t\t\tif (isHighSurrogate(charCode)) {\n\t\t\t\t\thighSurrogateCharacter = text;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (isLowSurrogate(charCode) && highSurrogateCharacter) {\n\t\t\t\t\tconst textUpdateEvent: ITextUpdateEvent = {\n\t\t\t\t\t\ttext: highSurrogateCharacter + text,\n\t\t\t\t\t\tselectionEnd: e.selectionEnd,\n\t\t\t\t\t\tselectionStart: e.selectionStart,\n\t\t\t\t\t\tupdateRangeStart: e.updateRangeStart - 1,\n\t\t\t\t\t\tupdateRangeEnd: e.updateRangeEnd - 1\n\t\t\t\t\t};\n\t\t\t\t\thighSurrogateCharacter = undefined;\n\t\t\t\t\tthis._emitTypeEvent(this._viewController, textUpdateEvent);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._emitTypeEvent(this._viewController, e);\n\t\t}));\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'compositionstart', (e) => {\n\t\t\tthis._updateEditContext();\n\t\t\t// Utlimately fires onDidCompositionStart() on the editor to notify for example suggest model of composition state\n\t\t\t// Updates the composition state of the cursor controller which determines behavior of typing with interceptors\n\t\t\tthis._viewController.compositionStart();\n\t\t\t// Emits ViewCompositionStartEvent which can be depended on by ViewEventHandlers\n\t\t\tthis._context.viewModel.onCompositionStart();\n\t\t}));\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'compositionend', (e) => {\n\t\t\tthis._updateEditContext();\n\t\t\t// Utlimately fires compositionEnd() on the editor to notify for example suggest model of composition state\n\t\t\t// Updates the composition state of the cursor controller which determines behavior of typing with interceptors\n\t\t\tthis._viewController.compositionEnd();\n\t\t\t// Emits ViewCompositionEndEvent which can be depended on by ViewEventHandlers\n\t\t\tthis._context.viewModel.onCompositionEnd();\n\t\t}));\n\t\tlet reenableTracking: boolean = false;\n\t\tthis._register(IME.onDidChange(() => {\n\t\t\tif (IME.enabled && reenableTracking) {\n\t\t\t\tthis._focusTracker.resume();\n\t\t\t\tthis.domNode.focus();\n\t\t\t\treenableTracking = false;\n\t\t\t}\n\t\t\tif (!IME.enabled && this.isFocused()) {\n\t\t\t\tthis._focusTracker.pause();\n\t\t\t\tthis._imeTextArea.focus();\n\t\t\t\treenableTracking = true;\n\t\t\t}\n\t\t}));\n\t\tthis._register(NativeEditContextRegistry.register(ownerID, this));\n\t}\n\n\t// --- Public methods ---\n\n\tpublic override dispose(): void {\n\t\t// Force blue the dom node so can write in pane with no native edit context after disposal\n\t\tthis.domNode.domNode.editContext = undefined;\n\t\tthis.domNode.domNode.blur();\n\t\tthis.domNode.domNode.remove();\n\t\tthis._imeTextArea.domNode.remove();\n\t\tsuper.dispose();\n\t}\n\n\tpublic setAriaOptions(options: IEditorAriaOptions): void {\n\t\tthis._screenReaderSupport.setAriaOptions(options);\n\t}\n\n\t/* Last rendered data needed for correct hit-testing and determining the mouse position.\n\t * Without this, the selection will blink as incorrect mouse position is calculated */\n\tpublic getLastRenderData(): Position | null {\n\t\treturn this._primarySelection.getPosition();\n\t}\n\n\tpublic prepareRender(ctx: RenderingContext): void {\n\t\tthis._screenReaderSupport.prepareRender(ctx);\n\t\tthis._updateSelectionAndControlBounds(ctx);\n\t}\n\n\tpublic render(ctx: RestrictedRenderingContext): void {\n\t\tthis._screenReaderSupport.render(ctx);\n\t}\n\n\tpublic override onCursorStateChanged(e: ViewCursorStateChangedEvent): boolean {\n\t\tthis._primarySelection = e.modelSelections[0] ?? new Selection(1, 1, 1, 1);\n\t\tthis._screenReaderSupport.onCursorStateChanged(e);\n\t\tthis._updateEditContext();\n\t\treturn true;\n\t}\n\n\tpublic override onConfigurationChanged(e: ViewConfigurationChangedEvent): boolean {\n\t\tthis._screenReaderSupport.onConfigurationChanged(e);\n\t\tthis._updateDomAttributes();\n\t\treturn true;\n\t}\n\n\tpublic override onDecorationsChanged(e: ViewDecorationsChangedEvent): boolean {\n\t\t// true for inline decorations that can end up relayouting text\n\t\treturn true;\n\t}\n\n\tpublic override onFlushed(e: ViewFlushedEvent): boolean {\n\t\treturn true;\n\t}\n\n\tpublic override onLinesChanged(e: ViewLinesChangedEvent): boolean {\n\t\tthis._updateEditContextOnLineChange(e.fromLineNumber, e.fromLineNumber + e.count - 1);\n\t\treturn true;\n\t}\n\n\tpublic override onLinesDeleted(e: ViewLinesDeletedEvent): boolean {\n\t\tthis._updateEditContextOnLineChange(e.fromLineNumber, e.toLineNumber);\n\t\treturn true;\n\t}\n\n\tpublic override onLinesInserted(e: ViewLinesInsertedEvent): boolean {\n\t\tthis._updateEditContextOnLineChange(e.fromLineNumber, e.toLineNumber);\n\t\treturn true;\n\t}\n\n\tprivate _updateEditContextOnLineChange(fromLineNumber: number, toLineNumber: number): void {\n\t\tif (this._editContextPrimarySelection.endLineNumber < fromLineNumber || this._editContextPrimarySelection.startLineNumber > toLineNumber) {\n\t\t\treturn;\n\t\t}\n\t\tthis._updateEditContext();\n\t}\n\n\tpublic override onScrollChanged(e: ViewScrollChangedEvent): boolean {\n\t\tthis._scrollLeft = e.scrollLeft;\n\t\tthis._scrollTop = e.scrollTop;\n\t\treturn true;\n\t}\n\n\tpublic override onZonesChanged(e: ViewZonesChangedEvent): boolean {\n\t\treturn true;\n\t}\n\n\tpublic onWillPaste(): void {\n\t\tthis.logService.trace('NativeEditContext#onWillPaste');\n\t\tthis._onWillPaste();\n\t}\n\n\tprivate _onWillPaste(): void {\n\t\tthis._screenReaderSupport.onWillPaste();\n\t}\n\n\tpublic onWillCopy(): void {\n\t\tthis.logService.trace('NativeEditContext#onWillCopy');\n\t\tthis.logService.trace('NativeEditContext#isFocused : ', this.domNode.domNode === getActiveElement());\n\t}\n\n\tpublic writeScreenReaderContent(): void {\n\t\tthis._screenReaderSupport.writeScreenReaderContent();\n\t}\n\n\tpublic isFocused(): boolean {\n\t\treturn this._focusTracker.isFocused;\n\t}\n\n\tpublic focus(): void {\n\t\tthis._focusTracker.focus();\n\n\t\t// If the editor is off DOM, focus cannot be really set, so let's double check that we have managed to set the focus\n\t\tthis.refreshFocusState();\n\t}\n\n\tpublic refreshFocusState(): void {\n\t\tthis._focusTracker.refreshFocusState();\n\t}\n\n\t// TODO: added as a workaround fix for https://github.com/microsoft/vscode/issues/229825\n\t// When this issue will be fixed the following should be removed.\n\tpublic setEditContextOnDomNode(): void {\n\t\tconst targetWindow = getWindow(this.domNode.domNode);\n\t\tconst targetWindowId = getWindowId(targetWindow);\n\t\tif (this._targetWindowId !== targetWindowId) {\n\t\t\tthis.domNode.domNode.editContext = this._editContext;\n\t\t\tthis._targetWindowId = targetWindowId;\n\t\t}\n\t}\n\n\t// --- Private methods ---\n\n\tprivate _onKeyUp(e: KeyboardEvent) {\n\t\tthis._viewController.emitKeyUp(new StandardKeyboardEvent(e));\n\t}\n\n\tprivate _onKeyDown(e: KeyboardEvent) {\n\t\tconst standardKeyboardEvent = new StandardKeyboardEvent(e);\n\t\t// When the IME is visible, the keys, like arrow-left and arrow-right, should be used to navigate in the IME, and should not be propagated further\n\t\tif (standardKeyboardEvent.keyCode === KeyCode.KEY_IN_COMPOSITION) {\n\t\t\tstandardKeyboardEvent.stopPropagation();\n\t\t}\n\t\tthis._viewController.emitKeyDown(standardKeyboardEvent);\n\t}\n\n\tprivate _updateDomAttributes(): void {\n\t\tconst options = this._context.configuration.options;\n\t\tthis.domNode.domNode.setAttribute('tabindex', String(options.get(EditorOption.tabIndex)));\n\t}\n\n\tprivate _updateEditContext(): void {\n\t\tconst editContextState = this._getNewEditContextState();\n\t\tif (!editContextState) {\n\t\t\treturn;\n\t\t}\n\t\tthis._editContext.updateText(0, Number.MAX_SAFE_INTEGER, editContextState.text ?? ' ');\n\t\tthis._editContext.updateSelection(editContextState.selectionStartOffset, editContextState.selectionEndOffset);\n\t\tthis._editContextPrimarySelection = editContextState.editContextPrimarySelection;\n\t\tthis._previousEditContextSelection = new OffsetRange(editContextState.selectionStartOffset, editContextState.selectionEndOffset);\n\t}\n\n\tprivate _emitTypeEvent(viewController: ViewController, e: ITextUpdateEvent): void {\n\t\tif (!this._editContext) {\n\t\t\treturn;\n\t\t}\n\t\tconst selectionEndOffset = this._previousEditContextSelection.endExclusive;\n\t\tconst selectionStartOffset = this._previousEditContextSelection.start;\n\t\tthis._previousEditContextSelection = new OffsetRange(e.selectionStart, e.selectionEnd);\n\n\t\tlet replaceNextCharCnt = 0;\n\t\tlet replacePrevCharCnt = 0;\n\t\tif (e.updateRangeEnd > selectionEndOffset) {\n\t\t\treplaceNextCharCnt = e.updateRangeEnd - selectionEndOffset;\n\t\t}\n\t\tif (e.updateRangeStart < selectionStartOffset) {\n\t\t\treplacePrevCharCnt = selectionStartOffset - e.updateRangeStart;\n\t\t}\n\t\tlet text = '';\n\t\tif (selectionStartOffset < e.updateRangeStart) {\n\t\t\ttext += this._editContext.text.substring(selectionStartOffset, e.updateRangeStart);\n\t\t}\n\t\ttext += e.text;\n\t\tif (selectionEndOffset > e.updateRangeEnd) {\n\t\t\ttext += this._editContext.text.substring(e.updateRangeEnd, selectionEndOffset);\n\t\t}\n\t\tlet positionDelta = 0;\n\t\tif (e.selectionStart === e.selectionEnd && selectionStartOffset === selectionEndOffset) {\n\t\t\tpositionDelta = e.selectionStart - (e.updateRangeStart + e.text.length);\n\t\t}\n\t\tconst typeInput: ITypeData = {\n\t\t\ttext,\n\t\t\treplacePrevCharCnt,\n\t\t\treplaceNextCharCnt,\n\t\t\tpositionDelta\n\t\t};\n\t\tthis._onType(viewController, typeInput);\n\t}\n\n\tprivate _onType(viewController: ViewController, typeInput: ITypeData): void {\n\t\tif (typeInput.replacePrevCharCnt || typeInput.replaceNextCharCnt || typeInput.positionDelta) {\n\t\t\tviewController.compositionType(typeInput.text, typeInput.replacePrevCharCnt, typeInput.replaceNextCharCnt, typeInput.positionDelta);\n\t\t} else {\n\t\t\tviewController.type(typeInput.text);\n\t\t}\n\t}\n\n\tprivate _getNewEditContextState(): { text: string; selectionStartOffset: number; selectionEndOffset: number; editContextPrimarySelection: Selection } | undefined {\n\t\tconst editContextPrimarySelection = this._primarySelection;\n\t\tconst model = this._context.viewModel.model;\n\t\tif (!model.isValidRange(editContextPrimarySelection)) {\n\t\t\treturn;\n\t\t}\n\t\tconst primarySelectionStartLine = editContextPrimarySelection.startLineNumber;\n\t\tconst primarySelectionEndLine = editContextPrimarySelection.endLineNumber;\n\t\tconst endColumnOfEndLineNumber = model.getLineMaxColumn(primarySelectionEndLine);\n\t\tconst rangeOfText = new Range(primarySelectionStartLine, 1, primarySelectionEndLine, endColumnOfEndLineNumber);\n\t\tconst text = model.getValueInRange(rangeOfText, EndOfLinePreference.TextDefined);\n\t\tconst selectionStartOffset = editContextPrimarySelection.startColumn - 1;\n\t\tconst selectionEndOffset = text.length + editContextPrimarySelection.endColumn - endColumnOfEndLineNumber;\n\t\treturn {\n\t\t\ttext,\n\t\t\tselectionStartOffset,\n\t\t\tselectionEndOffset,\n\t\t\teditContextPrimarySelection\n\t\t};\n\t}\n\n\tprivate _editContextStartPosition(): Position {\n\t\treturn new Position(this._editContextPrimarySelection.startLineNumber, 1);\n\t}\n\n\tprivate _handleTextFormatUpdate(e: TextFormatUpdateEvent): void {\n\t\tif (!this._editContext) {\n\t\t\treturn;\n\t\t}\n\t\tconst formats = e.getTextFormats();\n\t\tconst editContextStartPosition = this._editContextStartPosition();\n\t\tconst decorations: IModelDeltaDecoration[] = [];\n\t\tformats.forEach(f => {\n\t\t\tconst textModel = this._context.viewModel.model;\n\t\t\tconst offsetOfEditContextText = textModel.getOffsetAt(editContextStartPosition);\n\t\t\tconst startPositionOfDecoration = textModel.getPositionAt(offsetOfEditContextText + f.rangeStart);\n\t\t\tconst endPositionOfDecoration = textModel.getPositionAt(offsetOfEditContextText + f.rangeEnd);\n\t\t\tconst decorationRange = Range.fromPositions(startPositionOfDecoration, endPositionOfDecoration);\n\t\t\tconst thickness = f.underlineThickness.toLowerCase();\n\t\t\tlet decorationClassName: string = CompositionClassName.NONE;\n\t\t\tswitch (thickness) {\n\t\t\t\tcase 'thin':\n\t\t\t\t\tdecorationClassName = CompositionClassName.SECONDARY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'thick':\n\t\t\t\t\tdecorationClassName = CompositionClassName.PRIMARY;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdecorations.push({\n\t\t\t\trange: decorationRange,\n\t\t\t\toptions: {\n\t\t\t\t\tdescription: 'textFormatDecoration',\n\t\t\t\t\tinlineClassName: decorationClassName,\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tthis._decorations = this._context.viewModel.model.deltaDecorations(this._decorations, decorations);\n\t}\n\n\tprivate _updateSelectionAndControlBounds(ctx: RenderingContext) {\n\t\tif (!this._parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst options = this._context.configuration.options;\n\t\tconst contentLeft = options.get(EditorOption.layoutInfo).contentLeft;\n\t\tconst parentBounds = this._parent.getBoundingClientRect();\n\t\tconst viewSelection = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(this._primarySelection);\n\t\tconst verticalOffsetStart = this._context.viewLayout.getVerticalOffsetForLineNumber(viewSelection.startLineNumber);\n\n\t\tconst top = parentBounds.top + verticalOffsetStart - this._scrollTop;\n\t\tconst verticalOffsetEnd = this._context.viewLayout.getVerticalOffsetAfterLineNumber(viewSelection.endLineNumber);\n\t\tconst height = verticalOffsetEnd - verticalOffsetStart;\n\t\tlet left = parentBounds.left + contentLeft - this._scrollLeft;\n\t\tlet width: number;\n\n\t\tif (this._primarySelection.isEmpty()) {\n\t\t\tconst linesVisibleRanges = ctx.visibleRangeForPosition(viewSelection.getStartPosition());\n\t\t\tif (linesVisibleRanges) {\n\t\t\t\tleft += linesVisibleRanges.left;\n\t\t\t}\n\t\t\twidth = 0;\n\t\t} else {\n\t\t\twidth = parentBounds.width - contentLeft;\n\t\t}\n\n\t\tconst selectionBounds = new DOMRect(left, top, width, height);\n\t\tthis._editContext.updateSelectionBounds(selectionBounds);\n\t\tthis._editContext.updateControlBounds(selectionBounds);\n\t}\n\n\tprivate _updateCharacterBounds(e: CharacterBoundsUpdateEvent): void {\n\t\tif (!this._parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst options = this._context.configuration.options;\n\t\tconst typicalHalfWidthCharacterWidth = options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth;\n\t\tconst contentLeft = options.get(EditorOption.layoutInfo).contentLeft;\n\t\tconst parentBounds = this._parent.getBoundingClientRect();\n\n\t\tconst characterBounds: DOMRect[] = [];\n\t\tconst offsetTransformer = new PositionOffsetTransformer(this._editContext.text);\n\t\tfor (let offset = e.rangeStart; offset < e.rangeEnd; offset++) {\n\t\t\tconst editContextStartPosition = offsetTransformer.getPosition(offset);\n\t\t\tconst textStartLineOffsetWithinEditor = this._editContextPrimarySelection.startLineNumber - 1;\n\t\t\tconst characterStartPosition = new Position(textStartLineOffsetWithinEditor + editContextStartPosition.lineNumber, editContextStartPosition.column);\n\t\t\tconst characterEndPosition = characterStartPosition.delta(0, 1);\n\t\t\tconst characterModelRange = Range.fromPositions(characterStartPosition, characterEndPosition);\n\t\t\tconst characterViewRange = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(characterModelRange);\n\t\t\tconst characterLinesVisibleRanges = this._visibleRangeProvider.linesVisibleRangesForRange(characterViewRange, true) ?? [];\n\t\t\tconst lineNumber = characterViewRange.startLineNumber;\n\t\t\tconst characterVerticalOffset = this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber);\n\t\t\tconst top = parentBounds.top + characterVerticalOffset - this._scrollTop;\n\n\t\t\tlet left = 0;\n\t\t\tlet width = typicalHalfWidthCharacterWidth;\n\t\t\tif (characterLinesVisibleRanges.length > 0) {\n\t\t\t\tfor (const visibleRange of characterLinesVisibleRanges[0].ranges) {\n\t\t\t\t\tleft = visibleRange.left;\n\t\t\t\t\twidth = visibleRange.width;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst lineHeight = this._context.viewLayout.getLineHeightForLineNumber(lineNumber);\n\t\t\tcharacterBounds.push(new DOMRect(parentBounds.left + contentLeft + left - this._scrollLeft, top, width, lineHeight));\n\t\t}\n\t\tthis._editContext.updateCharacterBounds(e.rangeStart, characterBounds);\n\t}\n\n\tprivate _ensureClipboardGetsEditorSelection(e: ClipboardEvent): void {\n\t\tconst options = this._context.configuration.options;\n\t\tconst emptySelectionClipboard = options.get(EditorOption.emptySelectionClipboard);\n\t\tconst copyWithSyntaxHighlighting = options.get(EditorOption.copyWithSyntaxHighlighting);\n\t\tconst selections = this._context.viewModel.getCursorStates().map(cursorState => cursorState.modelState.selection);\n\t\tconst dataToCopy = getDataToCopy(this._context.viewModel, selections, emptySelectionClipboard, copyWithSyntaxHighlighting);\n\t\tlet id = undefined;\n\t\tif (this.logService.getLevel() === LogLevel.Trace) {\n\t\t\tid = generateUuid();\n\t\t}\n\t\tconst storedMetadata: ClipboardStoredMetadata = {\n\t\t\tversion: 1,\n\t\t\tid,\n\t\t\tisFromEmptySelection: dataToCopy.isFromEmptySelection,\n\t\t\tmulticursorText: dataToCopy.multicursorText,\n\t\t\tmode: dataToCopy.mode\n\t\t};\n\t\tInMemoryClipboardMetadataManager.INSTANCE.set(\n\t\t\t// When writing \"LINE\\r\\n\" to the clipboard and then pasting,\n\t\t\t// Firefox pastes \"LINE\\n\", so let's work around this quirk\n\t\t\t(isFirefox ? dataToCopy.text.replace(/\\r\\n/g, '\\n') : dataToCopy.text),\n\t\t\tstoredMetadata\n\t\t);\n\t\te.preventDefault();\n\t\tif (e.clipboardData) {\n\t\t\tClipboardEventUtils.setTextData(e.clipboardData, dataToCopy.text, dataToCopy.html, storedMetadata);\n\t\t}\n\t\tthis.logService.trace('NativeEditContext#_ensureClipboardGetsEditorSelectios with id : ', id, ' with text.length: ', dataToCopy.text.length);\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport './nativeEditContext.css';\nimport { isFirefox } from '../../../../../base/browser/browser.js';\nimport { addDisposableListener, getActiveElement, getWindow, getWindowId } from '../../../../../base/browser/dom.js';\nimport { FastDomNode } from '../../../../../base/browser/fastDomNode.js';\nimport { StandardKeyboardEvent } from '../../../../../base/browser/keyboardEvent.js';\nimport { KeyCode } from '../../../../../base/common/keyCodes.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { EditorOption } from '../../../../common/config/editorOptions.js';\nimport { EndOfLinePreference, IModelDeltaDecoration } from '../../../../common/model.js';\nimport { ViewConfigurationChangedEvent, ViewCursorStateChangedEvent, ViewDecorationsChangedEvent, ViewFlushedEvent, ViewLinesChangedEvent, ViewLinesDeletedEvent, ViewLinesInsertedEvent, ViewScrollChangedEvent, ViewZonesChangedEvent } from '../../../../common/viewEvents.js';\nimport { ViewContext } from '../../../../common/viewModel/viewContext.js';\nimport { RestrictedRenderingContext, RenderingContext } from '../../../view/renderingContext.js';\nimport { ViewController } from '../../../view/viewController.js';\nimport { ClipboardEventUtils, ClipboardStoredMetadata, getDataToCopy, InMemoryClipboardMetadataManager } from '../clipboardUtils.js';\nimport { AbstractEditContext } from '../editContext.js';\nimport { editContextAddDisposableListener, FocusTracker, ITypeData } from './nativeEditContextUtils.js';\nimport { ScreenReaderSupport } from './screenReaderSupport.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { Selection } from '../../../../common/core/selection.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { IVisibleRangeProvider } from '../textArea/textAreaEditContext.js';\nimport { PositionOffsetTransformer } from '../../../../common/core/text/positionToOffset.js';\nimport { EditContext } from './editContextFactory.js';\nimport { NativeEditContextRegistry } from './nativeEditContextRegistry.js';\nimport { IEditorAriaOptions } from '../../../editorBrowser.js';\nimport { isHighSurrogate, isLowSurrogate } from '../../../../../base/common/strings.js';\nimport { IME } from '../../../../../base/common/ime.js';\nimport { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';\nimport { ILogService, LogLevel } from '../../../../../platform/log/common/log.js';\nimport { generateUuid } from '../../../../../base/common/uuid.js';\n\n// Corresponds to classes in nativeEditContext.css\nenum CompositionClassName {\n\tNONE = 'edit-context-composition-none',\n\tSECONDARY = 'edit-context-composition-secondary',\n\tPRIMARY = 'edit-context-composition-primary',\n}\n\ninterface ITextUpdateEvent {\n\ttext: string;\n\tselectionStart: number;\n\tselectionEnd: number;\n\tupdateRangeStart: number;\n\tupdateRangeEnd: number;\n}\n\nexport class NativeEditContext extends AbstractEditContext {\n\n\t// Text area used to handle paste events\n\tpublic readonly domNode: FastDomNode<HTMLDivElement>;\n\tprivate readonly _imeTextArea: FastDomNode<HTMLTextAreaElement>;\n\tprivate readonly _editContext: EditContext;\n\tprivate readonly _screenReaderSupport: ScreenReaderSupport;\n\tprivate _previousEditContextSelection: OffsetRange = new OffsetRange(0, 0);\n\tprivate _editContextPrimarySelection: Selection = new Selection(1, 1, 1, 1);\n\n\t// Overflow guard container\n\tprivate _parent: HTMLElement | undefined;\n\tprivate _decorations: string[] = [];\n\tprivate _primarySelection: Selection = new Selection(1, 1, 1, 1);\n\n\n\tprivate _targetWindowId: number = -1;\n\tprivate _scrollTop: number = 0;\n\tprivate _scrollLeft: number = 0;\n\n\tprivate readonly _focusTracker: FocusTracker;\n\n\tconstructor(\n\t\townerID: string,\n\t\tcontext: ViewContext,\n\t\toverflowGuardContainer: FastDomNode<HTMLElement>,\n\t\tprivate readonly _viewController: ViewController,\n\t\tprivate readonly _visibleRangeProvider: IVisibleRangeProvider,\n\t\t@IInstantiationService instantiationService: IInstantiationService,\n\t\t@ILogService private readonly logService: ILogService\n\t) {\n\t\tsuper(context);\n\n\t\tthis.domNode = new FastDomNode(document.createElement('div'));\n\t\tthis.domNode.setClassName(`native-edit-context`);\n\t\tthis._imeTextArea = new FastDomNode(document.createElement('textarea'));\n\t\tthis._imeTextArea.setClassName(`ime-text-area`);\n\t\tthis._imeTextArea.setAttribute('readonly', 'true');\n\t\tthis._imeTextArea.setAttribute('tabindex', '-1');\n\t\tthis._imeTextArea.setAttribute('aria-hidden', 'true');\n\t\tthis.domNode.setAttribute('autocorrect', 'off');\n\t\tthis.domNode.setAttribute('autocapitalize', 'off');\n\t\tthis.domNode.setAttribute('autocomplete', 'off');\n\t\tthis.domNode.setAttribute('spellcheck', 'false');\n\n\t\tthis._updateDomAttributes();\n\n\t\toverflowGuardContainer.appendChild(this.domNode);\n\t\toverflowGuardContainer.appendChild(this._imeTextArea);\n\t\tthis._parent = overflowGuardContainer.domNode;\n\n\t\tthis._focusTracker = this._register(new FocusTracker(logService, this.domNode.domNode, (newFocusValue: boolean) => {\n\t\t\tlogService.trace('NativeEditContext#handleFocusChange : ', newFocusValue);\n\t\t\tthis._screenReaderSupport.handleFocusChange(newFocusValue);\n\t\t\tthis._context.viewModel.setHasFocus(newFocusValue);\n\t\t}));\n\n\t\tconst window = getWindow(this.domNode.domNode);\n\t\tthis._editContext = EditContext.create(window);\n\t\tthis.setEditContextOnDomNode();\n\n\t\tthis._screenReaderSupport = this._register(instantiationService.createInstance(ScreenReaderSupport, this.domNode, context, this._viewController));\n\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'copy', (e) => {\n\t\t\tthis.logService.trace('NativeEditContext#copy');\n\t\t\tthis._ensureClipboardGetsEditorSelection(e);\n\t\t}));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'cut', (e) => {\n\t\t\tthis.logService.trace('NativeEditContext#cut');\n\t\t\t// Pretend here we touched the text area, as the `cut` event will most likely\n\t\t\t// result in a `selectionchange` event which we want to ignore\n\t\t\tthis._screenReaderSupport.onWillCut();\n\t\t\tthis._ensureClipboardGetsEditorSelection(e);\n\t\t\tthis.logService.trace('NativeEditContext#cut (before viewController.cut)');\n\t\t\tthis._viewController.cut();\n\t\t}));\n\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'keyup', (e) => this._onKeyUp(e)));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'keydown', async (e) => this._onKeyDown(e)));\n\t\tthis._register(addDisposableListener(this._imeTextArea.domNode, 'keyup', (e) => this._onKeyUp(e)));\n\t\tthis._register(addDisposableListener(this._imeTextArea.domNode, 'keydown', async (e) => this._onKeyDown(e)));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'beforeinput', async (e) => {\n\t\t\tif (e.inputType === 'insertParagraph' || e.inputType === 'insertLineBreak') {\n\t\t\t\tthis._onType(this._viewController, { text: '\\n', replacePrevCharCnt: 0, replaceNextCharCnt: 0, positionDelta: 0 });\n\t\t\t}\n\t\t}));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'paste', (e) => {\n\t\t\tthis.logService.trace('NativeEditContext#paste');\n\t\t\te.preventDefault();\n\t\t\tif (!e.clipboardData) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet [text, metadata] = ClipboardEventUtils.getTextData(e.clipboardData);\n\t\t\tthis.logService.trace('NativeEditContext#paste with id : ', metadata?.id, ' with text.length: ', text.length);\n\t\t\tif (!text) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmetadata = metadata || InMemoryClipboardMetadataManager.INSTANCE.get(text);\n\t\t\tlet pasteOnNewLine = false;\n\t\t\tlet multicursorText: string[] | null = null;\n\t\t\tlet mode: string | null = null;\n\t\t\tif (metadata) {\n\t\t\t\tconst options = this._context.configuration.options;\n\t\t\t\tconst emptySelectionClipboard = options.get(EditorOption.emptySelectionClipboard);\n\t\t\t\tpasteOnNewLine = emptySelectionClipboard && !!metadata.isFromEmptySelection;\n\t\t\t\tmulticursorText = typeof metadata.multicursorText !== 'undefined' ? metadata.multicursorText : null;\n\t\t\t\tmode = metadata.mode;\n\t\t\t}\n\t\t\tthis.logService.trace('NativeEditContext#paste (before viewController.paste)');\n\t\t\tthis._viewController.paste(text, pasteOnNewLine, multicursorText, mode);\n\t\t}));\n\n\t\t// Edit context events\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'textformatupdate', (e) => this._handleTextFormatUpdate(e)));\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'characterboundsupdate', (e) => this._updateCharacterBounds(e)));\n\t\tlet highSurrogateCharacter: string | undefined;\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'textupdate', (e) => {\n\t\t\tconst text = e.text;\n\t\t\tif (text.length === 1) {\n\t\t\t\tconst charCode = text.charCodeAt(0);\n\t\t\t\tif (isHighSurrogate(charCode)) {\n\t\t\t\t\thighSurrogateCharacter = text;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (isLowSurrogate(charCode) && highSurrogateCharacter) {\n\t\t\t\t\tconst textUpdateEvent: ITextUpdateEvent = {\n\t\t\t\t\t\ttext: highSurrogateCharacter + text,\n\t\t\t\t\t\tselectionEnd: e.selectionEnd,\n\t\t\t\t\t\tselectionStart: e.selectionStart,\n\t\t\t\t\t\tupdateRangeStart: e.updateRangeStart - 1,\n\t\t\t\t\t\tupdateRangeEnd: e.updateRangeEnd - 1\n\t\t\t\t\t};\n\t\t\t\t\thighSurrogateCharacter = undefined;\n\t\t\t\t\tthis._emitTypeEvent(this._viewController, textUpdateEvent);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._emitTypeEvent(this._viewController, e);\n\t\t}));\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'compositionstart', (e) => {\n\t\t\tthis._updateEditContext();\n\t\t\t// Utlimately fires onDidCompositionStart() on the editor to notify for example suggest model of composition state\n\t\t\t// Updates the composition state of the cursor controller which determines behavior of typing with interceptors\n\t\t\tthis._viewController.compositionStart();\n\t\t\t// Emits ViewCompositionStartEvent which can be depended on by ViewEventHandlers\n\t\t\tthis._context.viewModel.onCompositionStart();\n\t\t}));\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'compositionend', (e) => {\n\t\t\tthis._updateEditContext();\n\t\t\t// Utlimately fires compositionEnd() on the editor to notify for example suggest model of composition state\n\t\t\t// Updates the composition state of the cursor controller which determines behavior of typing with interceptors\n\t\t\tthis._viewController.compositionEnd();\n\t\t\t// Emits ViewCompositionEndEvent which can be depended on by ViewEventHandlers\n\t\t\tthis._context.viewModel.onCompositionEnd();\n\t\t}));\n\t\tlet reenableTracking: boolean = false;\n\t\tthis._register(IME.onDidChange(() => {\n\t\t\tif (IME.enabled && reenableTracking) {\n\t\t\t\tthis._focusTracker.resume();\n\t\t\t\tthis.domNode.focus();\n\t\t\t\treenableTracking = false;\n\t\t\t}\n\t\t\tif (!IME.enabled && this.isFocused()) {\n\t\t\t\tthis._focusTracker.pause();\n\t\t\t\tthis._imeTextArea.focus();\n\t\t\t\treenableTracking = true;\n\t\t\t}\n\t\t}));\n\t\tthis._register(NativeEditContextRegistry.register(ownerID, this));\n\t}\n\n\t// --- Public methods ---\n\n\tpublic override dispose(): void {\n\t\t// Force blue the dom node so can write in pane with no native edit context after disposal\n\t\tthis.domNode.domNode.editContext = undefined;\n\t\tthis.domNode.domNode.blur();\n\t\tthis.domNode.domNode.remove();\n\t\tthis._imeTextArea.domNode.remove();\n\t\tsuper.dispose();\n\t}\n\n\tpublic setAriaOptions(options: IEditorAriaOptions): void {\n\t\tthis._screenReaderSupport.setAriaOptions(options);\n\t}\n\n\t/* Last rendered data needed for correct hit-testing and determining the mouse position.\n\t * Without this, the selection will blink as incorrect mouse position is calculated */\n\tpublic getLastRenderData(): Position | null {\n\t\treturn this._primarySelection.getPosition();\n\t}\n\n\tpublic prepareRender(ctx: RenderingContext): void {\n\t\tthis._screenReaderSupport.prepareRender(ctx);\n\t\tthis._updateSelectionAndControlBounds(ctx);\n\t}\n\n\tpublic render(ctx: RestrictedRenderingContext): void {\n\t\tthis._screenReaderSupport.render(ctx);\n\t}\n\n\tpublic override onCursorStateChanged(e: ViewCursorStateChangedEvent): boolean {\n\t\tthis._primarySelection = e.modelSelections[0] ?? new Selection(1, 1, 1, 1);\n\t\tthis._screenReaderSupport.onCursorStateChanged(e);\n\t\tthis._updateEditContext();\n\t\treturn true;\n\t}\n\n\tpublic override onConfigurationChanged(e: ViewConfigurationChangedEvent): boolean {\n\t\tthis._screenReaderSupport.onConfigurationChanged(e);\n\t\tthis._updateDomAttributes();\n\t\treturn true;\n\t}\n\n\tpublic override onDecorationsChanged(e: ViewDecorationsChangedEvent): boolean {\n\t\t// true for inline decorations that can end up relayouting text\n\t\treturn true;\n\t}\n\n\tpublic override onFlushed(e: ViewFlushedEvent): boolean {\n\t\treturn true;\n\t}\n\n\tpublic override onLinesChanged(e: ViewLinesChangedEvent): boolean {\n\t\tthis._updateEditContextOnLineChange(e.fromLineNumber, e.fromLineNumber + e.count - 1);\n\t\treturn true;\n\t}\n\n\tpublic override onLinesDeleted(e: ViewLinesDeletedEvent): boolean {\n\t\tthis._updateEditContextOnLineChange(e.fromLineNumber, e.toLineNumber);\n\t\treturn true;\n\t}\n\n\tpublic override onLinesInserted(e: ViewLinesInsertedEvent): boolean {\n\t\tthis._updateEditContextOnLineChange(e.fromLineNumber, e.toLineNumber);\n\t\treturn true;\n\t}\n\n\tprivate _updateEditContextOnLineChange(fromLineNumber: number, toLineNumber: number): void {\n\t\tif (this._editContextPrimarySelection.endLineNumber < fromLineNumber || this._editContextPrimarySelection.startLineNumber > toLineNumber) {\n\t\t\treturn;\n\t\t}\n\t\tthis._updateEditContext();\n\t}\n\n\tpublic override onScrollChanged(e: ViewScrollChangedEvent): boolean {\n\t\tthis._scrollLeft = e.scrollLeft;\n\t\tthis._scrollTop = e.scrollTop;\n\t\treturn true;\n\t}\n\n\tpublic override onZonesChanged(e: ViewZonesChangedEvent): boolean {\n\t\treturn true;\n\t}\n\n\tpublic onWillPaste(): void {\n\t\tthis.logService.trace('NativeEditContext#onWillPaste');\n\t\tthis._onWillPaste();\n\t}\n\n\tprivate _onWillPaste(): void {\n\t\tthis._screenReaderSupport.onWillPaste();\n\t}\n\n\tpublic onWillCopy(): void {\n\t\tthis.logService.trace('NativeEditContext#onWillCopy');\n\t\tthis.logService.trace('NativeEditContext#isFocused : ', this.domNode.domNode === getActiveElement());\n\t}\n\n\tpublic writeScreenReaderContent(): void {\n\t\tthis._screenReaderSupport.writeScreenReaderContent();\n\t}\n\n\tpublic isFocused(): boolean {\n\t\treturn this._focusTracker.isFocused;\n\t}\n\n\tpublic focus(): void {\n\t\tthis._focusTracker.focus();\n\n\t\t// If the editor is off DOM, focus cannot be really set, so let's double check that we have managed to set the focus\n\t\tthis.refreshFocusState();\n\t}\n\n\tpublic refreshFocusState(): void {\n\t\tthis._focusTracker.refreshFocusState();\n\t}\n\n\t// TODO: added as a workaround fix for https://github.com/microsoft/vscode/issues/229825\n\t// When this issue will be fixed the following should be removed.\n\tpublic setEditContextOnDomNode(): void {\n\t\tconst targetWindow = getWindow(this.domNode.domNode);\n\t\tconst targetWindowId = getWindowId(targetWindow);\n\t\tif (this._targetWindowId !== targetWindowId) {\n\t\t\tthis.domNode.domNode.editContext = this._editContext;\n\t\t\tthis._targetWindowId = targetWindowId;\n\t\t}\n\t}\n\n\t// --- Private methods ---\n\n\tprivate _onKeyUp(e: KeyboardEvent) {\n\t\tthis._viewController.emitKeyUp(new StandardKeyboardEvent(e));\n\t}\n\n\tprivate _onKeyDown(e: KeyboardEvent) {\n\t\tconst standardKeyboardEvent = new StandardKeyboardEvent(e);\n\t\t// When the IME is visible, the keys, like arrow-left and arrow-right, should be used to navigate in the IME, and should not be propagated further\n\t\tif (standardKeyboardEvent.keyCode === KeyCode.KEY_IN_COMPOSITION) {\n\t\t\tstandardKeyboardEvent.stopPropagation();\n\t\t}\n\t\tthis._viewController.emitKeyDown(standardKeyboardEvent);\n\t}\n\n\tprivate _updateDomAttributes(): void {\n\t\tconst options = this._context.configuration.options;\n\t\tthis.domNode.domNode.setAttribute('tabindex', String(options.get(EditorOption.tabIndex)));\n\t}\n\n\tprivate _updateEditContext(): void {\n\t\tconst editContextState = this._getNewEditContextState();\n\t\tif (!editContextState) {\n\t\t\treturn;\n\t\t}\n\t\tthis._editContext.updateText(0, Number.MAX_SAFE_INTEGER, editContextState.text ?? ' ');\n\t\tthis._editContext.updateSelection(editContextState.selectionStartOffset, editContextState.selectionEndOffset);\n\t\tthis._editContextPrimarySelection = editContextState.editContextPrimarySelection;\n\t\tthis._previousEditContextSelection = new OffsetRange(editContextState.selectionStartOffset, editContextState.selectionEndOffset);\n\t}\n\n\tprivate _emitTypeEvent(viewController: ViewController, e: ITextUpdateEvent): void {\n\t\tif (!this._editContext) {\n\t\t\treturn;\n\t\t}\n\t\tconst selectionEndOffset = this._previousEditContextSelection.endExclusive;\n\t\tconst selectionStartOffset = this._previousEditContextSelection.start;\n\t\tthis._previousEditContextSelection = new OffsetRange(e.selectionStart, e.selectionEnd);\n\n\t\tlet replaceNextCharCnt = 0;\n\t\tlet replacePrevCharCnt = 0;\n\t\tif (e.updateRangeEnd > selectionEndOffset) {\n\t\t\treplaceNextCharCnt = e.updateRangeEnd - selectionEndOffset;\n\t\t}\n\t\tif (e.updateRangeStart < selectionStartOffset) {\n\t\t\treplacePrevCharCnt = selectionStartOffset - e.updateRangeStart;\n\t\t}\n\t\tlet text = '';\n\t\tif (selectionStartOffset < e.updateRangeStart) {\n\t\t\ttext += this._editContext.text.substring(selectionStartOffset, e.updateRangeStart);\n\t\t}\n\t\ttext += e.text;\n\t\tif (selectionEndOffset > e.updateRangeEnd) {\n\t\t\ttext += this._editContext.text.substring(e.updateRangeEnd, selectionEndOffset);\n\t\t}\n\t\tlet positionDelta = 0;\n\t\tif (e.selectionStart === e.selectionEnd && selectionStartOffset === selectionEndOffset) {\n\t\t\tpositionDelta = e.selectionStart - (e.updateRangeStart + e.text.length);\n\t\t}\n\t\tconst typeInput: ITypeData = {\n\t\t\ttext,\n\t\t\treplacePrevCharCnt,\n\t\t\treplaceNextCharCnt,\n\t\t\tpositionDelta\n\t\t};\n\t\tthis._onType(viewController, typeInput);\n\t}\n\n\tprivate _onType(viewController: ViewController, typeInput: ITypeData): void {\n\t\tif (typeInput.replacePrevCharCnt || typeInput.replaceNextCharCnt || typeInput.positionDelta) {\n\t\t\tviewController.compositionType(typeInput.text, typeInput.replacePrevCharCnt, typeInput.replaceNextCharCnt, typeInput.positionDelta);\n\t\t} else {\n\t\t\tviewController.type(typeInput.text);\n\t\t}\n\t}\n\n\tprivate _getNewEditContextState(): { text: string; selectionStartOffset: number; selectionEndOffset: number; editContextPrimarySelection: Selection } | undefined {\n\t\tconst editContextPrimarySelection = this._primarySelection;\n\t\tconst model = this._context.viewModel.model;\n\t\tif (!model.isValidRange(editContextPrimarySelection)) {\n\t\t\treturn;\n\t\t}\n\t\tconst primarySelectionStartLine = editContextPrimarySelection.startLineNumber;\n\t\tconst primarySelectionEndLine = editContextPrimarySelection.endLineNumber;\n\t\tconst endColumnOfEndLineNumber = model.getLineMaxColumn(primarySelectionEndLine);\n\t\tconst rangeOfText = new Range(primarySelectionStartLine, 1, primarySelectionEndLine, endColumnOfEndLineNumber);\n\t\tconst text = model.getValueInRange(rangeOfText, EndOfLinePreference.TextDefined);\n\t\tconst selectionStartOffset = editContextPrimarySelection.startColumn - 1;\n\t\tconst selectionEndOffset = text.length + editContextPrimarySelection.endColumn - endColumnOfEndLineNumber;\n\t\treturn {\n\t\t\ttext,\n\t\t\tselectionStartOffset,\n\t\t\tselectionEndOffset,\n\t\t\teditContextPrimarySelection\n\t\t};\n\t}\n\n\tprivate _editContextStartPosition(): Position {\n\t\treturn new Position(this._editContextPrimarySelection.startLineNumber, 1);\n\t}\n\n\tprivate _handleTextFormatUpdate(e: TextFormatUpdateEvent): void {\n\t\tif (!this._editContext) {\n\t\t\treturn;\n\t\t}\n\t\tconst formats = e.getTextFormats();\n\t\tconst editContextStartPosition = this._editContextStartPosition();\n\t\tconst decorations: IModelDeltaDecoration[] = [];\n\t\tformats.forEach(f => {\n\t\t\tconst textModel = this._context.viewModel.model;\n\t\t\tconst offsetOfEditContextText = textModel.getOffsetAt(editContextStartPosition);\n\t\t\tconst startPositionOfDecoration = textModel.getPositionAt(offsetOfEditContextText + f.rangeStart);\n\t\t\tconst endPositionOfDecoration = textModel.getPositionAt(offsetOfEditContextText + f.rangeEnd);\n\t\t\tconst decorationRange = Range.fromPositions(startPositionOfDecoration, endPositionOfDecoration);\n\t\t\tconst thickness = f.underlineThickness.toLowerCase();\n\t\t\tlet decorationClassName: string = CompositionClassName.NONE;\n\t\t\tswitch (thickness) {\n\t\t\t\tcase 'thin':\n\t\t\t\t\tdecorationClassName = CompositionClassName.SECONDARY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'thick':\n\t\t\t\t\tdecorationClassName = CompositionClassName.PRIMARY;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdecorations.push({\n\t\t\t\trange: decorationRange,\n\t\t\t\toptions: {\n\t\t\t\t\tdescription: 'textFormatDecoration',\n\t\t\t\t\tinlineClassName: decorationClassName,\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tthis._decorations = this._context.viewModel.model.deltaDecorations(this._decorations, decorations);\n\t}\n\n\tprivate _updateSelectionAndControlBounds(ctx: RenderingContext) {\n\t\tif (!this._parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst options = this._context.configuration.options;\n\t\tconst contentLeft = options.get(EditorOption.layoutInfo).contentLeft;\n\t\tconst parentBounds = this._parent.getBoundingClientRect();\n\t\tconst viewSelection = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(this._primarySelection);\n\t\tconst verticalOffsetStart = this._context.viewLayout.getVerticalOffsetForLineNumber(viewSelection.startLineNumber);\n\n\t\tconst top = parentBounds.top + verticalOffsetStart - this._scrollTop;\n\t\tconst verticalOffsetEnd = this._context.viewLayout.getVerticalOffsetAfterLineNumber(viewSelection.endLineNumber);\n\t\tconst height = verticalOffsetEnd - verticalOffsetStart;\n\t\tlet left = parentBounds.left + contentLeft - this._scrollLeft;\n\t\tlet width: number;\n\n\t\tif (this._primarySelection.isEmpty()) {\n\t\t\tconst linesVisibleRanges = ctx.visibleRangeForPosition(viewSelection.getStartPosition());\n\t\t\tif (linesVisibleRanges) {\n\t\t\t\tleft += linesVisibleRanges.left;\n\t\t\t}\n\t\t\twidth = 0;\n\t\t} else {\n\t\t\twidth = parentBounds.width - contentLeft;\n\t\t}\n\n\t\tconst selectionBounds = new DOMRect(left, top, width, height);\n\t\tthis._editContext.updateSelectionBounds(selectionBounds);\n\t\tthis._editContext.updateControlBounds(selectionBounds);\n\t}\n\n\tprivate _updateCharacterBounds(e: CharacterBoundsUpdateEvent): void {\n\t\tif (!this._parent) {\n\t\t\treturn;\n\t\t}\n\t\tconst options = this._context.configuration.options;\n\t\tconst typicalHalfWidthCharacterWidth = options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth;\n\t\tconst contentLeft = options.get(EditorOption.layoutInfo).contentLeft;\n\t\tconst parentBounds = this._parent.getBoundingClientRect();\n\n\t\tconst characterBounds: DOMRect[] = [];\n\t\tconst offsetTransformer = new PositionOffsetTransformer(this._editContext.text);\n\t\tfor (let offset = e.rangeStart; offset < e.rangeEnd; offset++) {\n\t\t\tconst editContextStartPosition = offsetTransformer.getPosition(offset);\n\t\t\tconst textStartLineOffsetWithinEditor = this._editContextPrimarySelection.startLineNumber - 1;\n\t\t\tconst characterStartPosition = new Position(textStartLineOffsetWithinEditor + editContextStartPosition.lineNumber, editContextStartPosition.column);\n\t\t\tconst characterEndPosition = characterStartPosition.delta(0, 1);\n\t\t\tconst characterModelRange = Range.fromPositions(characterStartPosition, characterEndPosition);\n\t\t\tconst characterViewRange = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(characterModelRange);\n\t\t\tconst characterLinesVisibleRanges = this._visibleRangeProvider.linesVisibleRangesForRange(characterViewRange, true) ?? [];\n\t\t\tconst lineNumber = characterViewRange.startLineNumber;\n\t\t\tconst characterVerticalOffset = this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber);\n\t\t\tconst top = parentBounds.top + characterVerticalOffset - this._scrollTop;\n\n\t\t\tlet left = 0;\n\t\t\tlet width = typicalHalfWidthCharacterWidth;\n\t\t\tif (characterLinesVisibleRanges.length > 0) {\n\t\t\t\tfor (const visibleRange of characterLinesVisibleRanges[0].ranges) {\n\t\t\t\t\tleft = visibleRange.left;\n\t\t\t\t\twidth = visibleRange.width;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst lineHeight = this._context.viewLayout.getLineHeightForLineNumber(lineNumber);\n\t\t\tcharacterBounds.push(new DOMRect(parentBounds.left + contentLeft + left - this._scrollLeft, top, width, lineHeight));\n\t\t}\n\t\tthis._editContext.updateCharacterBounds(e.rangeStart, characterBounds);\n\t}\n\n\tprivate _ensureClipboardGetsEditorSelection(e: ClipboardEvent): void {\n\t\tconst options = this._context.configuration.options;\n\t\tconst emptySelectionClipboard = options.get(EditorOption.emptySelectionClipboard);\n\t\tconst copyWithSyntaxHighlighting = options.get(EditorOption.copyWithSyntaxHighlighting);\n\t\tconst selections = this._context.viewModel.getCursorStates().map(cursorState => cursorState.modelState.selection);\n\t\tconst dataToCopy = getDataToCopy(this._context.viewModel, selections, emptySelectionClipboard, copyWithSyntaxHighlighting);\n\t\tlet id = undefined;\n\t\tif (this.logService.getLevel() === LogLevel.Trace) {\n\t\t\tid = generateUuid();\n\t\t}\n\t\tconst storedMetadata: ClipboardStoredMetadata = {\n\t\t\tversion: 1,\n\t\t\tid,\n\t\t\tisFromEmptySelection: dataToCopy.isFromEmptySelection,\n\t\t\tmulticursorText: dataToCopy.multicursorText,\n\t\t\tmode: dataToCopy.mode\n\t\t};\n\t\tInMemoryClipboardMetadataManager.INSTANCE.set(\n\t\t\t// When writing \"LINE\\r\\n\" to the clipboard and then pasting,\n\t\t\t// Firefox pastes \"LINE\\n\", so let's work around this quirk\n\t\t\t(isFirefox ? dataToCopy.text.replace(/\\r\\n/g, '\\n') : dataToCopy.text),\n\t\t\tstoredMetadata\n\t\t);\n\t\te.preventDefault();\n\t\tif (e.clipboardData) {\n\t\t\tClipboardEventUtils.setTextData(e.clipboardData, dataToCopy.text, dataToCopy.html, storedMetadata);\n\t\t}\n\t\tthis.logService.trace('NativeEditContext#_ensureClipboardGetsEditorSelectios with id : ', id, ' with text.length: ', dataToCopy.text.length);\n\t}\n}\n"]}
1
+ {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/browser/controller/editContext/native/nativeEditContext.ts","vs/editor/browser/controller/editContext/native/nativeEditContext.ts"],"names":[],"mappings":"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","file":"nativeEditContext.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport './nativeEditContext.css';\nimport { isFirefox } from '../../../../../base/browser/browser.js';\nimport { addDisposableListener, getActiveElement, getWindow, getWindowId } from '../../../../../base/browser/dom.js';\nimport { FastDomNode } from '../../../../../base/browser/fastDomNode.js';\nimport { StandardKeyboardEvent } from '../../../../../base/browser/keyboardEvent.js';\nimport { KeyCode } from '../../../../../base/common/keyCodes.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { EditorOption } from '../../../../common/config/editorOptions.js';\nimport { EndOfLinePreference, IModelDeltaDecoration } from '../../../../common/model.js';\nimport { ViewConfigurationChangedEvent, ViewCursorStateChangedEvent, ViewDecorationsChangedEvent, ViewFlushedEvent, ViewLinesChangedEvent, ViewLinesDeletedEvent, ViewLinesInsertedEvent, ViewScrollChangedEvent, ViewZonesChangedEvent } from '../../../../common/viewEvents.js';\nimport { ViewContext } from '../../../../common/viewModel/viewContext.js';\nimport { RestrictedRenderingContext, RenderingContext, HorizontalPosition } from '../../../view/renderingContext.js';\nimport { ViewController } from '../../../view/viewController.js';\nimport { ClipboardEventUtils, ClipboardStoredMetadata, getDataToCopy, InMemoryClipboardMetadataManager } from '../clipboardUtils.js';\nimport { AbstractEditContext } from '../editContext.js';\nimport { editContextAddDisposableListener, FocusTracker, ITypeData } from './nativeEditContextUtils.js';\nimport { ScreenReaderSupport } from './screenReaderSupport.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { Selection } from '../../../../common/core/selection.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { IVisibleRangeProvider } from '../textArea/textAreaEditContext.js';\nimport { PositionOffsetTransformer } from '../../../../common/core/text/positionToOffset.js';\nimport { EditContext } from './editContextFactory.js';\nimport { NativeEditContextRegistry } from './nativeEditContextRegistry.js';\nimport { IEditorAriaOptions } from '../../../editorBrowser.js';\nimport { isHighSurrogate, isLowSurrogate } from '../../../../../base/common/strings.js';\nimport { IME } from '../../../../../base/common/ime.js';\nimport { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';\nimport { ILogService, LogLevel } from '../../../../../platform/log/common/log.js';\nimport { generateUuid } from '../../../../../base/common/uuid.js';\n\n// Corresponds to classes in nativeEditContext.css\nenum CompositionClassName {\n\tNONE = 'edit-context-composition-none',\n\tSECONDARY = 'edit-context-composition-secondary',\n\tPRIMARY = 'edit-context-composition-primary',\n}\n\ninterface ITextUpdateEvent {\n\ttext: string;\n\tselectionStart: number;\n\tselectionEnd: number;\n\tupdateRangeStart: number;\n\tupdateRangeEnd: number;\n}\n\nexport class NativeEditContext extends AbstractEditContext {\n\n\t// Text area used to handle paste events\n\tpublic readonly domNode: FastDomNode<HTMLDivElement>;\n\tprivate readonly _imeTextArea: FastDomNode<HTMLTextAreaElement>;\n\tprivate readonly _editContext: EditContext;\n\tprivate readonly _screenReaderSupport: ScreenReaderSupport;\n\tprivate _previousEditContextSelection: OffsetRange = new OffsetRange(0, 0);\n\tprivate _editContextPrimarySelection: Selection = new Selection(1, 1, 1, 1);\n\n\t// Overflow guard container\n\tprivate readonly _parent: HTMLElement;\n\tprivate _decorations: string[] = [];\n\tprivate _primarySelection: Selection = new Selection(1, 1, 1, 1);\n\n\n\tprivate _targetWindowId: number = -1;\n\tprivate _scrollTop: number = 0;\n\tprivate _scrollLeft: number = 0;\n\n\tprivate readonly _focusTracker: FocusTracker;\n\n\tconstructor(\n\t\townerID: string,\n\t\tcontext: ViewContext,\n\t\toverflowGuardContainer: FastDomNode<HTMLElement>,\n\t\tprivate readonly _viewController: ViewController,\n\t\tprivate readonly _visibleRangeProvider: IVisibleRangeProvider,\n\t\t@IInstantiationService instantiationService: IInstantiationService,\n\t\t@ILogService private readonly logService: ILogService\n\t) {\n\t\tsuper(context);\n\n\t\tthis.domNode = new FastDomNode(document.createElement('div'));\n\t\tthis.domNode.setClassName(`native-edit-context`);\n\t\tthis._imeTextArea = new FastDomNode(document.createElement('textarea'));\n\t\tthis._imeTextArea.setClassName(`ime-text-area`);\n\t\tthis._imeTextArea.setAttribute('readonly', 'true');\n\t\tthis._imeTextArea.setAttribute('tabindex', '-1');\n\t\tthis._imeTextArea.setAttribute('aria-hidden', 'true');\n\t\tthis.domNode.setAttribute('autocorrect', 'off');\n\t\tthis.domNode.setAttribute('autocapitalize', 'off');\n\t\tthis.domNode.setAttribute('autocomplete', 'off');\n\t\tthis.domNode.setAttribute('spellcheck', 'false');\n\n\t\tthis._updateDomAttributes();\n\n\t\toverflowGuardContainer.appendChild(this.domNode);\n\t\toverflowGuardContainer.appendChild(this._imeTextArea);\n\t\tthis._parent = overflowGuardContainer.domNode;\n\n\t\tthis._focusTracker = this._register(new FocusTracker(logService, this.domNode.domNode, (newFocusValue: boolean) => {\n\t\t\tlogService.trace('NativeEditContext#handleFocusChange : ', newFocusValue);\n\t\t\tthis._screenReaderSupport.handleFocusChange(newFocusValue);\n\t\t\tthis._context.viewModel.setHasFocus(newFocusValue);\n\t\t}));\n\n\t\tconst window = getWindow(this.domNode.domNode);\n\t\tthis._editContext = EditContext.create(window);\n\t\tthis.setEditContextOnDomNode();\n\n\t\tthis._screenReaderSupport = this._register(instantiationService.createInstance(ScreenReaderSupport, this.domNode, context, this._viewController));\n\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'copy', (e) => {\n\t\t\tthis.logService.trace('NativeEditContext#copy');\n\t\t\tthis._ensureClipboardGetsEditorSelection(e);\n\t\t}));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'cut', (e) => {\n\t\t\tthis.logService.trace('NativeEditContext#cut');\n\t\t\t// Pretend here we touched the text area, as the `cut` event will most likely\n\t\t\t// result in a `selectionchange` event which we want to ignore\n\t\t\tthis._screenReaderSupport.onWillCut();\n\t\t\tthis._ensureClipboardGetsEditorSelection(e);\n\t\t\tthis.logService.trace('NativeEditContext#cut (before viewController.cut)');\n\t\t\tthis._viewController.cut();\n\t\t}));\n\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'keyup', (e) => this._onKeyUp(e)));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'keydown', async (e) => this._onKeyDown(e)));\n\t\tthis._register(addDisposableListener(this._imeTextArea.domNode, 'keyup', (e) => this._onKeyUp(e)));\n\t\tthis._register(addDisposableListener(this._imeTextArea.domNode, 'keydown', async (e) => this._onKeyDown(e)));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'beforeinput', async (e) => {\n\t\t\tif (e.inputType === 'insertParagraph' || e.inputType === 'insertLineBreak') {\n\t\t\t\tthis._onType(this._viewController, { text: '\\n', replacePrevCharCnt: 0, replaceNextCharCnt: 0, positionDelta: 0 });\n\t\t\t}\n\t\t}));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'paste', (e) => {\n\t\t\tthis.logService.trace('NativeEditContext#paste');\n\t\t\te.preventDefault();\n\t\t\tif (!e.clipboardData) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet [text, metadata] = ClipboardEventUtils.getTextData(e.clipboardData);\n\t\t\tthis.logService.trace('NativeEditContext#paste with id : ', metadata?.id, ' with text.length: ', text.length);\n\t\t\tif (!text) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmetadata = metadata || InMemoryClipboardMetadataManager.INSTANCE.get(text);\n\t\t\tlet pasteOnNewLine = false;\n\t\t\tlet multicursorText: string[] | null = null;\n\t\t\tlet mode: string | null = null;\n\t\t\tif (metadata) {\n\t\t\t\tconst options = this._context.configuration.options;\n\t\t\t\tconst emptySelectionClipboard = options.get(EditorOption.emptySelectionClipboard);\n\t\t\t\tpasteOnNewLine = emptySelectionClipboard && !!metadata.isFromEmptySelection;\n\t\t\t\tmulticursorText = typeof metadata.multicursorText !== 'undefined' ? metadata.multicursorText : null;\n\t\t\t\tmode = metadata.mode;\n\t\t\t}\n\t\t\tthis.logService.trace('NativeEditContext#paste (before viewController.paste)');\n\t\t\tthis._viewController.paste(text, pasteOnNewLine, multicursorText, mode);\n\t\t}));\n\n\t\t// Edit context events\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'textformatupdate', (e) => this._handleTextFormatUpdate(e)));\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'characterboundsupdate', (e) => this._updateCharacterBounds(e)));\n\t\tlet highSurrogateCharacter: string | undefined;\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'textupdate', (e) => {\n\t\t\tconst text = e.text;\n\t\t\tif (text.length === 1) {\n\t\t\t\tconst charCode = text.charCodeAt(0);\n\t\t\t\tif (isHighSurrogate(charCode)) {\n\t\t\t\t\thighSurrogateCharacter = text;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (isLowSurrogate(charCode) && highSurrogateCharacter) {\n\t\t\t\t\tconst textUpdateEvent: ITextUpdateEvent = {\n\t\t\t\t\t\ttext: highSurrogateCharacter + text,\n\t\t\t\t\t\tselectionEnd: e.selectionEnd,\n\t\t\t\t\t\tselectionStart: e.selectionStart,\n\t\t\t\t\t\tupdateRangeStart: e.updateRangeStart - 1,\n\t\t\t\t\t\tupdateRangeEnd: e.updateRangeEnd - 1\n\t\t\t\t\t};\n\t\t\t\t\thighSurrogateCharacter = undefined;\n\t\t\t\t\tthis._emitTypeEvent(this._viewController, textUpdateEvent);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._emitTypeEvent(this._viewController, e);\n\t\t}));\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'compositionstart', (e) => {\n\t\t\tthis._updateEditContext();\n\t\t\t// Utlimately fires onDidCompositionStart() on the editor to notify for example suggest model of composition state\n\t\t\t// Updates the composition state of the cursor controller which determines behavior of typing with interceptors\n\t\t\tthis._viewController.compositionStart();\n\t\t\t// Emits ViewCompositionStartEvent which can be depended on by ViewEventHandlers\n\t\t\tthis._context.viewModel.onCompositionStart();\n\t\t}));\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'compositionend', (e) => {\n\t\t\tthis._updateEditContext();\n\t\t\t// Utlimately fires compositionEnd() on the editor to notify for example suggest model of composition state\n\t\t\t// Updates the composition state of the cursor controller which determines behavior of typing with interceptors\n\t\t\tthis._viewController.compositionEnd();\n\t\t\t// Emits ViewCompositionEndEvent which can be depended on by ViewEventHandlers\n\t\t\tthis._context.viewModel.onCompositionEnd();\n\t\t}));\n\t\tlet reenableTracking: boolean = false;\n\t\tthis._register(IME.onDidChange(() => {\n\t\t\tif (IME.enabled && reenableTracking) {\n\t\t\t\tthis._focusTracker.resume();\n\t\t\t\tthis.domNode.focus();\n\t\t\t\treenableTracking = false;\n\t\t\t}\n\t\t\tif (!IME.enabled && this.isFocused()) {\n\t\t\t\tthis._focusTracker.pause();\n\t\t\t\tthis._imeTextArea.focus();\n\t\t\t\treenableTracking = true;\n\t\t\t}\n\t\t}));\n\t\tthis._register(NativeEditContextRegistry.register(ownerID, this));\n\t}\n\n\t// --- Public methods ---\n\n\tpublic override dispose(): void {\n\t\t// Force blue the dom node so can write in pane with no native edit context after disposal\n\t\tthis.domNode.domNode.editContext = undefined;\n\t\tthis.domNode.domNode.blur();\n\t\tthis.domNode.domNode.remove();\n\t\tthis._imeTextArea.domNode.remove();\n\t\tsuper.dispose();\n\t}\n\n\tpublic setAriaOptions(options: IEditorAriaOptions): void {\n\t\tthis._screenReaderSupport.setAriaOptions(options);\n\t}\n\n\t/* Last rendered data needed for correct hit-testing and determining the mouse position.\n\t * Without this, the selection will blink as incorrect mouse position is calculated */\n\tpublic getLastRenderData(): Position | null {\n\t\treturn this._primarySelection.getPosition();\n\t}\n\n\tpublic override prepareRender(ctx: RenderingContext): void {\n\t\tthis._screenReaderSupport.prepareRender(ctx);\n\t\tthis._updateSelectionAndControlBoundsData(ctx);\n\t}\n\n\tpublic override onDidRender(): void {\n\t\tthis._updateSelectionAndControlBoundsAfterRender();\n\t}\n\n\tpublic render(ctx: RestrictedRenderingContext): void {\n\t\tthis._screenReaderSupport.render(ctx);\n\t}\n\n\tpublic override onCursorStateChanged(e: ViewCursorStateChangedEvent): boolean {\n\t\tthis._primarySelection = e.modelSelections[0] ?? new Selection(1, 1, 1, 1);\n\t\tthis._screenReaderSupport.onCursorStateChanged(e);\n\t\tthis._updateEditContext();\n\t\treturn true;\n\t}\n\n\tpublic override onConfigurationChanged(e: ViewConfigurationChangedEvent): boolean {\n\t\tthis._screenReaderSupport.onConfigurationChanged(e);\n\t\tthis._updateDomAttributes();\n\t\treturn true;\n\t}\n\n\tpublic override onDecorationsChanged(e: ViewDecorationsChangedEvent): boolean {\n\t\t// true for inline decorations that can end up relayouting text\n\t\treturn true;\n\t}\n\n\tpublic override onFlushed(e: ViewFlushedEvent): boolean {\n\t\treturn true;\n\t}\n\n\tpublic override onLinesChanged(e: ViewLinesChangedEvent): boolean {\n\t\tthis._updateEditContextOnLineChange(e.fromLineNumber, e.fromLineNumber + e.count - 1);\n\t\treturn true;\n\t}\n\n\tpublic override onLinesDeleted(e: ViewLinesDeletedEvent): boolean {\n\t\tthis._updateEditContextOnLineChange(e.fromLineNumber, e.toLineNumber);\n\t\treturn true;\n\t}\n\n\tpublic override onLinesInserted(e: ViewLinesInsertedEvent): boolean {\n\t\tthis._updateEditContextOnLineChange(e.fromLineNumber, e.toLineNumber);\n\t\treturn true;\n\t}\n\n\tprivate _updateEditContextOnLineChange(fromLineNumber: number, toLineNumber: number): void {\n\t\tif (this._editContextPrimarySelection.endLineNumber < fromLineNumber || this._editContextPrimarySelection.startLineNumber > toLineNumber) {\n\t\t\treturn;\n\t\t}\n\t\tthis._updateEditContext();\n\t}\n\n\tpublic override onScrollChanged(e: ViewScrollChangedEvent): boolean {\n\t\tthis._scrollLeft = e.scrollLeft;\n\t\tthis._scrollTop = e.scrollTop;\n\t\treturn true;\n\t}\n\n\tpublic override onZonesChanged(e: ViewZonesChangedEvent): boolean {\n\t\treturn true;\n\t}\n\n\tpublic onWillPaste(): void {\n\t\tthis.logService.trace('NativeEditContext#onWillPaste');\n\t\tthis._onWillPaste();\n\t}\n\n\tprivate _onWillPaste(): void {\n\t\tthis._screenReaderSupport.onWillPaste();\n\t}\n\n\tpublic onWillCopy(): void {\n\t\tthis.logService.trace('NativeEditContext#onWillCopy');\n\t\tthis.logService.trace('NativeEditContext#isFocused : ', this.domNode.domNode === getActiveElement());\n\t}\n\n\tpublic writeScreenReaderContent(): void {\n\t\tthis._screenReaderSupport.writeScreenReaderContent();\n\t}\n\n\tpublic isFocused(): boolean {\n\t\treturn this._focusTracker.isFocused;\n\t}\n\n\tpublic focus(): void {\n\t\tthis._focusTracker.focus();\n\n\t\t// If the editor is off DOM, focus cannot be really set, so let's double check that we have managed to set the focus\n\t\tthis.refreshFocusState();\n\t}\n\n\tpublic refreshFocusState(): void {\n\t\tthis._focusTracker.refreshFocusState();\n\t}\n\n\t// TODO: added as a workaround fix for https://github.com/microsoft/vscode/issues/229825\n\t// When this issue will be fixed the following should be removed.\n\tpublic setEditContextOnDomNode(): void {\n\t\tconst targetWindow = getWindow(this.domNode.domNode);\n\t\tconst targetWindowId = getWindowId(targetWindow);\n\t\tif (this._targetWindowId !== targetWindowId) {\n\t\t\tthis.domNode.domNode.editContext = this._editContext;\n\t\t\tthis._targetWindowId = targetWindowId;\n\t\t}\n\t}\n\n\t// --- Private methods ---\n\n\tprivate _onKeyUp(e: KeyboardEvent) {\n\t\tthis._viewController.emitKeyUp(new StandardKeyboardEvent(e));\n\t}\n\n\tprivate _onKeyDown(e: KeyboardEvent) {\n\t\tconst standardKeyboardEvent = new StandardKeyboardEvent(e);\n\t\t// When the IME is visible, the keys, like arrow-left and arrow-right, should be used to navigate in the IME, and should not be propagated further\n\t\tif (standardKeyboardEvent.keyCode === KeyCode.KEY_IN_COMPOSITION) {\n\t\t\tstandardKeyboardEvent.stopPropagation();\n\t\t}\n\t\tthis._viewController.emitKeyDown(standardKeyboardEvent);\n\t}\n\n\tprivate _updateDomAttributes(): void {\n\t\tconst options = this._context.configuration.options;\n\t\tthis.domNode.domNode.setAttribute('tabindex', String(options.get(EditorOption.tabIndex)));\n\t}\n\n\tprivate _updateEditContext(): void {\n\t\tconst editContextState = this._getNewEditContextState();\n\t\tif (!editContextState) {\n\t\t\treturn;\n\t\t}\n\t\tthis._editContext.updateText(0, Number.MAX_SAFE_INTEGER, editContextState.text ?? ' ');\n\t\tthis._editContext.updateSelection(editContextState.selectionStartOffset, editContextState.selectionEndOffset);\n\t\tthis._editContextPrimarySelection = editContextState.editContextPrimarySelection;\n\t\tthis._previousEditContextSelection = new OffsetRange(editContextState.selectionStartOffset, editContextState.selectionEndOffset);\n\t}\n\n\tprivate _emitTypeEvent(viewController: ViewController, e: ITextUpdateEvent): void {\n\t\tif (!this._editContext) {\n\t\t\treturn;\n\t\t}\n\t\tconst selectionEndOffset = this._previousEditContextSelection.endExclusive;\n\t\tconst selectionStartOffset = this._previousEditContextSelection.start;\n\t\tthis._previousEditContextSelection = new OffsetRange(e.selectionStart, e.selectionEnd);\n\n\t\tlet replaceNextCharCnt = 0;\n\t\tlet replacePrevCharCnt = 0;\n\t\tif (e.updateRangeEnd > selectionEndOffset) {\n\t\t\treplaceNextCharCnt = e.updateRangeEnd - selectionEndOffset;\n\t\t}\n\t\tif (e.updateRangeStart < selectionStartOffset) {\n\t\t\treplacePrevCharCnt = selectionStartOffset - e.updateRangeStart;\n\t\t}\n\t\tlet text = '';\n\t\tif (selectionStartOffset < e.updateRangeStart) {\n\t\t\ttext += this._editContext.text.substring(selectionStartOffset, e.updateRangeStart);\n\t\t}\n\t\ttext += e.text;\n\t\tif (selectionEndOffset > e.updateRangeEnd) {\n\t\t\ttext += this._editContext.text.substring(e.updateRangeEnd, selectionEndOffset);\n\t\t}\n\t\tlet positionDelta = 0;\n\t\tif (e.selectionStart === e.selectionEnd && selectionStartOffset === selectionEndOffset) {\n\t\t\tpositionDelta = e.selectionStart - (e.updateRangeStart + e.text.length);\n\t\t}\n\t\tconst typeInput: ITypeData = {\n\t\t\ttext,\n\t\t\treplacePrevCharCnt,\n\t\t\treplaceNextCharCnt,\n\t\t\tpositionDelta\n\t\t};\n\t\tthis._onType(viewController, typeInput);\n\t}\n\n\tprivate _onType(viewController: ViewController, typeInput: ITypeData): void {\n\t\tif (typeInput.replacePrevCharCnt || typeInput.replaceNextCharCnt || typeInput.positionDelta) {\n\t\t\tviewController.compositionType(typeInput.text, typeInput.replacePrevCharCnt, typeInput.replaceNextCharCnt, typeInput.positionDelta);\n\t\t} else {\n\t\t\tviewController.type(typeInput.text);\n\t\t}\n\t}\n\n\tprivate _getNewEditContextState(): { text: string; selectionStartOffset: number; selectionEndOffset: number; editContextPrimarySelection: Selection } | undefined {\n\t\tconst editContextPrimarySelection = this._primarySelection;\n\t\tconst model = this._context.viewModel.model;\n\t\tif (!model.isValidRange(editContextPrimarySelection)) {\n\t\t\treturn;\n\t\t}\n\t\tconst primarySelectionStartLine = editContextPrimarySelection.startLineNumber;\n\t\tconst primarySelectionEndLine = editContextPrimarySelection.endLineNumber;\n\t\tconst endColumnOfEndLineNumber = model.getLineMaxColumn(primarySelectionEndLine);\n\t\tconst rangeOfText = new Range(primarySelectionStartLine, 1, primarySelectionEndLine, endColumnOfEndLineNumber);\n\t\tconst text = model.getValueInRange(rangeOfText, EndOfLinePreference.TextDefined);\n\t\tconst selectionStartOffset = editContextPrimarySelection.startColumn - 1;\n\t\tconst selectionEndOffset = text.length + editContextPrimarySelection.endColumn - endColumnOfEndLineNumber;\n\t\treturn {\n\t\t\ttext,\n\t\t\tselectionStartOffset,\n\t\t\tselectionEndOffset,\n\t\t\teditContextPrimarySelection\n\t\t};\n\t}\n\n\tprivate _editContextStartPosition(): Position {\n\t\treturn new Position(this._editContextPrimarySelection.startLineNumber, 1);\n\t}\n\n\tprivate _handleTextFormatUpdate(e: TextFormatUpdateEvent): void {\n\t\tif (!this._editContext) {\n\t\t\treturn;\n\t\t}\n\t\tconst formats = e.getTextFormats();\n\t\tconst editContextStartPosition = this._editContextStartPosition();\n\t\tconst decorations: IModelDeltaDecoration[] = [];\n\t\tformats.forEach(f => {\n\t\t\tconst textModel = this._context.viewModel.model;\n\t\t\tconst offsetOfEditContextText = textModel.getOffsetAt(editContextStartPosition);\n\t\t\tconst startPositionOfDecoration = textModel.getPositionAt(offsetOfEditContextText + f.rangeStart);\n\t\t\tconst endPositionOfDecoration = textModel.getPositionAt(offsetOfEditContextText + f.rangeEnd);\n\t\t\tconst decorationRange = Range.fromPositions(startPositionOfDecoration, endPositionOfDecoration);\n\t\t\tconst thickness = f.underlineThickness.toLowerCase();\n\t\t\tlet decorationClassName: string = CompositionClassName.NONE;\n\t\t\tswitch (thickness) {\n\t\t\t\tcase 'thin':\n\t\t\t\t\tdecorationClassName = CompositionClassName.SECONDARY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'thick':\n\t\t\t\t\tdecorationClassName = CompositionClassName.PRIMARY;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdecorations.push({\n\t\t\t\trange: decorationRange,\n\t\t\t\toptions: {\n\t\t\t\t\tdescription: 'textFormatDecoration',\n\t\t\t\t\tinlineClassName: decorationClassName,\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tthis._decorations = this._context.viewModel.model.deltaDecorations(this._decorations, decorations);\n\t}\n\n\tprivate _linesVisibleRanges: HorizontalPosition | null = null;\n\tprivate _updateSelectionAndControlBoundsData(ctx: RenderingContext): void {\n\t\tconst viewSelection = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(this._primarySelection);\n\t\tif (this._primarySelection.isEmpty()) {\n\t\t\tconst linesVisibleRanges = ctx.visibleRangeForPosition(viewSelection.getStartPosition());\n\t\t\tthis._linesVisibleRanges = linesVisibleRanges;\n\t\t} else {\n\t\t\tthis._linesVisibleRanges = null;\n\t\t}\n\t}\n\n\tprivate _updateSelectionAndControlBoundsAfterRender() {\n\t\tconst options = this._context.configuration.options;\n\t\tconst contentLeft = options.get(EditorOption.layoutInfo).contentLeft;\n\n\t\tconst viewSelection = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(this._primarySelection);\n\t\tconst verticalOffsetStart = this._context.viewLayout.getVerticalOffsetForLineNumber(viewSelection.startLineNumber);\n\t\tconst verticalOffsetEnd = this._context.viewLayout.getVerticalOffsetAfterLineNumber(viewSelection.endLineNumber);\n\n\t\t// Make sure this doesn't force an extra layout (i.e. don't call it before rendering finished)\n\t\tconst parentBounds = this._parent.getBoundingClientRect();\n\t\tconst top = parentBounds.top + verticalOffsetStart - this._scrollTop;\n\t\tconst height = verticalOffsetEnd - verticalOffsetStart;\n\t\tlet left = parentBounds.left + contentLeft - this._scrollLeft;\n\t\tlet width: number;\n\n\t\tif (this._primarySelection.isEmpty()) {\n\t\t\tif (this._linesVisibleRanges) {\n\t\t\t\tleft += this._linesVisibleRanges.left;\n\t\t\t}\n\t\t\twidth = 0;\n\t\t} else {\n\t\t\twidth = parentBounds.width - contentLeft;\n\t\t}\n\n\t\tconst selectionBounds = new DOMRect(left, top, width, height);\n\t\tthis._editContext.updateSelectionBounds(selectionBounds);\n\t\tthis._editContext.updateControlBounds(selectionBounds);\n\t}\n\n\tprivate _updateCharacterBounds(e: CharacterBoundsUpdateEvent): void {\n\t\tconst options = this._context.configuration.options;\n\t\tconst typicalHalfWidthCharacterWidth = options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth;\n\t\tconst contentLeft = options.get(EditorOption.layoutInfo).contentLeft;\n\t\tconst parentBounds = this._parent.getBoundingClientRect();\n\n\t\tconst characterBounds: DOMRect[] = [];\n\t\tconst offsetTransformer = new PositionOffsetTransformer(this._editContext.text);\n\t\tfor (let offset = e.rangeStart; offset < e.rangeEnd; offset++) {\n\t\t\tconst editContextStartPosition = offsetTransformer.getPosition(offset);\n\t\t\tconst textStartLineOffsetWithinEditor = this._editContextPrimarySelection.startLineNumber - 1;\n\t\t\tconst characterStartPosition = new Position(textStartLineOffsetWithinEditor + editContextStartPosition.lineNumber, editContextStartPosition.column);\n\t\t\tconst characterEndPosition = characterStartPosition.delta(0, 1);\n\t\t\tconst characterModelRange = Range.fromPositions(characterStartPosition, characterEndPosition);\n\t\t\tconst characterViewRange = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(characterModelRange);\n\t\t\tconst characterLinesVisibleRanges = this._visibleRangeProvider.linesVisibleRangesForRange(characterViewRange, true) ?? [];\n\t\t\tconst lineNumber = characterViewRange.startLineNumber;\n\t\t\tconst characterVerticalOffset = this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber);\n\t\t\tconst top = parentBounds.top + characterVerticalOffset - this._scrollTop;\n\n\t\t\tlet left = 0;\n\t\t\tlet width = typicalHalfWidthCharacterWidth;\n\t\t\tif (characterLinesVisibleRanges.length > 0) {\n\t\t\t\tfor (const visibleRange of characterLinesVisibleRanges[0].ranges) {\n\t\t\t\t\tleft = visibleRange.left;\n\t\t\t\t\twidth = visibleRange.width;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst lineHeight = this._context.viewLayout.getLineHeightForLineNumber(lineNumber);\n\t\t\tcharacterBounds.push(new DOMRect(parentBounds.left + contentLeft + left - this._scrollLeft, top, width, lineHeight));\n\t\t}\n\t\tthis._editContext.updateCharacterBounds(e.rangeStart, characterBounds);\n\t}\n\n\tprivate _ensureClipboardGetsEditorSelection(e: ClipboardEvent): void {\n\t\tconst options = this._context.configuration.options;\n\t\tconst emptySelectionClipboard = options.get(EditorOption.emptySelectionClipboard);\n\t\tconst copyWithSyntaxHighlighting = options.get(EditorOption.copyWithSyntaxHighlighting);\n\t\tconst selections = this._context.viewModel.getCursorStates().map(cursorState => cursorState.modelState.selection);\n\t\tconst dataToCopy = getDataToCopy(this._context.viewModel, selections, emptySelectionClipboard, copyWithSyntaxHighlighting);\n\t\tlet id = undefined;\n\t\tif (this.logService.getLevel() === LogLevel.Trace) {\n\t\t\tid = generateUuid();\n\t\t}\n\t\tconst storedMetadata: ClipboardStoredMetadata = {\n\t\t\tversion: 1,\n\t\t\tid,\n\t\t\tisFromEmptySelection: dataToCopy.isFromEmptySelection,\n\t\t\tmulticursorText: dataToCopy.multicursorText,\n\t\t\tmode: dataToCopy.mode\n\t\t};\n\t\tInMemoryClipboardMetadataManager.INSTANCE.set(\n\t\t\t// When writing \"LINE\\r\\n\" to the clipboard and then pasting,\n\t\t\t// Firefox pastes \"LINE\\n\", so let's work around this quirk\n\t\t\t(isFirefox ? dataToCopy.text.replace(/\\r\\n/g, '\\n') : dataToCopy.text),\n\t\t\tstoredMetadata\n\t\t);\n\t\te.preventDefault();\n\t\tif (e.clipboardData) {\n\t\t\tClipboardEventUtils.setTextData(e.clipboardData, dataToCopy.text, dataToCopy.html, storedMetadata);\n\t\t}\n\t\tthis.logService.trace('NativeEditContext#_ensureClipboardGetsEditorSelectios with id : ', id, ' with text.length: ', dataToCopy.text.length);\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport './nativeEditContext.css';\nimport { isFirefox } from '../../../../../base/browser/browser.js';\nimport { addDisposableListener, getActiveElement, getWindow, getWindowId } from '../../../../../base/browser/dom.js';\nimport { FastDomNode } from '../../../../../base/browser/fastDomNode.js';\nimport { StandardKeyboardEvent } from '../../../../../base/browser/keyboardEvent.js';\nimport { KeyCode } from '../../../../../base/common/keyCodes.js';\nimport { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { EditorOption } from '../../../../common/config/editorOptions.js';\nimport { EndOfLinePreference, IModelDeltaDecoration } from '../../../../common/model.js';\nimport { ViewConfigurationChangedEvent, ViewCursorStateChangedEvent, ViewDecorationsChangedEvent, ViewFlushedEvent, ViewLinesChangedEvent, ViewLinesDeletedEvent, ViewLinesInsertedEvent, ViewScrollChangedEvent, ViewZonesChangedEvent } from '../../../../common/viewEvents.js';\nimport { ViewContext } from '../../../../common/viewModel/viewContext.js';\nimport { RestrictedRenderingContext, RenderingContext, HorizontalPosition } from '../../../view/renderingContext.js';\nimport { ViewController } from '../../../view/viewController.js';\nimport { ClipboardEventUtils, ClipboardStoredMetadata, getDataToCopy, InMemoryClipboardMetadataManager } from '../clipboardUtils.js';\nimport { AbstractEditContext } from '../editContext.js';\nimport { editContextAddDisposableListener, FocusTracker, ITypeData } from './nativeEditContextUtils.js';\nimport { ScreenReaderSupport } from './screenReaderSupport.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { Selection } from '../../../../common/core/selection.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { IVisibleRangeProvider } from '../textArea/textAreaEditContext.js';\nimport { PositionOffsetTransformer } from '../../../../common/core/text/positionToOffset.js';\nimport { EditContext } from './editContextFactory.js';\nimport { NativeEditContextRegistry } from './nativeEditContextRegistry.js';\nimport { IEditorAriaOptions } from '../../../editorBrowser.js';\nimport { isHighSurrogate, isLowSurrogate } from '../../../../../base/common/strings.js';\nimport { IME } from '../../../../../base/common/ime.js';\nimport { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';\nimport { ILogService, LogLevel } from '../../../../../platform/log/common/log.js';\nimport { generateUuid } from '../../../../../base/common/uuid.js';\n\n// Corresponds to classes in nativeEditContext.css\nenum CompositionClassName {\n\tNONE = 'edit-context-composition-none',\n\tSECONDARY = 'edit-context-composition-secondary',\n\tPRIMARY = 'edit-context-composition-primary',\n}\n\ninterface ITextUpdateEvent {\n\ttext: string;\n\tselectionStart: number;\n\tselectionEnd: number;\n\tupdateRangeStart: number;\n\tupdateRangeEnd: number;\n}\n\nexport class NativeEditContext extends AbstractEditContext {\n\n\t// Text area used to handle paste events\n\tpublic readonly domNode: FastDomNode<HTMLDivElement>;\n\tprivate readonly _imeTextArea: FastDomNode<HTMLTextAreaElement>;\n\tprivate readonly _editContext: EditContext;\n\tprivate readonly _screenReaderSupport: ScreenReaderSupport;\n\tprivate _previousEditContextSelection: OffsetRange = new OffsetRange(0, 0);\n\tprivate _editContextPrimarySelection: Selection = new Selection(1, 1, 1, 1);\n\n\t// Overflow guard container\n\tprivate readonly _parent: HTMLElement;\n\tprivate _decorations: string[] = [];\n\tprivate _primarySelection: Selection = new Selection(1, 1, 1, 1);\n\n\n\tprivate _targetWindowId: number = -1;\n\tprivate _scrollTop: number = 0;\n\tprivate _scrollLeft: number = 0;\n\n\tprivate readonly _focusTracker: FocusTracker;\n\n\tconstructor(\n\t\townerID: string,\n\t\tcontext: ViewContext,\n\t\toverflowGuardContainer: FastDomNode<HTMLElement>,\n\t\tprivate readonly _viewController: ViewController,\n\t\tprivate readonly _visibleRangeProvider: IVisibleRangeProvider,\n\t\t@IInstantiationService instantiationService: IInstantiationService,\n\t\t@ILogService private readonly logService: ILogService\n\t) {\n\t\tsuper(context);\n\n\t\tthis.domNode = new FastDomNode(document.createElement('div'));\n\t\tthis.domNode.setClassName(`native-edit-context`);\n\t\tthis._imeTextArea = new FastDomNode(document.createElement('textarea'));\n\t\tthis._imeTextArea.setClassName(`ime-text-area`);\n\t\tthis._imeTextArea.setAttribute('readonly', 'true');\n\t\tthis._imeTextArea.setAttribute('tabindex', '-1');\n\t\tthis._imeTextArea.setAttribute('aria-hidden', 'true');\n\t\tthis.domNode.setAttribute('autocorrect', 'off');\n\t\tthis.domNode.setAttribute('autocapitalize', 'off');\n\t\tthis.domNode.setAttribute('autocomplete', 'off');\n\t\tthis.domNode.setAttribute('spellcheck', 'false');\n\n\t\tthis._updateDomAttributes();\n\n\t\toverflowGuardContainer.appendChild(this.domNode);\n\t\toverflowGuardContainer.appendChild(this._imeTextArea);\n\t\tthis._parent = overflowGuardContainer.domNode;\n\n\t\tthis._focusTracker = this._register(new FocusTracker(logService, this.domNode.domNode, (newFocusValue: boolean) => {\n\t\t\tlogService.trace('NativeEditContext#handleFocusChange : ', newFocusValue);\n\t\t\tthis._screenReaderSupport.handleFocusChange(newFocusValue);\n\t\t\tthis._context.viewModel.setHasFocus(newFocusValue);\n\t\t}));\n\n\t\tconst window = getWindow(this.domNode.domNode);\n\t\tthis._editContext = EditContext.create(window);\n\t\tthis.setEditContextOnDomNode();\n\n\t\tthis._screenReaderSupport = this._register(instantiationService.createInstance(ScreenReaderSupport, this.domNode, context, this._viewController));\n\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'copy', (e) => {\n\t\t\tthis.logService.trace('NativeEditContext#copy');\n\t\t\tthis._ensureClipboardGetsEditorSelection(e);\n\t\t}));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'cut', (e) => {\n\t\t\tthis.logService.trace('NativeEditContext#cut');\n\t\t\t// Pretend here we touched the text area, as the `cut` event will most likely\n\t\t\t// result in a `selectionchange` event which we want to ignore\n\t\t\tthis._screenReaderSupport.onWillCut();\n\t\t\tthis._ensureClipboardGetsEditorSelection(e);\n\t\t\tthis.logService.trace('NativeEditContext#cut (before viewController.cut)');\n\t\t\tthis._viewController.cut();\n\t\t}));\n\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'keyup', (e) => this._onKeyUp(e)));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'keydown', async (e) => this._onKeyDown(e)));\n\t\tthis._register(addDisposableListener(this._imeTextArea.domNode, 'keyup', (e) => this._onKeyUp(e)));\n\t\tthis._register(addDisposableListener(this._imeTextArea.domNode, 'keydown', async (e) => this._onKeyDown(e)));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'beforeinput', async (e) => {\n\t\t\tif (e.inputType === 'insertParagraph' || e.inputType === 'insertLineBreak') {\n\t\t\t\tthis._onType(this._viewController, { text: '\\n', replacePrevCharCnt: 0, replaceNextCharCnt: 0, positionDelta: 0 });\n\t\t\t}\n\t\t}));\n\t\tthis._register(addDisposableListener(this.domNode.domNode, 'paste', (e) => {\n\t\t\tthis.logService.trace('NativeEditContext#paste');\n\t\t\te.preventDefault();\n\t\t\tif (!e.clipboardData) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet [text, metadata] = ClipboardEventUtils.getTextData(e.clipboardData);\n\t\t\tthis.logService.trace('NativeEditContext#paste with id : ', metadata?.id, ' with text.length: ', text.length);\n\t\t\tif (!text) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmetadata = metadata || InMemoryClipboardMetadataManager.INSTANCE.get(text);\n\t\t\tlet pasteOnNewLine = false;\n\t\t\tlet multicursorText: string[] | null = null;\n\t\t\tlet mode: string | null = null;\n\t\t\tif (metadata) {\n\t\t\t\tconst options = this._context.configuration.options;\n\t\t\t\tconst emptySelectionClipboard = options.get(EditorOption.emptySelectionClipboard);\n\t\t\t\tpasteOnNewLine = emptySelectionClipboard && !!metadata.isFromEmptySelection;\n\t\t\t\tmulticursorText = typeof metadata.multicursorText !== 'undefined' ? metadata.multicursorText : null;\n\t\t\t\tmode = metadata.mode;\n\t\t\t}\n\t\t\tthis.logService.trace('NativeEditContext#paste (before viewController.paste)');\n\t\t\tthis._viewController.paste(text, pasteOnNewLine, multicursorText, mode);\n\t\t}));\n\n\t\t// Edit context events\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'textformatupdate', (e) => this._handleTextFormatUpdate(e)));\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'characterboundsupdate', (e) => this._updateCharacterBounds(e)));\n\t\tlet highSurrogateCharacter: string | undefined;\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'textupdate', (e) => {\n\t\t\tconst text = e.text;\n\t\t\tif (text.length === 1) {\n\t\t\t\tconst charCode = text.charCodeAt(0);\n\t\t\t\tif (isHighSurrogate(charCode)) {\n\t\t\t\t\thighSurrogateCharacter = text;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (isLowSurrogate(charCode) && highSurrogateCharacter) {\n\t\t\t\t\tconst textUpdateEvent: ITextUpdateEvent = {\n\t\t\t\t\t\ttext: highSurrogateCharacter + text,\n\t\t\t\t\t\tselectionEnd: e.selectionEnd,\n\t\t\t\t\t\tselectionStart: e.selectionStart,\n\t\t\t\t\t\tupdateRangeStart: e.updateRangeStart - 1,\n\t\t\t\t\t\tupdateRangeEnd: e.updateRangeEnd - 1\n\t\t\t\t\t};\n\t\t\t\t\thighSurrogateCharacter = undefined;\n\t\t\t\t\tthis._emitTypeEvent(this._viewController, textUpdateEvent);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._emitTypeEvent(this._viewController, e);\n\t\t}));\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'compositionstart', (e) => {\n\t\t\tthis._updateEditContext();\n\t\t\t// Utlimately fires onDidCompositionStart() on the editor to notify for example suggest model of composition state\n\t\t\t// Updates the composition state of the cursor controller which determines behavior of typing with interceptors\n\t\t\tthis._viewController.compositionStart();\n\t\t\t// Emits ViewCompositionStartEvent which can be depended on by ViewEventHandlers\n\t\t\tthis._context.viewModel.onCompositionStart();\n\t\t}));\n\t\tthis._register(editContextAddDisposableListener(this._editContext, 'compositionend', (e) => {\n\t\t\tthis._updateEditContext();\n\t\t\t// Utlimately fires compositionEnd() on the editor to notify for example suggest model of composition state\n\t\t\t// Updates the composition state of the cursor controller which determines behavior of typing with interceptors\n\t\t\tthis._viewController.compositionEnd();\n\t\t\t// Emits ViewCompositionEndEvent which can be depended on by ViewEventHandlers\n\t\t\tthis._context.viewModel.onCompositionEnd();\n\t\t}));\n\t\tlet reenableTracking: boolean = false;\n\t\tthis._register(IME.onDidChange(() => {\n\t\t\tif (IME.enabled && reenableTracking) {\n\t\t\t\tthis._focusTracker.resume();\n\t\t\t\tthis.domNode.focus();\n\t\t\t\treenableTracking = false;\n\t\t\t}\n\t\t\tif (!IME.enabled && this.isFocused()) {\n\t\t\t\tthis._focusTracker.pause();\n\t\t\t\tthis._imeTextArea.focus();\n\t\t\t\treenableTracking = true;\n\t\t\t}\n\t\t}));\n\t\tthis._register(NativeEditContextRegistry.register(ownerID, this));\n\t}\n\n\t// --- Public methods ---\n\n\tpublic override dispose(): void {\n\t\t// Force blue the dom node so can write in pane with no native edit context after disposal\n\t\tthis.domNode.domNode.editContext = undefined;\n\t\tthis.domNode.domNode.blur();\n\t\tthis.domNode.domNode.remove();\n\t\tthis._imeTextArea.domNode.remove();\n\t\tsuper.dispose();\n\t}\n\n\tpublic setAriaOptions(options: IEditorAriaOptions): void {\n\t\tthis._screenReaderSupport.setAriaOptions(options);\n\t}\n\n\t/* Last rendered data needed for correct hit-testing and determining the mouse position.\n\t * Without this, the selection will blink as incorrect mouse position is calculated */\n\tpublic getLastRenderData(): Position | null {\n\t\treturn this._primarySelection.getPosition();\n\t}\n\n\tpublic override prepareRender(ctx: RenderingContext): void {\n\t\tthis._screenReaderSupport.prepareRender(ctx);\n\t\tthis._updateSelectionAndControlBoundsData(ctx);\n\t}\n\n\tpublic override onDidRender(): void {\n\t\tthis._updateSelectionAndControlBoundsAfterRender();\n\t}\n\n\tpublic render(ctx: RestrictedRenderingContext): void {\n\t\tthis._screenReaderSupport.render(ctx);\n\t}\n\n\tpublic override onCursorStateChanged(e: ViewCursorStateChangedEvent): boolean {\n\t\tthis._primarySelection = e.modelSelections[0] ?? new Selection(1, 1, 1, 1);\n\t\tthis._screenReaderSupport.onCursorStateChanged(e);\n\t\tthis._updateEditContext();\n\t\treturn true;\n\t}\n\n\tpublic override onConfigurationChanged(e: ViewConfigurationChangedEvent): boolean {\n\t\tthis._screenReaderSupport.onConfigurationChanged(e);\n\t\tthis._updateDomAttributes();\n\t\treturn true;\n\t}\n\n\tpublic override onDecorationsChanged(e: ViewDecorationsChangedEvent): boolean {\n\t\t// true for inline decorations that can end up relayouting text\n\t\treturn true;\n\t}\n\n\tpublic override onFlushed(e: ViewFlushedEvent): boolean {\n\t\treturn true;\n\t}\n\n\tpublic override onLinesChanged(e: ViewLinesChangedEvent): boolean {\n\t\tthis._updateEditContextOnLineChange(e.fromLineNumber, e.fromLineNumber + e.count - 1);\n\t\treturn true;\n\t}\n\n\tpublic override onLinesDeleted(e: ViewLinesDeletedEvent): boolean {\n\t\tthis._updateEditContextOnLineChange(e.fromLineNumber, e.toLineNumber);\n\t\treturn true;\n\t}\n\n\tpublic override onLinesInserted(e: ViewLinesInsertedEvent): boolean {\n\t\tthis._updateEditContextOnLineChange(e.fromLineNumber, e.toLineNumber);\n\t\treturn true;\n\t}\n\n\tprivate _updateEditContextOnLineChange(fromLineNumber: number, toLineNumber: number): void {\n\t\tif (this._editContextPrimarySelection.endLineNumber < fromLineNumber || this._editContextPrimarySelection.startLineNumber > toLineNumber) {\n\t\t\treturn;\n\t\t}\n\t\tthis._updateEditContext();\n\t}\n\n\tpublic override onScrollChanged(e: ViewScrollChangedEvent): boolean {\n\t\tthis._scrollLeft = e.scrollLeft;\n\t\tthis._scrollTop = e.scrollTop;\n\t\treturn true;\n\t}\n\n\tpublic override onZonesChanged(e: ViewZonesChangedEvent): boolean {\n\t\treturn true;\n\t}\n\n\tpublic onWillPaste(): void {\n\t\tthis.logService.trace('NativeEditContext#onWillPaste');\n\t\tthis._onWillPaste();\n\t}\n\n\tprivate _onWillPaste(): void {\n\t\tthis._screenReaderSupport.onWillPaste();\n\t}\n\n\tpublic onWillCopy(): void {\n\t\tthis.logService.trace('NativeEditContext#onWillCopy');\n\t\tthis.logService.trace('NativeEditContext#isFocused : ', this.domNode.domNode === getActiveElement());\n\t}\n\n\tpublic writeScreenReaderContent(): void {\n\t\tthis._screenReaderSupport.writeScreenReaderContent();\n\t}\n\n\tpublic isFocused(): boolean {\n\t\treturn this._focusTracker.isFocused;\n\t}\n\n\tpublic focus(): void {\n\t\tthis._focusTracker.focus();\n\n\t\t// If the editor is off DOM, focus cannot be really set, so let's double check that we have managed to set the focus\n\t\tthis.refreshFocusState();\n\t}\n\n\tpublic refreshFocusState(): void {\n\t\tthis._focusTracker.refreshFocusState();\n\t}\n\n\t// TODO: added as a workaround fix for https://github.com/microsoft/vscode/issues/229825\n\t// When this issue will be fixed the following should be removed.\n\tpublic setEditContextOnDomNode(): void {\n\t\tconst targetWindow = getWindow(this.domNode.domNode);\n\t\tconst targetWindowId = getWindowId(targetWindow);\n\t\tif (this._targetWindowId !== targetWindowId) {\n\t\t\tthis.domNode.domNode.editContext = this._editContext;\n\t\t\tthis._targetWindowId = targetWindowId;\n\t\t}\n\t}\n\n\t// --- Private methods ---\n\n\tprivate _onKeyUp(e: KeyboardEvent) {\n\t\tthis._viewController.emitKeyUp(new StandardKeyboardEvent(e));\n\t}\n\n\tprivate _onKeyDown(e: KeyboardEvent) {\n\t\tconst standardKeyboardEvent = new StandardKeyboardEvent(e);\n\t\t// When the IME is visible, the keys, like arrow-left and arrow-right, should be used to navigate in the IME, and should not be propagated further\n\t\tif (standardKeyboardEvent.keyCode === KeyCode.KEY_IN_COMPOSITION) {\n\t\t\tstandardKeyboardEvent.stopPropagation();\n\t\t}\n\t\tthis._viewController.emitKeyDown(standardKeyboardEvent);\n\t}\n\n\tprivate _updateDomAttributes(): void {\n\t\tconst options = this._context.configuration.options;\n\t\tthis.domNode.domNode.setAttribute('tabindex', String(options.get(EditorOption.tabIndex)));\n\t}\n\n\tprivate _updateEditContext(): void {\n\t\tconst editContextState = this._getNewEditContextState();\n\t\tif (!editContextState) {\n\t\t\treturn;\n\t\t}\n\t\tthis._editContext.updateText(0, Number.MAX_SAFE_INTEGER, editContextState.text ?? ' ');\n\t\tthis._editContext.updateSelection(editContextState.selectionStartOffset, editContextState.selectionEndOffset);\n\t\tthis._editContextPrimarySelection = editContextState.editContextPrimarySelection;\n\t\tthis._previousEditContextSelection = new OffsetRange(editContextState.selectionStartOffset, editContextState.selectionEndOffset);\n\t}\n\n\tprivate _emitTypeEvent(viewController: ViewController, e: ITextUpdateEvent): void {\n\t\tif (!this._editContext) {\n\t\t\treturn;\n\t\t}\n\t\tconst selectionEndOffset = this._previousEditContextSelection.endExclusive;\n\t\tconst selectionStartOffset = this._previousEditContextSelection.start;\n\t\tthis._previousEditContextSelection = new OffsetRange(e.selectionStart, e.selectionEnd);\n\n\t\tlet replaceNextCharCnt = 0;\n\t\tlet replacePrevCharCnt = 0;\n\t\tif (e.updateRangeEnd > selectionEndOffset) {\n\t\t\treplaceNextCharCnt = e.updateRangeEnd - selectionEndOffset;\n\t\t}\n\t\tif (e.updateRangeStart < selectionStartOffset) {\n\t\t\treplacePrevCharCnt = selectionStartOffset - e.updateRangeStart;\n\t\t}\n\t\tlet text = '';\n\t\tif (selectionStartOffset < e.updateRangeStart) {\n\t\t\ttext += this._editContext.text.substring(selectionStartOffset, e.updateRangeStart);\n\t\t}\n\t\ttext += e.text;\n\t\tif (selectionEndOffset > e.updateRangeEnd) {\n\t\t\ttext += this._editContext.text.substring(e.updateRangeEnd, selectionEndOffset);\n\t\t}\n\t\tlet positionDelta = 0;\n\t\tif (e.selectionStart === e.selectionEnd && selectionStartOffset === selectionEndOffset) {\n\t\t\tpositionDelta = e.selectionStart - (e.updateRangeStart + e.text.length);\n\t\t}\n\t\tconst typeInput: ITypeData = {\n\t\t\ttext,\n\t\t\treplacePrevCharCnt,\n\t\t\treplaceNextCharCnt,\n\t\t\tpositionDelta\n\t\t};\n\t\tthis._onType(viewController, typeInput);\n\t}\n\n\tprivate _onType(viewController: ViewController, typeInput: ITypeData): void {\n\t\tif (typeInput.replacePrevCharCnt || typeInput.replaceNextCharCnt || typeInput.positionDelta) {\n\t\t\tviewController.compositionType(typeInput.text, typeInput.replacePrevCharCnt, typeInput.replaceNextCharCnt, typeInput.positionDelta);\n\t\t} else {\n\t\t\tviewController.type(typeInput.text);\n\t\t}\n\t}\n\n\tprivate _getNewEditContextState(): { text: string; selectionStartOffset: number; selectionEndOffset: number; editContextPrimarySelection: Selection } | undefined {\n\t\tconst editContextPrimarySelection = this._primarySelection;\n\t\tconst model = this._context.viewModel.model;\n\t\tif (!model.isValidRange(editContextPrimarySelection)) {\n\t\t\treturn;\n\t\t}\n\t\tconst primarySelectionStartLine = editContextPrimarySelection.startLineNumber;\n\t\tconst primarySelectionEndLine = editContextPrimarySelection.endLineNumber;\n\t\tconst endColumnOfEndLineNumber = model.getLineMaxColumn(primarySelectionEndLine);\n\t\tconst rangeOfText = new Range(primarySelectionStartLine, 1, primarySelectionEndLine, endColumnOfEndLineNumber);\n\t\tconst text = model.getValueInRange(rangeOfText, EndOfLinePreference.TextDefined);\n\t\tconst selectionStartOffset = editContextPrimarySelection.startColumn - 1;\n\t\tconst selectionEndOffset = text.length + editContextPrimarySelection.endColumn - endColumnOfEndLineNumber;\n\t\treturn {\n\t\t\ttext,\n\t\t\tselectionStartOffset,\n\t\t\tselectionEndOffset,\n\t\t\teditContextPrimarySelection\n\t\t};\n\t}\n\n\tprivate _editContextStartPosition(): Position {\n\t\treturn new Position(this._editContextPrimarySelection.startLineNumber, 1);\n\t}\n\n\tprivate _handleTextFormatUpdate(e: TextFormatUpdateEvent): void {\n\t\tif (!this._editContext) {\n\t\t\treturn;\n\t\t}\n\t\tconst formats = e.getTextFormats();\n\t\tconst editContextStartPosition = this._editContextStartPosition();\n\t\tconst decorations: IModelDeltaDecoration[] = [];\n\t\tformats.forEach(f => {\n\t\t\tconst textModel = this._context.viewModel.model;\n\t\t\tconst offsetOfEditContextText = textModel.getOffsetAt(editContextStartPosition);\n\t\t\tconst startPositionOfDecoration = textModel.getPositionAt(offsetOfEditContextText + f.rangeStart);\n\t\t\tconst endPositionOfDecoration = textModel.getPositionAt(offsetOfEditContextText + f.rangeEnd);\n\t\t\tconst decorationRange = Range.fromPositions(startPositionOfDecoration, endPositionOfDecoration);\n\t\t\tconst thickness = f.underlineThickness.toLowerCase();\n\t\t\tlet decorationClassName: string = CompositionClassName.NONE;\n\t\t\tswitch (thickness) {\n\t\t\t\tcase 'thin':\n\t\t\t\t\tdecorationClassName = CompositionClassName.SECONDARY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'thick':\n\t\t\t\t\tdecorationClassName = CompositionClassName.PRIMARY;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdecorations.push({\n\t\t\t\trange: decorationRange,\n\t\t\t\toptions: {\n\t\t\t\t\tdescription: 'textFormatDecoration',\n\t\t\t\t\tinlineClassName: decorationClassName,\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tthis._decorations = this._context.viewModel.model.deltaDecorations(this._decorations, decorations);\n\t}\n\n\tprivate _linesVisibleRanges: HorizontalPosition | null = null;\n\tprivate _updateSelectionAndControlBoundsData(ctx: RenderingContext): void {\n\t\tconst viewSelection = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(this._primarySelection);\n\t\tif (this._primarySelection.isEmpty()) {\n\t\t\tconst linesVisibleRanges = ctx.visibleRangeForPosition(viewSelection.getStartPosition());\n\t\t\tthis._linesVisibleRanges = linesVisibleRanges;\n\t\t} else {\n\t\t\tthis._linesVisibleRanges = null;\n\t\t}\n\t}\n\n\tprivate _updateSelectionAndControlBoundsAfterRender() {\n\t\tconst options = this._context.configuration.options;\n\t\tconst contentLeft = options.get(EditorOption.layoutInfo).contentLeft;\n\n\t\tconst viewSelection = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(this._primarySelection);\n\t\tconst verticalOffsetStart = this._context.viewLayout.getVerticalOffsetForLineNumber(viewSelection.startLineNumber);\n\t\tconst verticalOffsetEnd = this._context.viewLayout.getVerticalOffsetAfterLineNumber(viewSelection.endLineNumber);\n\n\t\t// Make sure this doesn't force an extra layout (i.e. don't call it before rendering finished)\n\t\tconst parentBounds = this._parent.getBoundingClientRect();\n\t\tconst top = parentBounds.top + verticalOffsetStart - this._scrollTop;\n\t\tconst height = verticalOffsetEnd - verticalOffsetStart;\n\t\tlet left = parentBounds.left + contentLeft - this._scrollLeft;\n\t\tlet width: number;\n\n\t\tif (this._primarySelection.isEmpty()) {\n\t\t\tif (this._linesVisibleRanges) {\n\t\t\t\tleft += this._linesVisibleRanges.left;\n\t\t\t}\n\t\t\twidth = 0;\n\t\t} else {\n\t\t\twidth = parentBounds.width - contentLeft;\n\t\t}\n\n\t\tconst selectionBounds = new DOMRect(left, top, width, height);\n\t\tthis._editContext.updateSelectionBounds(selectionBounds);\n\t\tthis._editContext.updateControlBounds(selectionBounds);\n\t}\n\n\tprivate _updateCharacterBounds(e: CharacterBoundsUpdateEvent): void {\n\t\tconst options = this._context.configuration.options;\n\t\tconst typicalHalfWidthCharacterWidth = options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth;\n\t\tconst contentLeft = options.get(EditorOption.layoutInfo).contentLeft;\n\t\tconst parentBounds = this._parent.getBoundingClientRect();\n\n\t\tconst characterBounds: DOMRect[] = [];\n\t\tconst offsetTransformer = new PositionOffsetTransformer(this._editContext.text);\n\t\tfor (let offset = e.rangeStart; offset < e.rangeEnd; offset++) {\n\t\t\tconst editContextStartPosition = offsetTransformer.getPosition(offset);\n\t\t\tconst textStartLineOffsetWithinEditor = this._editContextPrimarySelection.startLineNumber - 1;\n\t\t\tconst characterStartPosition = new Position(textStartLineOffsetWithinEditor + editContextStartPosition.lineNumber, editContextStartPosition.column);\n\t\t\tconst characterEndPosition = characterStartPosition.delta(0, 1);\n\t\t\tconst characterModelRange = Range.fromPositions(characterStartPosition, characterEndPosition);\n\t\t\tconst characterViewRange = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(characterModelRange);\n\t\t\tconst characterLinesVisibleRanges = this._visibleRangeProvider.linesVisibleRangesForRange(characterViewRange, true) ?? [];\n\t\t\tconst lineNumber = characterViewRange.startLineNumber;\n\t\t\tconst characterVerticalOffset = this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber);\n\t\t\tconst top = parentBounds.top + characterVerticalOffset - this._scrollTop;\n\n\t\t\tlet left = 0;\n\t\t\tlet width = typicalHalfWidthCharacterWidth;\n\t\t\tif (characterLinesVisibleRanges.length > 0) {\n\t\t\t\tfor (const visibleRange of characterLinesVisibleRanges[0].ranges) {\n\t\t\t\t\tleft = visibleRange.left;\n\t\t\t\t\twidth = visibleRange.width;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst lineHeight = this._context.viewLayout.getLineHeightForLineNumber(lineNumber);\n\t\t\tcharacterBounds.push(new DOMRect(parentBounds.left + contentLeft + left - this._scrollLeft, top, width, lineHeight));\n\t\t}\n\t\tthis._editContext.updateCharacterBounds(e.rangeStart, characterBounds);\n\t}\n\n\tprivate _ensureClipboardGetsEditorSelection(e: ClipboardEvent): void {\n\t\tconst options = this._context.configuration.options;\n\t\tconst emptySelectionClipboard = options.get(EditorOption.emptySelectionClipboard);\n\t\tconst copyWithSyntaxHighlighting = options.get(EditorOption.copyWithSyntaxHighlighting);\n\t\tconst selections = this._context.viewModel.getCursorStates().map(cursorState => cursorState.modelState.selection);\n\t\tconst dataToCopy = getDataToCopy(this._context.viewModel, selections, emptySelectionClipboard, copyWithSyntaxHighlighting);\n\t\tlet id = undefined;\n\t\tif (this.logService.getLevel() === LogLevel.Trace) {\n\t\t\tid = generateUuid();\n\t\t}\n\t\tconst storedMetadata: ClipboardStoredMetadata = {\n\t\t\tversion: 1,\n\t\t\tid,\n\t\t\tisFromEmptySelection: dataToCopy.isFromEmptySelection,\n\t\t\tmulticursorText: dataToCopy.multicursorText,\n\t\t\tmode: dataToCopy.mode\n\t\t};\n\t\tInMemoryClipboardMetadataManager.INSTANCE.set(\n\t\t\t// When writing \"LINE\\r\\n\" to the clipboard and then pasting,\n\t\t\t// Firefox pastes \"LINE\\n\", so let's work around this quirk\n\t\t\t(isFirefox ? dataToCopy.text.replace(/\\r\\n/g, '\\n') : dataToCopy.text),\n\t\t\tstoredMetadata\n\t\t);\n\t\te.preventDefault();\n\t\tif (e.clipboardData) {\n\t\t\tClipboardEventUtils.setTextData(e.clipboardData, dataToCopy.text, dataToCopy.html, storedMetadata);\n\t\t}\n\t\tthis.logService.trace('NativeEditContext#_ensureClipboardGetsEditorSelectios with id : ', id, ' with text.length: ', dataToCopy.text.length);\n\t}\n}\n"]}
@@ -90,7 +90,7 @@ let ScreenReaderSupport = class ScreenReaderSupport extends Disposable {
90
90
  this._domNode.domNode.setAttribute('aria-required', options.get(9 /* EditorOption.ariaRequired */) ? 'true' : 'false');
91
91
  this._domNode.domNode.setAttribute('aria-multiline', 'true');
92
92
  this._domNode.domNode.setAttribute('aria-autocomplete', options.get(104 /* EditorOption.readOnly */) ? 'none' : 'both');
93
- this._domNode.domNode.setAttribute('aria-roledescription', localize(55, "editor"));
93
+ this._domNode.domNode.setAttribute('aria-roledescription', localize(60, "editor"));
94
94
  this._domNode.domNode.setAttribute('aria-label', ariaLabelForScreenReaderContent(options, this._keybindingService));
95
95
  const tabSize = this._context.viewModel.model.getOptions().tabSize;
96
96
  const spaceWidth = options.get(59 /* EditorOption.fontInfo */).spaceWidth;
@@ -77,15 +77,15 @@ export function ariaLabelForScreenReaderContent(options, keybindingService) {
77
77
  const toggleKeybindingLabel = keybindingService.lookupKeybinding('editor.action.toggleScreenReaderAccessibilityMode')?.getAriaLabel();
78
78
  const runCommandKeybindingLabel = keybindingService.lookupKeybinding('workbench.action.showCommands')?.getAriaLabel();
79
79
  const keybindingEditorKeybindingLabel = keybindingService.lookupKeybinding('workbench.action.openGlobalKeybindings')?.getAriaLabel();
80
- const editorNotAccessibleMessage = nls.localize(56, "The editor is not accessible at this time.");
80
+ const editorNotAccessibleMessage = nls.localize(61, "The editor is not accessible at this time.");
81
81
  if (toggleKeybindingLabel) {
82
- return nls.localize(57, "{0} To enable screen reader optimized mode, use {1}", editorNotAccessibleMessage, toggleKeybindingLabel);
82
+ return nls.localize(62, "{0} To enable screen reader optimized mode, use {1}", editorNotAccessibleMessage, toggleKeybindingLabel);
83
83
  }
84
84
  else if (runCommandKeybindingLabel) {
85
- return nls.localize(58, "{0} To enable screen reader optimized mode, open the quick pick with {1} and run the command Toggle Screen Reader Accessibility Mode, which is currently not triggerable via keyboard.", editorNotAccessibleMessage, runCommandKeybindingLabel);
85
+ return nls.localize(63, "{0} To enable screen reader optimized mode, open the quick pick with {1} and run the command Toggle Screen Reader Accessibility Mode, which is currently not triggerable via keyboard.", editorNotAccessibleMessage, runCommandKeybindingLabel);
86
86
  }
87
87
  else if (keybindingEditorKeybindingLabel) {
88
- return nls.localize(59, "{0} Please assign a keybinding for the command Toggle Screen Reader Accessibility Mode by accessing the keybindings editor with {1} and run it.", editorNotAccessibleMessage, keybindingEditorKeybindingLabel);
88
+ return nls.localize(64, "{0} Please assign a keybinding for the command Toggle Screen Reader Accessibility Mode by accessing the keybindings editor with {1} and run it.", editorNotAccessibleMessage, keybindingEditorKeybindingLabel);
89
89
  }
90
90
  else {
91
91
  // SOS
@@ -131,7 +131,7 @@ let TextAreaEditContext = class TextAreaEditContext extends AbstractEditContext
131
131
  this.textArea.setAttribute('aria-required', options.get(9 /* EditorOption.ariaRequired */) ? 'true' : 'false');
132
132
  this.textArea.setAttribute('tabindex', String(options.get(140 /* EditorOption.tabIndex */)));
133
133
  this.textArea.setAttribute('role', 'textbox');
134
- this.textArea.setAttribute('aria-roledescription', nls.localize(60, "editor"));
134
+ this.textArea.setAttribute('aria-roledescription', nls.localize(65, "editor"));
135
135
  this.textArea.setAttribute('aria-multiline', 'true');
136
136
  this.textArea.setAttribute('aria-autocomplete', options.get(104 /* EditorOption.readOnly */) ? 'none' : 'both');
137
137
  this._ensureReadOnlyAttribute();
@@ -860,7 +860,7 @@ export var CoreNavigationCommands;
860
860
  type: 'object',
861
861
  properties: {
862
862
  'sticky': {
863
- description: nls.localize(61, "Stick to the end even when going to longer lines"),
863
+ description: nls.localize(66, "Stick to the end even when going to longer lines"),
864
864
  type: 'boolean',
865
865
  default: false
866
866
  }
@@ -888,7 +888,7 @@ export var CoreNavigationCommands;
888
888
  type: 'object',
889
889
  properties: {
890
890
  'sticky': {
891
- description: nls.localize(62, "Stick to the end even when going to longer lines"),
891
+ description: nls.localize(67, "Stick to the end even when going to longer lines"),
892
892
  type: 'boolean',
893
893
  default: false
894
894
  }
@@ -1436,7 +1436,7 @@ export var CoreNavigationCommands;
1436
1436
  viewModel.getPrimaryCursorState()
1437
1437
  ]);
1438
1438
  viewModel.revealAllCursors(args.source, true);
1439
- status(nls.localize(63, "Removed secondary cursors"));
1439
+ status(nls.localize(68, "Removed secondary cursors"));
1440
1440
  }
1441
1441
  });
1442
1442
  CoreNavigationCommands.RevealLine = registerEditorCommand(new class extends CoreEditorCommand {
@@ -412,17 +412,17 @@ export const UndoCommand = registerCommand(new MultiCommand({
412
412
  menuOpts: [{
413
413
  menuId: MenuId.MenubarEditMenu,
414
414
  group: '1_do',
415
- title: nls.localize(64, "&&Undo"),
415
+ title: nls.localize(69, "&&Undo"),
416
416
  order: 1
417
417
  }, {
418
418
  menuId: MenuId.CommandPalette,
419
419
  group: '',
420
- title: nls.localize(65, "Undo"),
420
+ title: nls.localize(70, "Undo"),
421
421
  order: 1
422
422
  }, {
423
423
  menuId: MenuId.SimpleEditorContext,
424
424
  group: '1_do',
425
- title: nls.localize(66, "Undo"),
425
+ title: nls.localize(71, "Undo"),
426
426
  order: 1
427
427
  }]
428
428
  }));
@@ -439,17 +439,17 @@ export const RedoCommand = registerCommand(new MultiCommand({
439
439
  menuOpts: [{
440
440
  menuId: MenuId.MenubarEditMenu,
441
441
  group: '1_do',
442
- title: nls.localize(67, "&&Redo"),
442
+ title: nls.localize(72, "&&Redo"),
443
443
  order: 2
444
444
  }, {
445
445
  menuId: MenuId.CommandPalette,
446
446
  group: '',
447
- title: nls.localize(68, "Redo"),
447
+ title: nls.localize(73, "Redo"),
448
448
  order: 1
449
449
  }, {
450
450
  menuId: MenuId.SimpleEditorContext,
451
451
  group: '1_do',
452
- title: nls.localize(69, "Redo"),
452
+ title: nls.localize(74, "Redo"),
453
453
  order: 2
454
454
  }]
455
455
  }));
@@ -465,17 +465,17 @@ export const SelectAllCommand = registerCommand(new MultiCommand({
465
465
  menuOpts: [{
466
466
  menuId: MenuId.MenubarSelectionMenu,
467
467
  group: '1_basic',
468
- title: nls.localize(70, "&&Select All"),
468
+ title: nls.localize(75, "&&Select All"),
469
469
  order: 1
470
470
  }, {
471
471
  menuId: MenuId.CommandPalette,
472
472
  group: '',
473
- title: nls.localize(71, "Select All"),
473
+ title: nls.localize(76, "Select All"),
474
474
  order: 1
475
475
  }, {
476
476
  menuId: MenuId.SimpleEditorContext,
477
477
  group: '9_select',
478
- title: nls.localize(72, "Select All"),
478
+ title: nls.localize(77, "Select All"),
479
479
  order: 1
480
480
  }]
481
481
  }));
@@ -83,7 +83,7 @@ let ViewGpuContext = class ViewGpuContext extends Disposable {
83
83
  if (!ViewGpuContext_1.device) {
84
84
  ViewGpuContext_1.device = GPULifecycle.requestDevice((message) => {
85
85
  const choices = [{
86
- label: nls.localize(73, "Use DOM-based rendering"),
86
+ label: nls.localize(78, "Use DOM-based rendering"),
87
87
  run: () => this.configurationService.updateValue('editor.experimentalGpuAcceleration', 'off'),
88
88
  }];
89
89
  this._notificationService.prompt(Severity.Warning, message, choices);
@@ -80,8 +80,6 @@ let HoverWidget = class HoverWidget extends Widget {
80
80
  options.appearance ??= {};
81
81
  options.appearance.compact ??= true;
82
82
  options.appearance.showPointer ??= true;
83
- options.position ??= {};
84
- options.position.hoverPosition ??= 2 /* HoverPosition.BELOW */;
85
83
  break;
86
84
  }
87
85
  case 2 /* HoverStyle.Mouse */: {
@@ -199,7 +197,7 @@ let HoverWidget = class HoverWidget extends Widget {
199
197
  if (options.appearance?.showHoverHint) {
200
198
  const statusBarElement = $('div.hover-row.status-bar');
201
199
  const infoElement = $('div.info');
202
- infoElement.textContent = localize(74, 'Hold {0} key to mouse over', isMacintosh ? 'Option' : 'Alt');
200
+ infoElement.textContent = localize(79, 'Hold {0} key to mouse over', isMacintosh ? 'Option' : 'Alt');
203
201
  statusBarElement.appendChild(infoElement);
204
202
  this._hover.containerDomNode.appendChild(statusBarElement);
205
203
  }