monaco-editor-core 0.55.0-dev-20251014 → 0.55.0-dev-20251016
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/nls.keys.json +1 -1
- package/esm/nls.messages.cs.js +9 -0
- package/esm/nls.messages.de.js +2 -2
- package/esm/nls.messages.es.js +2 -2
- package/esm/nls.messages.fr.js +2 -2
- package/esm/nls.messages.it.js +2 -2
- package/esm/nls.messages.ja.js +2 -2
- package/esm/nls.messages.js +1 -1
- package/esm/nls.messages.json +1 -1
- package/esm/nls.messages.ko.js +2 -2
- package/esm/nls.messages.pl.js +9 -0
- package/esm/nls.messages.pt-br.js +9 -0
- package/esm/nls.messages.ru.js +2 -2
- package/esm/nls.messages.tr.js +9 -0
- package/esm/nls.messages.zh-cn.js +2 -2
- package/esm/nls.messages.zh-tw.js +2 -2
- package/esm/nls.metadata.json +10 -0
- package/esm/vs/base/browser/canIUse.js +0 -1
- package/esm/vs/base/browser/canIUse.js.map +1 -1
- package/esm/vs/base/browser/domSanitize.js +31 -23
- package/esm/vs/base/browser/domSanitize.js.map +1 -1
- package/esm/vs/base/browser/dompurify/dompurify.js +188 -385
- package/esm/vs/base/browser/markdownRenderer.js +6 -1
- package/esm/vs/base/browser/markdownRenderer.js.map +1 -1
- package/esm/vs/base/browser/trustedTypes.js.map +1 -1
- package/esm/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
- package/esm/vs/base/browser/ui/toggle/toggle.js +6 -0
- package/esm/vs/base/browser/ui/toggle/toggle.js.map +1 -1
- package/esm/vs/base/common/codiconsLibrary.js +1 -0
- package/esm/vs/base/common/codiconsLibrary.js.map +1 -1
- package/esm/vs/base/common/objects.js +0 -1
- package/esm/vs/base/common/objects.js.map +1 -1
- package/esm/vs/editor/browser/controller/mouseTarget.js +2 -1
- package/esm/vs/editor/browser/controller/mouseTarget.js.map +1 -1
- package/esm/vs/editor/browser/coreCommands.js +4 -2
- package/esm/vs/editor/browser/coreCommands.js.map +1 -1
- package/esm/vs/editor/browser/services/abstractCodeEditorService.js +5 -0
- package/esm/vs/editor/browser/services/abstractCodeEditorService.js.map +1 -1
- package/esm/vs/editor/browser/services/codeEditorService.js.map +1 -1
- package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/copySelection.js +104 -0
- package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/copySelection.js.map +1 -0
- package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.js +3 -3
- package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones.js.map +1 -1
- package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin.js +25 -24
- package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin.js.map +1 -1
- package/esm/vs/editor/browser/widget/diffEditor/diffEditor.contribution.js +5 -5
- package/esm/vs/editor/browser/widget/diffEditor/diffEditorWidget.js +7 -3
- package/esm/vs/editor/browser/widget/diffEditor/diffEditorWidget.js.map +1 -1
- package/esm/vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature.js +7 -7
- package/esm/vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature.js +2 -2
- package/esm/vs/editor/browser/widget/diffEditor/features/revertButtonsFeature.js +2 -2
- package/esm/vs/editor/browser/widget/diffEditor/registrations.contribution.js +5 -5
- package/esm/vs/editor/browser/widget/diffEditor/style.css +11 -0
- package/esm/vs/editor/browser/widget/multiDiffEditor/colors.js +3 -3
- package/esm/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.js +2 -2
- package/esm/vs/editor/common/config/editorConfigurationSchema.js +54 -54
- package/esm/vs/editor/common/config/editorOptions.js +406 -406
- package/esm/vs/editor/common/core/editorColorRegistry.js +68 -68
- package/esm/vs/editor/common/cursor/cursorMoveCommands.js +10 -1
- package/esm/vs/editor/common/cursor/cursorMoveCommands.js.map +1 -1
- package/esm/vs/editor/common/editorContextKeys.js +46 -46
- package/esm/vs/editor/common/languages/modesRegistry.js +1 -1
- package/esm/vs/editor/common/languages.js +56 -56
- package/esm/vs/editor/common/model/editStack.js +1 -1
- package/esm/vs/editor/common/standaloneStrings.js +10 -10
- package/esm/vs/editor/common/viewLayout/viewLineRenderer.js +2 -2
- package/esm/vs/editor/contrib/anchorSelect/browser/anchorSelect.js +6 -6
- package/esm/vs/editor/contrib/bracketMatching/browser/bracketMatching.js +6 -6
- package/esm/vs/editor/contrib/caretOperations/browser/caretOperations.js +2 -2
- package/esm/vs/editor/contrib/caretOperations/browser/transpose.js +1 -1
- package/esm/vs/editor/contrib/clipboard/browser/clipboard.js +17 -17
- package/esm/vs/editor/contrib/codeAction/browser/codeAction.js +1 -1
- package/esm/vs/editor/contrib/codeAction/browser/codeActionCommands.js +29 -29
- package/esm/vs/editor/contrib/codeAction/browser/codeActionContributions.js +3 -3
- package/esm/vs/editor/contrib/codeAction/browser/codeActionController.js +3 -3
- package/esm/vs/editor/contrib/codeAction/browser/codeActionMenu.js +8 -8
- package/esm/vs/editor/contrib/codeAction/browser/lightBulbWidget.js +9 -9
- package/esm/vs/editor/contrib/codelens/browser/codelensController.js +2 -2
- package/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerCloseButton.js +1 -1
- package/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerHeader.js +1 -1
- package/esm/vs/editor/contrib/colorPicker/browser/standaloneColorPicker/standaloneColorPickerActions.js +7 -7
- package/esm/vs/editor/contrib/comment/browser/comment.js +6 -6
- package/esm/vs/editor/contrib/contextmenu/browser/contextmenu.js +13 -14
- package/esm/vs/editor/contrib/contextmenu/browser/contextmenu.js.map +1 -1
- package/esm/vs/editor/contrib/cursorUndo/browser/cursorUndo.js +2 -2
- package/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js +4 -4
- package/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.js +9 -9
- package/esm/vs/editor/contrib/dropOrPasteInto/browser/defaultProviders.js +8 -8
- package/esm/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.js +3 -3
- package/esm/vs/editor/contrib/dropOrPasteInto/browser/postEditWidget.js +2 -2
- package/esm/vs/editor/contrib/editorState/browser/keybindingCancellation.js +1 -1
- package/esm/vs/editor/contrib/find/browser/findController.js +16 -16
- package/esm/vs/editor/contrib/find/browser/findWidget.js +26 -26
- package/esm/vs/editor/contrib/folding/browser/folding.js +20 -20
- package/esm/vs/editor/contrib/folding/browser/foldingDecorations.js +9 -9
- package/esm/vs/editor/contrib/folding/browser/foldingDecorations.js.map +1 -1
- package/esm/vs/editor/contrib/fontZoom/browser/fontZoom.js +3 -3
- package/esm/vs/editor/contrib/format/browser/formatActions.js +2 -2
- package/esm/vs/editor/contrib/gotoError/browser/gotoError.js +8 -8
- package/esm/vs/editor/contrib/gotoError/browser/gotoErrorWidget.js +14 -14
- package/esm/vs/editor/contrib/gotoSymbol/browser/goToCommands.js +39 -39
- package/esm/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js +1 -1
- package/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesController.js +3 -3
- package/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesTree.js +3 -3
- package/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget.js +3 -3
- package/esm/vs/editor/contrib/gotoSymbol/browser/referencesModel.js +8 -8
- package/esm/vs/editor/contrib/gotoSymbol/browser/symbolNavigation.js +3 -3
- package/esm/vs/editor/contrib/gpu/browser/gpuActions.js +4 -4
- package/esm/vs/editor/contrib/hover/browser/hoverActionIds.js +2 -2
- package/esm/vs/editor/contrib/hover/browser/hoverActions.js +24 -24
- package/esm/vs/editor/contrib/hover/browser/markdownHoverParticipant.js +9 -9
- package/esm/vs/editor/contrib/hover/browser/markerHoverParticipant.js +5 -5
- package/esm/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace.js +2 -2
- package/esm/vs/editor/contrib/indentation/browser/indentation.js +20 -20
- package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsHover.js +8 -8
- package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commands.js +19 -19
- package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionContextKeys.js +12 -12
- package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js +15 -10
- package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/hoverParticipant.js +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/inlineCompletionsHintsWidget.js +5 -5
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js +6 -6
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js +20 -20
- package/esm/vs/editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js +1 -1
- package/esm/vs/editor/contrib/lineSelection/browser/lineSelection.js +1 -1
- package/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js +47 -37
- package/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js.map +1 -1
- package/esm/vs/editor/contrib/linkedEditing/browser/linkedEditing.js +2 -2
- package/esm/vs/editor/contrib/links/browser/links.js +10 -10
- package/esm/vs/editor/contrib/message/browser/messageController.js +1 -1
- package/esm/vs/editor/contrib/multicursor/browser/multicursor.js +22 -22
- package/esm/vs/editor/contrib/parameterHints/browser/parameterHints.js +1 -1
- package/esm/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.js +4 -4
- package/esm/vs/editor/contrib/peekView/browser/peekView.js +18 -18
- package/esm/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.js +1 -1
- package/esm/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.js +56 -10
- package/esm/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.js.map +1 -1
- package/esm/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.js +32 -32
- package/esm/vs/editor/contrib/readOnlyMessage/browser/contribution.js +2 -2
- package/esm/vs/editor/contrib/rename/browser/rename.js +11 -11
- package/esm/vs/editor/contrib/rename/browser/renameWidget.js +7 -7
- package/esm/vs/editor/contrib/smartSelect/browser/smartSelect.js +4 -4
- package/esm/vs/editor/contrib/snippet/browser/snippetController2.js +4 -4
- package/esm/vs/editor/contrib/snippet/browser/snippetVariables.js +4 -4
- package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollActions.js +11 -11
- package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.js +2 -2
- package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.js.map +1 -1
- package/esm/vs/editor/contrib/suggest/browser/suggest.js +8 -8
- package/esm/vs/editor/contrib/suggest/browser/suggestController.js +10 -10
- package/esm/vs/editor/contrib/suggest/browser/suggestWidget.js +17 -17
- package/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js +2 -2
- package/esm/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.js +2 -2
- package/esm/vs/editor/contrib/suggest/browser/wordContextKey.js +1 -1
- package/esm/vs/editor/contrib/symbolIcons/browser/symbolIcons.js +33 -33
- package/esm/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js +4 -4
- package/esm/vs/editor/contrib/tokenization/browser/tokenization.js +1 -1
- package/esm/vs/editor/contrib/unicodeHighlighter/browser/bannerController.js +1 -1
- package/esm/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js +24 -24
- package/esm/vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js +5 -5
- package/esm/vs/editor/contrib/wordHighlighter/browser/highlightDecorations.js +9 -9
- package/esm/vs/editor/contrib/wordHighlighter/browser/wordHighlighter.js +3 -3
- package/esm/vs/editor/contrib/wordOperations/browser/wordOperations.js +1 -1
- package/esm/vs/platform/accessibilitySignal/browser/accessibilitySignalService.js +62 -62
- package/esm/vs/platform/action/common/actionCommonCategories.js +6 -6
- package/esm/vs/platform/actionWidget/browser/actionList.js +4 -4
- package/esm/vs/platform/actionWidget/browser/actionWidget.js +7 -7
- package/esm/vs/platform/actions/browser/menuEntryActionViewItem.js +5 -5
- package/esm/vs/platform/actions/browser/toolbar.js +2 -2
- package/esm/vs/platform/actions/common/actions.js +0 -1
- package/esm/vs/platform/actions/common/actions.js.map +1 -1
- package/esm/vs/platform/actions/common/menuService.js +2 -2
- package/esm/vs/platform/configuration/common/configurationRegistry.js +10 -10
- package/esm/vs/platform/contextkey/browser/contextKeyService.js +1 -1
- package/esm/vs/platform/contextkey/common/contextkey.js +9 -9
- package/esm/vs/platform/contextkey/common/contextkeys.js +9 -9
- package/esm/vs/platform/contextkey/common/scanner.js +5 -5
- package/esm/vs/platform/history/browser/contextScopedHistoryWidget.js +1 -1
- package/esm/vs/platform/keybinding/common/abstractKeybindingService.js +4 -4
- package/esm/vs/platform/list/browser/listService.js +27 -27
- package/esm/vs/platform/markers/common/markerService.js +2 -2
- package/esm/vs/platform/markers/common/markers.js +6 -6
- package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js +7 -7
- package/esm/vs/platform/quickinput/browser/helpQuickAccess.js +1 -1
- package/esm/vs/platform/quickinput/browser/quickInput.js +10 -10
- package/esm/vs/platform/quickinput/browser/quickInputActions.js +5 -5
- package/esm/vs/platform/quickinput/browser/quickInputController.js +6 -6
- package/esm/vs/platform/quickinput/browser/quickInputList.js +1 -1
- package/esm/vs/platform/quickinput/browser/quickInputUtils.js +1 -1
- package/esm/vs/platform/quickinput/browser/tree/quickInputTreeAccessibilityProvider.js +1 -1
- package/esm/vs/platform/quickinput/common/quickInput.js.map +1 -1
- package/esm/vs/platform/theme/common/colorUtils.js +2 -2
- package/esm/vs/platform/theme/common/colors/baseColors.js +17 -17
- package/esm/vs/platform/theme/common/colors/chartsColors.js +8 -8
- package/esm/vs/platform/theme/common/colors/editorColors.js +95 -95
- package/esm/vs/platform/theme/common/colors/inputColors.js +47 -47
- package/esm/vs/platform/theme/common/colors/listColors.js +36 -36
- package/esm/vs/platform/theme/common/colors/menuColors.js +7 -7
- package/esm/vs/platform/theme/common/colors/minimapColors.js +11 -11
- package/esm/vs/platform/theme/common/colors/miscColors.js +15 -15
- package/esm/vs/platform/theme/common/colors/quickpickColors.js +9 -9
- package/esm/vs/platform/theme/common/colors/searchColors.js +3 -3
- package/esm/vs/platform/theme/common/iconRegistry.js +6 -6
- package/esm/vs/platform/undoRedo/common/undoRedoService.js +20 -20
- package/esm/vs/platform/workspace/common/workspace.js +1 -1
- package/package.json +3 -3
- package/version.txt +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/browser/controller/mouseTarget.ts","vs/editor/browser/controller/mouseTarget.ts"],"names":[],"mappings":"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","file":"mouseTarget.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 { IPointerHandlerHelper } from './mouseHandler.js';\nimport { IMouseTargetContentEmptyData, IMouseTargetMarginData, IMouseTarget, IMouseTargetContentEmpty, IMouseTargetContentText, IMouseTargetContentWidget, IMouseTargetMargin, IMouseTargetOutsideEditor, IMouseTargetOverlayWidget, IMouseTargetScrollbar, IMouseTargetTextarea, IMouseTargetUnknown, IMouseTargetViewZone, IMouseTargetContentTextData, IMouseTargetViewZoneData, MouseTargetType } from '../editorBrowser.js';\nimport { ClientCoordinates, EditorMouseEvent, EditorPagePosition, PageCoordinates, CoordinatesRelativeToEditor } from '../editorDom.js';\nimport { PartFingerprint, PartFingerprints } from '../view/viewPart.js';\nimport { ViewLine } from '../viewParts/viewLines/viewLine.js';\nimport { IViewCursorRenderData } from '../viewParts/viewCursors/viewCursor.js';\nimport { EditorLayoutInfo, EditorOption } from '../../common/config/editorOptions.js';\nimport { Position } from '../../common/core/position.js';\nimport { Range as EditorRange } from '../../common/core/range.js';\nimport { HorizontalPosition } from '../view/renderingContext.js';\nimport { ViewContext } from '../../common/viewModel/viewContext.js';\nimport { IViewModel } from '../../common/viewModel.js';\nimport { CursorColumns } from '../../common/core/cursorColumns.js';\nimport * as dom from '../../../base/browser/dom.js';\nimport { AtomicTabMoveOperations, Direction } from '../../common/cursor/cursorAtomicMoveOperations.js';\nimport { PositionAffinity, TextDirection } from '../../common/model.js';\nimport { InjectedText } from '../../common/modelLineProjectionData.js';\nimport { Mutable } from '../../../base/common/types.js';\nimport { Lazy } from '../../../base/common/lazy.js';\nimport { ViewLinesGpu } from '../viewParts/viewLinesGpu/viewLinesGpu.js';\n\nconst enum HitTestResultType {\n\tUnknown,\n\tContent,\n}\n\nclass UnknownHitTestResult {\n\treadonly type = HitTestResultType.Unknown;\n\tconstructor(\n\t\treadonly hitTarget: HTMLElement | null = null\n\t) { }\n}\n\nclass ContentHitTestResult {\n\treadonly type = HitTestResultType.Content;\n\n\tget hitTarget(): HTMLElement { return this.spanNode; }\n\n\tconstructor(\n\t\treadonly position: Position,\n\t\treadonly spanNode: HTMLElement,\n\t\treadonly injectedText: InjectedText | null,\n\t) { }\n}\n\ntype HitTestResult = UnknownHitTestResult | ContentHitTestResult;\n\nnamespace HitTestResult {\n\texport function createFromDOMInfo(ctx: HitTestContext, spanNode: HTMLElement, offset: number): HitTestResult {\n\t\tconst position = ctx.getPositionFromDOMInfo(spanNode, offset);\n\t\tif (position) {\n\t\t\treturn new ContentHitTestResult(position, spanNode, null);\n\t\t}\n\t\treturn new UnknownHitTestResult(spanNode);\n\t}\n}\n\nexport class PointerHandlerLastRenderData {\n\tconstructor(\n\t\tpublic readonly lastViewCursorsRenderData: IViewCursorRenderData[],\n\t\tpublic readonly lastTextareaPosition: Position | null\n\t) { }\n}\n\nexport class MouseTarget {\n\n\tprivate static _deduceRage(position: Position): EditorRange;\n\tprivate static _deduceRage(position: Position, range: EditorRange | null): EditorRange;\n\tprivate static _deduceRage(position: Position | null): EditorRange | null;\n\tprivate static _deduceRage(position: Position | null, range: EditorRange | null = null): EditorRange | null {\n\t\tif (!range && position) {\n\t\t\treturn new EditorRange(position.lineNumber, position.column, position.lineNumber, position.column);\n\t\t}\n\t\treturn range ?? null;\n\t}\n\tpublic static createUnknown(element: HTMLElement | null, mouseColumn: number, position: Position | null): IMouseTargetUnknown {\n\t\treturn { type: MouseTargetType.UNKNOWN, element, mouseColumn, position, range: this._deduceRage(position) };\n\t}\n\tpublic static createTextarea(element: HTMLElement | null, mouseColumn: number): IMouseTargetTextarea {\n\t\treturn { type: MouseTargetType.TEXTAREA, element, mouseColumn, position: null, range: null };\n\t}\n\tpublic static createMargin(type: MouseTargetType.GUTTER_GLYPH_MARGIN | MouseTargetType.GUTTER_LINE_NUMBERS | MouseTargetType.GUTTER_LINE_DECORATIONS, element: HTMLElement | null, mouseColumn: number, position: Position, range: EditorRange, detail: IMouseTargetMarginData): IMouseTargetMargin {\n\t\treturn { type, element, mouseColumn, position, range, detail };\n\t}\n\tpublic static createViewZone(type: MouseTargetType.GUTTER_VIEW_ZONE | MouseTargetType.CONTENT_VIEW_ZONE, element: HTMLElement | null, mouseColumn: number, position: Position, detail: IMouseTargetViewZoneData): IMouseTargetViewZone {\n\t\treturn { type, element, mouseColumn, position, range: this._deduceRage(position), detail };\n\t}\n\tpublic static createContentText(element: HTMLElement | null, mouseColumn: number, position: Position, range: EditorRange | null, detail: IMouseTargetContentTextData): IMouseTargetContentText {\n\t\treturn { type: MouseTargetType.CONTENT_TEXT, element, mouseColumn, position, range: this._deduceRage(position, range), detail };\n\t}\n\tpublic static createContentEmpty(element: HTMLElement | null, mouseColumn: number, position: Position, detail: IMouseTargetContentEmptyData): IMouseTargetContentEmpty {\n\t\treturn { type: MouseTargetType.CONTENT_EMPTY, element, mouseColumn, position, range: this._deduceRage(position), detail };\n\t}\n\tpublic static createContentWidget(element: HTMLElement | null, mouseColumn: number, detail: string): IMouseTargetContentWidget {\n\t\treturn { type: MouseTargetType.CONTENT_WIDGET, element, mouseColumn, position: null, range: null, detail };\n\t}\n\tpublic static createScrollbar(element: HTMLElement | null, mouseColumn: number, position: Position): IMouseTargetScrollbar {\n\t\treturn { type: MouseTargetType.SCROLLBAR, element, mouseColumn, position, range: this._deduceRage(position) };\n\t}\n\tpublic static createOverlayWidget(element: HTMLElement | null, mouseColumn: number, detail: string): IMouseTargetOverlayWidget {\n\t\treturn { type: MouseTargetType.OVERLAY_WIDGET, element, mouseColumn, position: null, range: null, detail };\n\t}\n\tpublic static createOutsideEditor(mouseColumn: number, position: Position, outsidePosition: 'above' | 'below' | 'left' | 'right', outsideDistance: number): IMouseTargetOutsideEditor {\n\t\treturn { type: MouseTargetType.OUTSIDE_EDITOR, element: null, mouseColumn, position, range: this._deduceRage(position), outsidePosition, outsideDistance };\n\t}\n\n\tprivate static _typeToString(type: MouseTargetType): string {\n\t\tif (type === MouseTargetType.TEXTAREA) {\n\t\t\treturn 'TEXTAREA';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_GLYPH_MARGIN) {\n\t\t\treturn 'GUTTER_GLYPH_MARGIN';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_LINE_NUMBERS) {\n\t\t\treturn 'GUTTER_LINE_NUMBERS';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_LINE_DECORATIONS) {\n\t\t\treturn 'GUTTER_LINE_DECORATIONS';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_VIEW_ZONE) {\n\t\t\treturn 'GUTTER_VIEW_ZONE';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_TEXT) {\n\t\t\treturn 'CONTENT_TEXT';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_EMPTY) {\n\t\t\treturn 'CONTENT_EMPTY';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_VIEW_ZONE) {\n\t\t\treturn 'CONTENT_VIEW_ZONE';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_WIDGET) {\n\t\t\treturn 'CONTENT_WIDGET';\n\t\t}\n\t\tif (type === MouseTargetType.OVERVIEW_RULER) {\n\t\t\treturn 'OVERVIEW_RULER';\n\t\t}\n\t\tif (type === MouseTargetType.SCROLLBAR) {\n\t\t\treturn 'SCROLLBAR';\n\t\t}\n\t\tif (type === MouseTargetType.OVERLAY_WIDGET) {\n\t\t\treturn 'OVERLAY_WIDGET';\n\t\t}\n\t\treturn 'UNKNOWN';\n\t}\n\n\tpublic static toString(target: IMouseTarget): string {\n\t\treturn this._typeToString(target.type) + ': ' + target.position + ' - ' + target.range + ' - ' + JSON.stringify((target as unknown as Record<string, unknown>).detail);\n\t}\n}\n\nclass ElementPath {\n\n\tpublic static isTextArea(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length === 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.TextArea\n\t\t);\n\t}\n\n\tpublic static isChildOfViewLines(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 4\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[3] === PartFingerprint.ViewLines\n\t\t);\n\t}\n\n\tpublic static isStrictChildOfViewLines(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length > 4\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[3] === PartFingerprint.ViewLines\n\t\t);\n\t}\n\n\tpublic static isChildOfScrollableElement(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.ScrollableElement\n\t\t);\n\t}\n\n\tpublic static isChildOfMinimap(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.Minimap\n\t\t);\n\t}\n\n\tpublic static isChildOfContentWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 4\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[3] === PartFingerprint.ContentWidgets\n\t\t);\n\t}\n\n\tpublic static isChildOfOverflowGuard(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 1\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t);\n\t}\n\n\tpublic static isChildOfOverflowingContentWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 1\n\t\t\t&& path[0] === PartFingerprint.OverflowingContentWidgets\n\t\t);\n\t}\n\n\tpublic static isChildOfOverlayWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.OverlayWidgets\n\t\t);\n\t}\n\n\tpublic static isChildOfOverflowingOverlayWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 1\n\t\t\t&& path[0] === PartFingerprint.OverflowingOverlayWidgets\n\t\t);\n\t}\n}\n\nexport class HitTestContext {\n\n\tpublic readonly viewModel: IViewModel;\n\tpublic readonly layoutInfo: EditorLayoutInfo;\n\tpublic readonly viewDomNode: HTMLElement;\n\tpublic readonly viewLinesGpu: ViewLinesGpu | undefined;\n\tpublic readonly lineHeight: number;\n\tpublic readonly stickyTabStops: boolean;\n\tpublic readonly typicalHalfwidthCharacterWidth: number;\n\tpublic readonly lastRenderData: PointerHandlerLastRenderData;\n\n\tprivate readonly _context: ViewContext;\n\tprivate readonly _viewHelper: IPointerHandlerHelper;\n\n\tconstructor(context: ViewContext, viewHelper: IPointerHandlerHelper, lastRenderData: PointerHandlerLastRenderData) {\n\t\tthis.viewModel = context.viewModel;\n\t\tconst options = context.configuration.options;\n\t\tthis.layoutInfo = options.get(EditorOption.layoutInfo);\n\t\tthis.viewDomNode = viewHelper.viewDomNode;\n\t\tthis.viewLinesGpu = viewHelper.viewLinesGpu;\n\t\tthis.lineHeight = options.get(EditorOption.lineHeight);\n\t\tthis.stickyTabStops = options.get(EditorOption.stickyTabStops);\n\t\tthis.typicalHalfwidthCharacterWidth = options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth;\n\t\tthis.lastRenderData = lastRenderData;\n\t\tthis._context = context;\n\t\tthis._viewHelper = viewHelper;\n\t}\n\n\tpublic getZoneAtCoord(mouseVerticalOffset: number): IMouseTargetViewZoneData | null {\n\t\treturn HitTestContext.getZoneAtCoord(this._context, mouseVerticalOffset);\n\t}\n\n\tpublic static getZoneAtCoord(context: ViewContext, mouseVerticalOffset: number): IMouseTargetViewZoneData | null {\n\t\t// The target is either a view zone or the empty space after the last view-line\n\t\tconst viewZoneWhitespace = context.viewLayout.getWhitespaceAtVerticalOffset(mouseVerticalOffset);\n\n\t\tif (viewZoneWhitespace) {\n\t\t\tconst viewZoneMiddle = viewZoneWhitespace.verticalOffset + viewZoneWhitespace.height / 2;\n\t\t\tconst lineCount = context.viewModel.getLineCount();\n\t\t\tlet positionBefore: Position | null = null;\n\t\t\tlet position: Position | null;\n\t\t\tlet positionAfter: Position | null = null;\n\n\t\t\tif (viewZoneWhitespace.afterLineNumber !== lineCount) {\n\t\t\t\t// There are more lines after this view zone\n\t\t\t\tpositionAfter = new Position(viewZoneWhitespace.afterLineNumber + 1, 1);\n\t\t\t}\n\t\t\tif (viewZoneWhitespace.afterLineNumber > 0) {\n\t\t\t\t// There are more lines above this view zone\n\t\t\t\tpositionBefore = new Position(viewZoneWhitespace.afterLineNumber, context.viewModel.getLineMaxColumn(viewZoneWhitespace.afterLineNumber));\n\t\t\t}\n\n\t\t\tif (positionAfter === null) {\n\t\t\t\tposition = positionBefore;\n\t\t\t} else if (positionBefore === null) {\n\t\t\t\tposition = positionAfter;\n\t\t\t} else if (mouseVerticalOffset < viewZoneMiddle) {\n\t\t\t\tposition = positionBefore;\n\t\t\t} else {\n\t\t\t\tposition = positionAfter;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tviewZoneId: viewZoneWhitespace.id,\n\t\t\t\tafterLineNumber: viewZoneWhitespace.afterLineNumber,\n\t\t\t\tpositionBefore: positionBefore,\n\t\t\t\tpositionAfter: positionAfter,\n\t\t\t\tposition: position!\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic getFullLineRangeAtCoord(mouseVerticalOffset: number): { range: EditorRange; isAfterLines: boolean } {\n\t\tif (this._context.viewLayout.isAfterLines(mouseVerticalOffset)) {\n\t\t\t// Below the last line\n\t\t\tconst lineNumber = this._context.viewModel.getLineCount();\n\t\t\tconst maxLineColumn = this._context.viewModel.getLineMaxColumn(lineNumber);\n\t\t\treturn {\n\t\t\t\trange: new EditorRange(lineNumber, maxLineColumn, lineNumber, maxLineColumn),\n\t\t\t\tisAfterLines: true\n\t\t\t};\n\t\t}\n\n\t\tconst lineNumber = this._context.viewLayout.getLineNumberAtVerticalOffset(mouseVerticalOffset);\n\t\tconst maxLineColumn = this._context.viewModel.getLineMaxColumn(lineNumber);\n\t\treturn {\n\t\t\trange: new EditorRange(lineNumber, 1, lineNumber, maxLineColumn),\n\t\t\tisAfterLines: false\n\t\t};\n\t}\n\n\tpublic getLineNumberAtVerticalOffset(mouseVerticalOffset: number): number {\n\t\treturn this._context.viewLayout.getLineNumberAtVerticalOffset(mouseVerticalOffset);\n\t}\n\n\tpublic isAfterLines(mouseVerticalOffset: number): boolean {\n\t\treturn this._context.viewLayout.isAfterLines(mouseVerticalOffset);\n\t}\n\n\tpublic isInTopPadding(mouseVerticalOffset: number): boolean {\n\t\treturn this._context.viewLayout.isInTopPadding(mouseVerticalOffset);\n\t}\n\n\tpublic isInBottomPadding(mouseVerticalOffset: number): boolean {\n\t\treturn this._context.viewLayout.isInBottomPadding(mouseVerticalOffset);\n\t}\n\n\tpublic getVerticalOffsetForLineNumber(lineNumber: number): number {\n\t\treturn this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber);\n\t}\n\n\tpublic findAttribute(element: Element, attr: string): string | null {\n\t\treturn HitTestContext._findAttribute(element, attr, this._viewHelper.viewDomNode);\n\t}\n\n\tprivate static _findAttribute(element: Element, attr: string, stopAt: Element): string | null {\n\t\twhile (element && element !== element.ownerDocument.body) {\n\t\t\tif (element.hasAttribute && element.hasAttribute(attr)) {\n\t\t\t\treturn element.getAttribute(attr);\n\t\t\t}\n\t\t\tif (element === stopAt) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\telement = <Element>element.parentNode;\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic getLineWidth(lineNumber: number): number {\n\t\treturn this._viewHelper.getLineWidth(lineNumber);\n\t}\n\n\tpublic isRtl(lineNumber: number): boolean {\n\t\treturn this.viewModel.getTextDirection(lineNumber) === TextDirection.RTL;\n\n\t}\n\n\tpublic visibleRangeForPosition(lineNumber: number, column: number): HorizontalPosition | null {\n\t\treturn this._viewHelper.visibleRangeForPosition(lineNumber, column);\n\t}\n\n\tpublic getPositionFromDOMInfo(spanNode: HTMLElement, offset: number): Position | null {\n\t\treturn this._viewHelper.getPositionFromDOMInfo(spanNode, offset);\n\t}\n\n\tpublic getCurrentScrollTop(): number {\n\t\treturn this._context.viewLayout.getCurrentScrollTop();\n\t}\n\n\tpublic getCurrentScrollLeft(): number {\n\t\treturn this._context.viewLayout.getCurrentScrollLeft();\n\t}\n}\n\nabstract class BareHitTestRequest {\n\n\tpublic readonly editorPos: EditorPagePosition;\n\tpublic readonly pos: PageCoordinates;\n\tpublic readonly relativePos: CoordinatesRelativeToEditor;\n\tpublic readonly mouseVerticalOffset: number;\n\tpublic readonly isInMarginArea: boolean;\n\tpublic readonly isInContentArea: boolean;\n\tpublic readonly mouseContentHorizontalOffset: number;\n\n\tprotected readonly mouseColumn: number;\n\n\tconstructor(ctx: HitTestContext, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor) {\n\t\tthis.editorPos = editorPos;\n\t\tthis.pos = pos;\n\t\tthis.relativePos = relativePos;\n\n\t\tthis.mouseVerticalOffset = Math.max(0, ctx.getCurrentScrollTop() + this.relativePos.y);\n\t\tthis.mouseContentHorizontalOffset = ctx.getCurrentScrollLeft() + this.relativePos.x - ctx.layoutInfo.contentLeft;\n\t\tthis.isInMarginArea = (this.relativePos.x < ctx.layoutInfo.contentLeft && this.relativePos.x >= ctx.layoutInfo.glyphMarginLeft);\n\t\tthis.isInContentArea = !this.isInMarginArea;\n\t\tthis.mouseColumn = Math.max(0, MouseTargetFactory._getMouseColumn(this.mouseContentHorizontalOffset, ctx.typicalHalfwidthCharacterWidth));\n\t}\n}\n\nclass HitTestRequest extends BareHitTestRequest {\n\tprivate readonly _ctx: HitTestContext;\n\tprivate readonly _eventTarget: HTMLElement | null;\n\tpublic readonly hitTestResult = new Lazy(() => MouseTargetFactory.doHitTest(this._ctx, this));\n\tprivate _useHitTestTarget: boolean;\n\tprivate _targetPathCacheElement: HTMLElement | null = null;\n\tprivate _targetPathCacheValue: Uint8Array = new Uint8Array(0);\n\n\tpublic get target(): HTMLElement | null {\n\t\tif (this._useHitTestTarget) {\n\t\t\treturn this.hitTestResult.value.hitTarget;\n\t\t}\n\t\treturn this._eventTarget;\n\t}\n\n\tpublic get targetPath(): Uint8Array {\n\t\tif (this._targetPathCacheElement !== this.target) {\n\t\t\tthis._targetPathCacheElement = this.target;\n\t\t\tthis._targetPathCacheValue = PartFingerprints.collect(this.target, this._ctx.viewDomNode);\n\t\t}\n\t\treturn this._targetPathCacheValue;\n\t}\n\n\tconstructor(ctx: HitTestContext, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor, eventTarget: HTMLElement | null) {\n\t\tsuper(ctx, editorPos, pos, relativePos);\n\t\tthis._ctx = ctx;\n\t\tthis._eventTarget = eventTarget;\n\n\t\t// If no event target is passed in, we will use the hit test target\n\t\tconst hasEventTarget = Boolean(this._eventTarget);\n\t\tthis._useHitTestTarget = !hasEventTarget;\n\t}\n\n\tpublic override toString(): string {\n\t\treturn `pos(${this.pos.x},${this.pos.y}), editorPos(${this.editorPos.x},${this.editorPos.y}), relativePos(${this.relativePos.x},${this.relativePos.y}), mouseVerticalOffset: ${this.mouseVerticalOffset}, mouseContentHorizontalOffset: ${this.mouseContentHorizontalOffset}\\n\\ttarget: ${this.target ? (<HTMLElement>this.target).outerHTML : null}`;\n\t}\n\n\tpublic get wouldBenefitFromHitTestTargetSwitch(): boolean {\n\t\treturn (\n\t\t\t!this._useHitTestTarget\n\t\t\t&& this.hitTestResult.value.hitTarget !== null\n\t\t\t&& this.target !== this.hitTestResult.value.hitTarget\n\t\t);\n\t}\n\n\tpublic switchToHitTestTarget(): void {\n\t\tthis._useHitTestTarget = true;\n\t}\n\n\tprivate _getMouseColumn(position: Position | null = null): number {\n\t\tif (position && position.column < this._ctx.viewModel.getLineMaxColumn(position.lineNumber)) {\n\t\t\t// Most likely, the line contains foreign decorations...\n\t\t\treturn CursorColumns.visibleColumnFromColumn(this._ctx.viewModel.getLineContent(position.lineNumber), position.column, this._ctx.viewModel.model.getOptions().tabSize) + 1;\n\t\t}\n\t\treturn this.mouseColumn;\n\t}\n\n\tpublic fulfillUnknown(position: Position | null = null): IMouseTargetUnknown {\n\t\treturn MouseTarget.createUnknown(this.target, this._getMouseColumn(position), position);\n\t}\n\tpublic fulfillTextarea(): IMouseTargetTextarea {\n\t\treturn MouseTarget.createTextarea(this.target, this._getMouseColumn());\n\t}\n\tpublic fulfillMargin(type: MouseTargetType.GUTTER_GLYPH_MARGIN | MouseTargetType.GUTTER_LINE_NUMBERS | MouseTargetType.GUTTER_LINE_DECORATIONS, position: Position, range: EditorRange, detail: IMouseTargetMarginData): IMouseTargetMargin {\n\t\treturn MouseTarget.createMargin(type, this.target, this._getMouseColumn(position), position, range, detail);\n\t}\n\tpublic fulfillViewZone(type: MouseTargetType.GUTTER_VIEW_ZONE | MouseTargetType.CONTENT_VIEW_ZONE, position: Position, detail: IMouseTargetViewZoneData): IMouseTargetViewZone {\n\t\treturn MouseTarget.createViewZone(type, this.target, this._getMouseColumn(position), position, detail);\n\t}\n\tpublic fulfillContentText(position: Position, range: EditorRange | null, detail: IMouseTargetContentTextData): IMouseTargetContentText {\n\t\treturn MouseTarget.createContentText(this.target, this._getMouseColumn(position), position, range, detail);\n\t}\n\tpublic fulfillContentEmpty(position: Position, detail: IMouseTargetContentEmptyData): IMouseTargetContentEmpty {\n\t\treturn MouseTarget.createContentEmpty(this.target, this._getMouseColumn(position), position, detail);\n\t}\n\tpublic fulfillContentWidget(detail: string): IMouseTargetContentWidget {\n\t\treturn MouseTarget.createContentWidget(this.target, this._getMouseColumn(), detail);\n\t}\n\tpublic fulfillScrollbar(position: Position): IMouseTargetScrollbar {\n\t\treturn MouseTarget.createScrollbar(this.target, this._getMouseColumn(position), position);\n\t}\n\tpublic fulfillOverlayWidget(detail: string): IMouseTargetOverlayWidget {\n\t\treturn MouseTarget.createOverlayWidget(this.target, this._getMouseColumn(), detail);\n\t}\n}\n\ninterface ResolvedHitTestRequest extends HitTestRequest {\n\treadonly target: HTMLElement;\n}\n\nconst EMPTY_CONTENT_AFTER_LINES: IMouseTargetContentEmptyData = { isAfterLines: true };\n\nfunction createEmptyContentDataInLines(horizontalDistanceToText: number): IMouseTargetContentEmptyData {\n\treturn {\n\t\tisAfterLines: false,\n\t\thorizontalDistanceToText: horizontalDistanceToText\n\t};\n}\n\nexport class MouseTargetFactory {\n\n\tprivate readonly _context: ViewContext;\n\tprivate readonly _viewHelper: IPointerHandlerHelper;\n\n\tconstructor(context: ViewContext, viewHelper: IPointerHandlerHelper) {\n\t\tthis._context = context;\n\t\tthis._viewHelper = viewHelper;\n\t}\n\n\tpublic mouseTargetIsWidget(e: EditorMouseEvent): boolean {\n\t\tconst t = <Element>e.target;\n\t\tconst path = PartFingerprints.collect(t, this._viewHelper.viewDomNode);\n\n\t\t// Is it a content widget?\n\t\tif (ElementPath.isChildOfContentWidgets(path) || ElementPath.isChildOfOverflowingContentWidgets(path)) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Is it an overlay widget?\n\t\tif (ElementPath.isChildOfOverlayWidgets(path) || ElementPath.isChildOfOverflowingOverlayWidgets(path)) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpublic createMouseTarget(lastRenderData: PointerHandlerLastRenderData, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor, target: HTMLElement | null): IMouseTarget {\n\t\tconst ctx = new HitTestContext(this._context, this._viewHelper, lastRenderData);\n\t\tconst request = new HitTestRequest(ctx, editorPos, pos, relativePos, target);\n\t\ttry {\n\t\t\tconst r = MouseTargetFactory._createMouseTarget(ctx, request);\n\n\t\t\tif (r.type === MouseTargetType.CONTENT_TEXT) {\n\t\t\t\t// Snap to the nearest soft tab boundary if atomic soft tabs are enabled.\n\t\t\t\tif (ctx.stickyTabStops && r.position !== null) {\n\t\t\t\t\tconst position = MouseTargetFactory._snapToSoftTabBoundary(r.position, ctx.viewModel);\n\t\t\t\t\tconst range = EditorRange.fromPositions(position, position).plusRange(r.range);\n\t\t\t\t\treturn request.fulfillContentText(position, range, r.detail);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// console.log(MouseTarget.toString(r));\n\t\t\treturn r;\n\t\t} catch (err) {\n\t\t\t// console.log(err);\n\t\t\treturn request.fulfillUnknown();\n\t\t}\n\t}\n\n\tprivate static _createMouseTarget(ctx: HitTestContext, request: HitTestRequest): IMouseTarget {\n\n\t\t// console.log(`${domHitTestExecuted ? '=>' : ''}CAME IN REQUEST: ${request}`);\n\n\t\tif (request.target === null) {\n\t\t\t// No target\n\t\t\treturn request.fulfillUnknown();\n\t\t}\n\n\t\t// we know for a fact that request.target is not null\n\t\tconst resolvedRequest = <ResolvedHitTestRequest>request;\n\n\t\tlet result: IMouseTarget | null = null;\n\n\t\tif (!ElementPath.isChildOfOverflowGuard(request.targetPath) && !ElementPath.isChildOfOverflowingContentWidgets(request.targetPath) && !ElementPath.isChildOfOverflowingOverlayWidgets(request.targetPath)) {\n\t\t\t// We only render dom nodes inside the overflow guard or in the overflowing content widgets\n\t\t\tresult = result || request.fulfillUnknown();\n\t\t}\n\n\t\tresult = result || MouseTargetFactory._hitTestContentWidget(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestOverlayWidget(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestMinimap(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestScrollbarSlider(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestViewZone(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestMargin(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestViewCursor(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestTextArea(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestViewLines(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestScrollbar(ctx, resolvedRequest);\n\n\t\treturn (result || request.fulfillUnknown());\n\t}\n\n\tprivate static _hitTestContentWidget(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it a content widget?\n\t\tif (ElementPath.isChildOfContentWidgets(request.targetPath) || ElementPath.isChildOfOverflowingContentWidgets(request.targetPath)) {\n\t\t\tconst widgetId = ctx.findAttribute(request.target, 'widgetId');\n\t\t\tif (widgetId) {\n\t\t\t\treturn request.fulfillContentWidget(widgetId);\n\t\t\t} else {\n\t\t\t\treturn request.fulfillUnknown();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestOverlayWidget(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it an overlay widget?\n\t\tif (ElementPath.isChildOfOverlayWidgets(request.targetPath) || ElementPath.isChildOfOverflowingOverlayWidgets(request.targetPath)) {\n\t\t\tconst widgetId = ctx.findAttribute(request.target, 'widgetId');\n\t\t\tif (widgetId) {\n\t\t\t\treturn request.fulfillOverlayWidget(widgetId);\n\t\t\t} else {\n\t\t\t\treturn request.fulfillUnknown();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestViewCursor(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\n\t\tif (request.target) {\n\t\t\t// Check if we've hit a painted cursor\n\t\t\tconst lastViewCursorsRenderData = ctx.lastRenderData.lastViewCursorsRenderData;\n\n\t\t\tfor (const d of lastViewCursorsRenderData) {\n\n\t\t\t\tif (request.target === d.domNode) {\n\t\t\t\t\treturn request.fulfillContentText(d.position, null, { mightBeForeignElement: false, injectedText: null });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (request.isInContentArea) {\n\t\t\t// Edge has a bug when hit-testing the exact position of a cursor,\n\t\t\t// instead of returning the correct dom node, it returns the\n\t\t\t// first or last rendered view line dom node, therefore help it out\n\t\t\t// and first check if we are on top of a cursor\n\n\t\t\tconst lastViewCursorsRenderData = ctx.lastRenderData.lastViewCursorsRenderData;\n\t\t\tconst mouseContentHorizontalOffset = request.mouseContentHorizontalOffset;\n\t\t\tconst mouseVerticalOffset = request.mouseVerticalOffset;\n\n\t\t\tfor (const d of lastViewCursorsRenderData) {\n\n\t\t\t\tif (mouseContentHorizontalOffset < d.contentLeft) {\n\t\t\t\t\t// mouse position is to the left of the cursor\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (mouseContentHorizontalOffset > d.contentLeft + d.width) {\n\t\t\t\t\t// mouse position is to the right of the cursor\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst cursorVerticalOffset = ctx.getVerticalOffsetForLineNumber(d.position.lineNumber);\n\n\t\t\t\tif (\n\t\t\t\t\tcursorVerticalOffset <= mouseVerticalOffset\n\t\t\t\t\t&& mouseVerticalOffset <= cursorVerticalOffset + d.height\n\t\t\t\t) {\n\t\t\t\t\treturn request.fulfillContentText(d.position, null, { mightBeForeignElement: false, injectedText: null });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestViewZone(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tconst viewZoneData = ctx.getZoneAtCoord(request.mouseVerticalOffset);\n\t\tif (viewZoneData) {\n\t\t\tconst mouseTargetType = (request.isInContentArea ? MouseTargetType.CONTENT_VIEW_ZONE : MouseTargetType.GUTTER_VIEW_ZONE);\n\t\t\treturn request.fulfillViewZone(mouseTargetType, viewZoneData.position, viewZoneData);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestTextArea(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it the textarea?\n\t\tif (ElementPath.isTextArea(request.targetPath)) {\n\t\t\tif (ctx.lastRenderData.lastTextareaPosition) {\n\t\t\t\treturn request.fulfillContentText(ctx.lastRenderData.lastTextareaPosition, null, { mightBeForeignElement: false, injectedText: null });\n\t\t\t}\n\t\t\treturn request.fulfillTextarea();\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestMargin(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (request.isInMarginArea) {\n\t\t\tconst res = ctx.getFullLineRangeAtCoord(request.mouseVerticalOffset);\n\t\t\tconst pos = res.range.getStartPosition();\n\t\t\tlet offset = Math.abs(request.relativePos.x);\n\t\t\tconst detail: Mutable<IMouseTargetMarginData> = {\n\t\t\t\tisAfterLines: res.isAfterLines,\n\t\t\t\tglyphMarginLeft: ctx.layoutInfo.glyphMarginLeft,\n\t\t\t\tglyphMarginWidth: ctx.layoutInfo.glyphMarginWidth,\n\t\t\t\tlineNumbersWidth: ctx.layoutInfo.lineNumbersWidth,\n\t\t\t\toffsetX: offset\n\t\t\t};\n\n\t\t\toffset -= ctx.layoutInfo.glyphMarginLeft;\n\n\t\t\tif (offset <= ctx.layoutInfo.glyphMarginWidth) {\n\t\t\t\t// On the glyph margin\n\t\t\t\tconst modelCoordinate = ctx.viewModel.coordinatesConverter.convertViewPositionToModelPosition(res.range.getStartPosition());\n\t\t\t\tconst lanes = ctx.viewModel.glyphLanes.getLanesAtLine(modelCoordinate.lineNumber);\n\t\t\t\tdetail.glyphMarginLane = lanes[Math.floor(offset / ctx.lineHeight)];\n\t\t\t\treturn request.fulfillMargin(MouseTargetType.GUTTER_GLYPH_MARGIN, pos, res.range, detail);\n\t\t\t}\n\t\t\toffset -= ctx.layoutInfo.glyphMarginWidth;\n\n\t\t\tif (offset <= ctx.layoutInfo.lineNumbersWidth) {\n\t\t\t\t// On the line numbers\n\t\t\t\treturn request.fulfillMargin(MouseTargetType.GUTTER_LINE_NUMBERS, pos, res.range, detail);\n\t\t\t}\n\t\t\toffset -= ctx.layoutInfo.lineNumbersWidth;\n\n\t\t\t// On the line decorations\n\t\t\treturn request.fulfillMargin(MouseTargetType.GUTTER_LINE_DECORATIONS, pos, res.range, detail);\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestViewLines(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (!ElementPath.isChildOfViewLines(request.targetPath)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (ctx.isInTopPadding(request.mouseVerticalOffset)) {\n\t\t\treturn request.fulfillContentEmpty(new Position(1, 1), EMPTY_CONTENT_AFTER_LINES);\n\t\t}\n\n\t\t// Check if it is below any lines and any view zones\n\t\tif (ctx.isAfterLines(request.mouseVerticalOffset) || ctx.isInBottomPadding(request.mouseVerticalOffset)) {\n\t\t\t// This most likely indicates it happened after the last view-line\n\t\t\tconst lineCount = ctx.viewModel.getLineCount();\n\t\t\tconst maxLineColumn = ctx.viewModel.getLineMaxColumn(lineCount);\n\t\t\treturn request.fulfillContentEmpty(new Position(lineCount, maxLineColumn), EMPTY_CONTENT_AFTER_LINES);\n\t\t}\n\n\t\t// Check if we are hitting a view-line (can happen in the case of inline decorations on empty lines)\n\t\t// See https://github.com/microsoft/vscode/issues/46942\n\t\tif (ElementPath.isStrictChildOfViewLines(request.targetPath)) {\n\t\t\tconst lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\tconst lineLength = ctx.viewModel.getLineLength(lineNumber);\n\t\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\t\t\tif (lineLength === 0) {\n\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\treturn request.fulfillContentEmpty(new Position(lineNumber, 1), detail);\n\t\t\t}\n\n\t\t\tconst isRtl = ctx.isRtl(lineNumber);\n\t\t\tif (isRtl) {\n\t\t\t\tif (request.mouseContentHorizontalOffset + lineWidth <= ctx.layoutInfo.contentWidth - ctx.layoutInfo.verticalScrollbarWidth) {\n\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t\t}\n\t\t\t} else if (request.mouseContentHorizontalOffset >= lineWidth) {\n\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t}\n\t\t} else {\n\t\t\tif (ctx.viewLinesGpu) {\n\t\t\t\tconst lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\t\tif (ctx.viewModel.getLineLength(lineNumber) === 0) {\n\t\t\t\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\treturn request.fulfillContentEmpty(new Position(lineNumber, 1), detail);\n\t\t\t\t}\n\n\t\t\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\t\t\t\tconst isRtl = ctx.isRtl(lineNumber);\n\t\t\t\tif (isRtl) {\n\t\t\t\t\tif (request.mouseContentHorizontalOffset + lineWidth <= ctx.layoutInfo.contentWidth - ctx.layoutInfo.verticalScrollbarWidth) {\n\t\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t\t\t}\n\t\t\t\t} else if (request.mouseContentHorizontalOffset >= lineWidth) {\n\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t\t}\n\n\t\t\t\tconst position = ctx.viewLinesGpu.getPositionAtCoordinate(lineNumber, request.mouseContentHorizontalOffset);\n\t\t\t\tif (position) {\n\t\t\t\t\tconst detail: IMouseTargetContentTextData = {\n\t\t\t\t\t\tinjectedText: null,\n\t\t\t\t\t\tmightBeForeignElement: false\n\t\t\t\t\t};\n\t\t\t\t\treturn request.fulfillContentText(position, EditorRange.fromPositions(position, position), detail);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Do the hit test (if not already done)\n\t\tconst hitTestResult = request.hitTestResult.value;\n\n\t\tif (hitTestResult.type === HitTestResultType.Content) {\n\t\t\treturn MouseTargetFactory.createMouseTargetFromHitTestPosition(ctx, request, hitTestResult.spanNode, hitTestResult.position, hitTestResult.injectedText);\n\t\t}\n\n\t\t// We didn't hit content...\n\t\tif (request.wouldBenefitFromHitTestTargetSwitch) {\n\t\t\t// We actually hit something different... Give it one last change by trying again with this new target\n\t\t\trequest.switchToHitTestTarget();\n\t\t\treturn this._createMouseTarget(ctx, request);\n\t\t}\n\n\t\t// We have tried everything...\n\t\treturn request.fulfillUnknown();\n\t}\n\n\tprivate static _hitTestMinimap(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (ElementPath.isChildOfMinimap(request.targetPath)) {\n\t\t\tconst possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\tconst maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber);\n\t\t\treturn request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn));\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestScrollbarSlider(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (ElementPath.isChildOfScrollableElement(request.targetPath)) {\n\t\t\tif (request.target && request.target.nodeType === 1) {\n\t\t\t\tconst className = request.target.className;\n\t\t\t\tif (className && /\\b(slider|scrollbar)\\b/.test(className)) {\n\t\t\t\t\tconst possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\t\t\tconst maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber);\n\t\t\t\t\treturn request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestScrollbar(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it the overview ruler?\n\t\t// Is it a child of the scrollable element?\n\t\tif (ElementPath.isChildOfScrollableElement(request.targetPath)) {\n\t\t\tconst possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\tconst maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber);\n\t\t\treturn request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn));\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic getMouseColumn(relativePos: CoordinatesRelativeToEditor): number {\n\t\tconst options = this._context.configuration.options;\n\t\tconst layoutInfo = options.get(EditorOption.layoutInfo);\n\t\tconst mouseContentHorizontalOffset = this._context.viewLayout.getCurrentScrollLeft() + relativePos.x - layoutInfo.contentLeft;\n\t\treturn MouseTargetFactory._getMouseColumn(mouseContentHorizontalOffset, options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth);\n\t}\n\n\tpublic static _getMouseColumn(mouseContentHorizontalOffset: number, typicalHalfwidthCharacterWidth: number): number {\n\t\tif (mouseContentHorizontalOffset < 0) {\n\t\t\treturn 1;\n\t\t}\n\t\tconst chars = Math.round(mouseContentHorizontalOffset / typicalHalfwidthCharacterWidth);\n\t\treturn (chars + 1);\n\t}\n\n\tprivate static createMouseTargetFromHitTestPosition(ctx: HitTestContext, request: HitTestRequest, spanNode: HTMLElement, pos: Position, injectedText: InjectedText | null): IMouseTarget {\n\t\tconst lineNumber = pos.lineNumber;\n\t\tconst column = pos.column;\n\n\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\n\t\tif (request.mouseContentHorizontalOffset > lineWidth) {\n\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t}\n\n\t\tconst visibleRange = ctx.visibleRangeForPosition(lineNumber, column);\n\n\t\tif (!visibleRange) {\n\t\t\treturn request.fulfillUnknown(pos);\n\t\t}\n\n\t\tconst columnHorizontalOffset = visibleRange.left;\n\n\t\tif (Math.abs(request.mouseContentHorizontalOffset - columnHorizontalOffset) < 1) {\n\t\t\treturn request.fulfillContentText(pos, null, { mightBeForeignElement: !!injectedText, injectedText });\n\t\t}\n\n\t\t// Let's define a, b, c and check if the offset is in between them...\n\t\tinterface OffsetColumn { offset: number; column: number }\n\n\t\tconst points: OffsetColumn[] = [];\n\t\tpoints.push({ offset: visibleRange.left, column: column });\n\t\tif (column > 1) {\n\t\t\tconst visibleRange = ctx.visibleRangeForPosition(lineNumber, column - 1);\n\t\t\tif (visibleRange) {\n\t\t\t\tpoints.push({ offset: visibleRange.left, column: column - 1 });\n\t\t\t}\n\t\t}\n\t\tconst lineMaxColumn = ctx.viewModel.getLineMaxColumn(lineNumber);\n\t\tif (column < lineMaxColumn) {\n\t\t\tconst visibleRange = ctx.visibleRangeForPosition(lineNumber, column + 1);\n\t\t\tif (visibleRange) {\n\t\t\t\tpoints.push({ offset: visibleRange.left, column: column + 1 });\n\t\t\t}\n\t\t}\n\n\t\tpoints.sort((a, b) => a.offset - b.offset);\n\n\t\tconst mouseCoordinates = request.pos.toClientCoordinates(dom.getWindow(ctx.viewDomNode));\n\t\tconst spanNodeClientRect = spanNode.getBoundingClientRect();\n\t\tconst mouseIsOverSpanNode = (spanNodeClientRect.left <= mouseCoordinates.clientX && mouseCoordinates.clientX <= spanNodeClientRect.right);\n\n\t\tlet rng: EditorRange | null = null;\n\n\t\tfor (let i = 1; i < points.length; i++) {\n\t\t\tconst prev = points[i - 1];\n\t\t\tconst curr = points[i];\n\t\t\tif (prev.offset <= request.mouseContentHorizontalOffset && request.mouseContentHorizontalOffset <= curr.offset) {\n\t\t\t\trng = new EditorRange(lineNumber, prev.column, lineNumber, curr.column);\n\n\t\t\t\t// See https://github.com/microsoft/vscode/issues/152819\n\t\t\t\t// Due to the use of zwj, the browser's hit test result is skewed towards the left\n\t\t\t\t// Here we try to correct that if the mouse horizontal offset is closer to the right than the left\n\n\t\t\t\tconst prevDelta = Math.abs(prev.offset - request.mouseContentHorizontalOffset);\n\t\t\t\tconst nextDelta = Math.abs(curr.offset - request.mouseContentHorizontalOffset);\n\n\t\t\t\tpos = (\n\t\t\t\t\tprevDelta < nextDelta\n\t\t\t\t\t\t? new Position(lineNumber, prev.column)\n\t\t\t\t\t\t: new Position(lineNumber, curr.column)\n\t\t\t\t);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn request.fulfillContentText(pos, rng, { mightBeForeignElement: !mouseIsOverSpanNode || !!injectedText, injectedText });\n\t}\n\n\t/**\n\t * Most probably WebKit browsers and Edge\n\t */\n\tprivate static _doHitTestWithCaretRangeFromPoint(ctx: HitTestContext, request: BareHitTestRequest): HitTestResult {\n\n\t\t// In Chrome, especially on Linux it is possible to click between lines,\n\t\t// so try to adjust the `hity` below so that it lands in the center of a line\n\t\tconst lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\tconst lineStartVerticalOffset = ctx.getVerticalOffsetForLineNumber(lineNumber);\n\t\tconst lineEndVerticalOffset = lineStartVerticalOffset + ctx.lineHeight;\n\n\t\tconst isBelowLastLine = (\n\t\t\tlineNumber === ctx.viewModel.getLineCount()\n\t\t\t&& request.mouseVerticalOffset > lineEndVerticalOffset\n\t\t);\n\n\t\tif (!isBelowLastLine) {\n\t\t\tconst lineCenteredVerticalOffset = Math.floor((lineStartVerticalOffset + lineEndVerticalOffset) / 2);\n\t\t\tlet adjustedPageY = request.pos.y + (lineCenteredVerticalOffset - request.mouseVerticalOffset);\n\n\t\t\tif (adjustedPageY <= request.editorPos.y) {\n\t\t\t\tadjustedPageY = request.editorPos.y + 1;\n\t\t\t}\n\t\t\tif (adjustedPageY >= request.editorPos.y + request.editorPos.height) {\n\t\t\t\tadjustedPageY = request.editorPos.y + request.editorPos.height - 1;\n\t\t\t}\n\n\t\t\tconst adjustedPage = new PageCoordinates(request.pos.x, adjustedPageY);\n\n\t\t\tconst r = this._actualDoHitTestWithCaretRangeFromPoint(ctx, adjustedPage.toClientCoordinates(dom.getWindow(ctx.viewDomNode)));\n\t\t\tif (r.type === HitTestResultType.Content) {\n\t\t\t\treturn r;\n\t\t\t}\n\t\t}\n\n\t\t// Also try to hit test without the adjustment (for the edge cases that we are near the top or bottom)\n\t\treturn this._actualDoHitTestWithCaretRangeFromPoint(ctx, request.pos.toClientCoordinates(dom.getWindow(ctx.viewDomNode)));\n\t}\n\n\tprivate static _actualDoHitTestWithCaretRangeFromPoint(ctx: HitTestContext, coords: ClientCoordinates): HitTestResult {\n\t\tconst shadowRoot = dom.getShadowRoot(ctx.viewDomNode);\n\t\tlet range: Range;\n\t\tif (shadowRoot) {\n\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t\tif (typeof (<any>shadowRoot).caretRangeFromPoint === 'undefined') {\n\t\t\t\trange = shadowCaretRangeFromPoint(shadowRoot, coords.clientX, coords.clientY);\n\t\t\t} else {\n\t\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t\t\trange = (<any>shadowRoot).caretRangeFromPoint(coords.clientX, coords.clientY);\n\t\t\t}\n\t\t} else {\n\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t\trange = (<any>ctx.viewDomNode.ownerDocument).caretRangeFromPoint(coords.clientX, coords.clientY);\n\t\t}\n\n\t\tif (!range || !range.startContainer) {\n\t\t\treturn new UnknownHitTestResult();\n\t\t}\n\n\t\t// Chrome always hits a TEXT_NODE, while Edge sometimes hits a token span\n\t\tconst startContainer = range.startContainer;\n\n\t\tif (startContainer.nodeType === startContainer.TEXT_NODE) {\n\t\t\t// startContainer is expected to be the token text\n\t\t\tconst parent1 = startContainer.parentNode; // expected to be the token span\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null; // expected to be the view line container span\n\t\t\tconst parent3 = parent2 ? parent2.parentNode : null; // expected to be the view line div\n\t\t\tconst parent3ClassName = parent3 && parent3.nodeType === parent3.ELEMENT_NODE ? (<HTMLElement>parent3).className : null;\n\n\t\t\tif (parent3ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>parent1, range.startOffset);\n\t\t\t} else {\n\t\t\t\treturn new UnknownHitTestResult(<HTMLElement>startContainer.parentNode);\n\t\t\t}\n\t\t} else if (startContainer.nodeType === startContainer.ELEMENT_NODE) {\n\t\t\t// startContainer is expected to be the token span\n\t\t\tconst parent1 = startContainer.parentNode; // expected to be the view line container span\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null; // expected to be the view line div\n\t\t\tconst parent2ClassName = parent2 && parent2.nodeType === parent2.ELEMENT_NODE ? (<HTMLElement>parent2).className : null;\n\n\t\t\tif (parent2ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>startContainer, (<HTMLElement>startContainer).textContent!.length);\n\t\t\t} else {\n\t\t\t\treturn new UnknownHitTestResult(<HTMLElement>startContainer);\n\t\t\t}\n\t\t}\n\n\t\treturn new UnknownHitTestResult();\n\t}\n\n\t/**\n\t * Most probably Gecko\n\t */\n\tprivate static _doHitTestWithCaretPositionFromPoint(ctx: HitTestContext, coords: ClientCoordinates): HitTestResult {\n\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\tconst hitResult: { offsetNode: Node; offset: number } = (<any>ctx.viewDomNode.ownerDocument).caretPositionFromPoint(coords.clientX, coords.clientY);\n\n\t\tif (hitResult.offsetNode.nodeType === hitResult.offsetNode.TEXT_NODE) {\n\t\t\t// offsetNode is expected to be the token text\n\t\t\tconst parent1 = hitResult.offsetNode.parentNode; // expected to be the token span\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null; // expected to be the view line container span\n\t\t\tconst parent3 = parent2 ? parent2.parentNode : null; // expected to be the view line div\n\t\t\tconst parent3ClassName = parent3 && parent3.nodeType === parent3.ELEMENT_NODE ? (<HTMLElement>parent3).className : null;\n\n\t\t\tif (parent3ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>hitResult.offsetNode.parentNode, hitResult.offset);\n\t\t\t} else {\n\t\t\t\treturn new UnknownHitTestResult(<HTMLElement>hitResult.offsetNode.parentNode);\n\t\t\t}\n\t\t}\n\n\t\t// For inline decorations, Gecko sometimes returns the `<span>` of the line and the offset is the `<span>` with the inline decoration\n\t\t// Some other times, it returns the `<span>` with the inline decoration\n\t\tif (hitResult.offsetNode.nodeType === hitResult.offsetNode.ELEMENT_NODE) {\n\t\t\tconst parent1 = hitResult.offsetNode.parentNode;\n\t\t\tconst parent1ClassName = parent1 && parent1.nodeType === parent1.ELEMENT_NODE ? (<HTMLElement>parent1).className : null;\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null;\n\t\t\tconst parent2ClassName = parent2 && parent2.nodeType === parent2.ELEMENT_NODE ? (<HTMLElement>parent2).className : null;\n\n\t\t\tif (parent1ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\t// it returned the `<span>` of the line and the offset is the `<span>` with the inline decoration\n\t\t\t\tconst tokenSpan = hitResult.offsetNode.childNodes[Math.min(hitResult.offset, hitResult.offsetNode.childNodes.length - 1)];\n\t\t\t\tif (tokenSpan) {\n\t\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>tokenSpan, 0);\n\t\t\t\t}\n\t\t\t} else if (parent2ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\t// it returned the `<span>` with the inline decoration\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>hitResult.offsetNode, 0);\n\t\t\t}\n\t\t}\n\n\t\treturn new UnknownHitTestResult(<HTMLElement>hitResult.offsetNode);\n\t}\n\n\tprivate static _snapToSoftTabBoundary(position: Position, viewModel: IViewModel): Position {\n\t\tconst lineContent = viewModel.getLineContent(position.lineNumber);\n\t\tconst { tabSize } = viewModel.model.getOptions();\n\t\tconst newPosition = AtomicTabMoveOperations.atomicPosition(lineContent, position.column - 1, tabSize, Direction.Nearest);\n\t\tif (newPosition !== -1) {\n\t\t\treturn new Position(position.lineNumber, newPosition + 1);\n\t\t}\n\t\treturn position;\n\t}\n\n\tpublic static doHitTest(ctx: HitTestContext, request: BareHitTestRequest): HitTestResult {\n\n\t\tlet result: HitTestResult = new UnknownHitTestResult();\n\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\tif (typeof (<any>ctx.viewDomNode.ownerDocument).caretRangeFromPoint === 'function') {\n\t\t\tresult = this._doHitTestWithCaretRangeFromPoint(ctx, request);\n\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t} else if ((<any>ctx.viewDomNode.ownerDocument).caretPositionFromPoint) {\n\t\t\tresult = this._doHitTestWithCaretPositionFromPoint(ctx, request.pos.toClientCoordinates(dom.getWindow(ctx.viewDomNode)));\n\t\t}\n\t\tif (result.type === HitTestResultType.Content) {\n\t\t\tconst injectedText = ctx.viewModel.getInjectedTextAt(result.position);\n\n\t\t\tconst normalizedPosition = ctx.viewModel.normalizePosition(result.position, PositionAffinity.None);\n\t\t\tif (injectedText || !normalizedPosition.equals(result.position)) {\n\t\t\t\tresult = new ContentHitTestResult(normalizedPosition, result.spanNode, injectedText);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n}\n\nfunction shadowCaretRangeFromPoint(shadowRoot: ShadowRoot, x: number, y: number): Range {\n\tconst range = document.createRange();\n\n\t// Get the element under the point\n\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\tlet el: HTMLElement | null = (<any>shadowRoot).elementFromPoint(x, y);\n\t// When el is not null, it may be div.monaco-mouse-cursor-text Element, which has not childNodes, we don't need to handle it.\n\tif (el?.hasChildNodes()) {\n\t\t// Get the last child of the element until its firstChild is a text node\n\t\t// This assumes that the pointer is on the right of the line, out of the tokens\n\t\t// and that we want to get the offset of the last token of the line\n\t\twhile (el && el.firstChild && el.firstChild.nodeType !== el.firstChild.TEXT_NODE && el.lastChild && el.lastChild.firstChild) {\n\t\t\tel = <HTMLElement>el.lastChild;\n\t\t}\n\n\t\t// Grab its rect\n\t\tconst rect = el.getBoundingClientRect();\n\n\t\t// And its font (the computed shorthand font property might be empty, see #3217)\n\t\tconst elWindow = dom.getWindow(el);\n\t\tconst fontStyle = elWindow.getComputedStyle(el, null).getPropertyValue('font-style');\n\t\tconst fontVariant = elWindow.getComputedStyle(el, null).getPropertyValue('font-variant');\n\t\tconst fontWeight = elWindow.getComputedStyle(el, null).getPropertyValue('font-weight');\n\t\tconst fontSize = elWindow.getComputedStyle(el, null).getPropertyValue('font-size');\n\t\tconst lineHeight = elWindow.getComputedStyle(el, null).getPropertyValue('line-height');\n\t\tconst fontFamily = elWindow.getComputedStyle(el, null).getPropertyValue('font-family');\n\t\tconst font = `${fontStyle} ${fontVariant} ${fontWeight} ${fontSize}/${lineHeight} ${fontFamily}`;\n\n\t\t// And also its txt content\n\t\tconst text = el.innerText;\n\n\t\t// Position the pixel cursor at the left of the element\n\t\tlet pixelCursor = rect.left;\n\t\tlet offset = 0;\n\t\tlet step: number;\n\n\t\t// If the point is on the right of the box put the cursor after the last character\n\t\tif (x > rect.left + rect.width) {\n\t\t\toffset = text.length;\n\t\t} else {\n\t\t\tconst charWidthReader = CharWidthReader.getInstance();\n\t\t\t// Goes through all the characters of the innerText, and checks if the x of the point\n\t\t\t// belongs to the character.\n\t\t\tfor (let i = 0; i < text.length + 1; i++) {\n\t\t\t\t// The step is half the width of the character\n\t\t\t\tstep = charWidthReader.getCharWidth(text.charAt(i), font) / 2;\n\t\t\t\t// Move to the center of the character\n\t\t\t\tpixelCursor += step;\n\t\t\t\t// If the x of the point is smaller that the position of the cursor, the point is over that character\n\t\t\t\tif (x < pixelCursor) {\n\t\t\t\t\toffset = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// Move between the current character and the next\n\t\t\t\tpixelCursor += step;\n\t\t\t}\n\t\t}\n\n\t\t// Creates a range with the text node of the element and set the offset found\n\t\trange.setStart(el.firstChild!, offset);\n\t\trange.setEnd(el.firstChild!, offset);\n\t}\n\n\treturn range;\n}\n\nclass CharWidthReader {\n\tprivate static _INSTANCE: CharWidthReader | null = null;\n\n\tpublic static getInstance(): CharWidthReader {\n\t\tif (!CharWidthReader._INSTANCE) {\n\t\t\tCharWidthReader._INSTANCE = new CharWidthReader();\n\t\t}\n\t\treturn CharWidthReader._INSTANCE;\n\t}\n\n\tprivate readonly _cache: { [cacheKey: string]: number };\n\tprivate readonly _canvas: HTMLCanvasElement;\n\n\tprivate constructor() {\n\t\tthis._cache = {};\n\t\tthis._canvas = document.createElement('canvas');\n\t}\n\n\tpublic getCharWidth(char: string, font: string): number {\n\t\tconst cacheKey = char + font;\n\t\tif (this._cache[cacheKey]) {\n\t\t\treturn this._cache[cacheKey];\n\t\t}\n\n\t\tconst context = this._canvas.getContext('2d')!;\n\t\tcontext.font = font;\n\t\tconst metrics = context.measureText(char);\n\t\tconst width = metrics.width;\n\t\tthis._cache[cacheKey] = width;\n\t\treturn width;\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 { IPointerHandlerHelper } from './mouseHandler.js';\nimport { IMouseTargetContentEmptyData, IMouseTargetMarginData, IMouseTarget, IMouseTargetContentEmpty, IMouseTargetContentText, IMouseTargetContentWidget, IMouseTargetMargin, IMouseTargetOutsideEditor, IMouseTargetOverlayWidget, IMouseTargetScrollbar, IMouseTargetTextarea, IMouseTargetUnknown, IMouseTargetViewZone, IMouseTargetContentTextData, IMouseTargetViewZoneData, MouseTargetType } from '../editorBrowser.js';\nimport { ClientCoordinates, EditorMouseEvent, EditorPagePosition, PageCoordinates, CoordinatesRelativeToEditor } from '../editorDom.js';\nimport { PartFingerprint, PartFingerprints } from '../view/viewPart.js';\nimport { ViewLine } from '../viewParts/viewLines/viewLine.js';\nimport { IViewCursorRenderData } from '../viewParts/viewCursors/viewCursor.js';\nimport { EditorLayoutInfo, EditorOption } from '../../common/config/editorOptions.js';\nimport { Position } from '../../common/core/position.js';\nimport { Range as EditorRange } from '../../common/core/range.js';\nimport { HorizontalPosition } from '../view/renderingContext.js';\nimport { ViewContext } from '../../common/viewModel/viewContext.js';\nimport { IViewModel } from '../../common/viewModel.js';\nimport { CursorColumns } from '../../common/core/cursorColumns.js';\nimport * as dom from '../../../base/browser/dom.js';\nimport { AtomicTabMoveOperations, Direction } from '../../common/cursor/cursorAtomicMoveOperations.js';\nimport { PositionAffinity, TextDirection } from '../../common/model.js';\nimport { InjectedText } from '../../common/modelLineProjectionData.js';\nimport { Mutable } from '../../../base/common/types.js';\nimport { Lazy } from '../../../base/common/lazy.js';\nimport { ViewLinesGpu } from '../viewParts/viewLinesGpu/viewLinesGpu.js';\n\nconst enum HitTestResultType {\n\tUnknown,\n\tContent,\n}\n\nclass UnknownHitTestResult {\n\treadonly type = HitTestResultType.Unknown;\n\tconstructor(\n\t\treadonly hitTarget: HTMLElement | null = null\n\t) { }\n}\n\nclass ContentHitTestResult {\n\treadonly type = HitTestResultType.Content;\n\n\tget hitTarget(): HTMLElement { return this.spanNode; }\n\n\tconstructor(\n\t\treadonly position: Position,\n\t\treadonly spanNode: HTMLElement,\n\t\treadonly injectedText: InjectedText | null,\n\t) { }\n}\n\ntype HitTestResult = UnknownHitTestResult | ContentHitTestResult;\n\nnamespace HitTestResult {\n\texport function createFromDOMInfo(ctx: HitTestContext, spanNode: HTMLElement, offset: number): HitTestResult {\n\t\tconst position = ctx.getPositionFromDOMInfo(spanNode, offset);\n\t\tif (position) {\n\t\t\treturn new ContentHitTestResult(position, spanNode, null);\n\t\t}\n\t\treturn new UnknownHitTestResult(spanNode);\n\t}\n}\n\nexport class PointerHandlerLastRenderData {\n\tconstructor(\n\t\tpublic readonly lastViewCursorsRenderData: IViewCursorRenderData[],\n\t\tpublic readonly lastTextareaPosition: Position | null\n\t) { }\n}\n\nexport class MouseTarget {\n\n\tprivate static _deduceRage(position: Position): EditorRange;\n\tprivate static _deduceRage(position: Position, range: EditorRange | null): EditorRange;\n\tprivate static _deduceRage(position: Position | null): EditorRange | null;\n\tprivate static _deduceRage(position: Position | null, range: EditorRange | null = null): EditorRange | null {\n\t\tif (!range && position) {\n\t\t\treturn new EditorRange(position.lineNumber, position.column, position.lineNumber, position.column);\n\t\t}\n\t\treturn range ?? null;\n\t}\n\tpublic static createUnknown(element: HTMLElement | null, mouseColumn: number, position: Position | null): IMouseTargetUnknown {\n\t\treturn { type: MouseTargetType.UNKNOWN, element, mouseColumn, position, range: this._deduceRage(position) };\n\t}\n\tpublic static createTextarea(element: HTMLElement | null, mouseColumn: number): IMouseTargetTextarea {\n\t\treturn { type: MouseTargetType.TEXTAREA, element, mouseColumn, position: null, range: null };\n\t}\n\tpublic static createMargin(type: MouseTargetType.GUTTER_GLYPH_MARGIN | MouseTargetType.GUTTER_LINE_NUMBERS | MouseTargetType.GUTTER_LINE_DECORATIONS, element: HTMLElement | null, mouseColumn: number, position: Position, range: EditorRange, detail: IMouseTargetMarginData): IMouseTargetMargin {\n\t\treturn { type, element, mouseColumn, position, range, detail };\n\t}\n\tpublic static createViewZone(type: MouseTargetType.GUTTER_VIEW_ZONE | MouseTargetType.CONTENT_VIEW_ZONE, element: HTMLElement | null, mouseColumn: number, position: Position, detail: IMouseTargetViewZoneData): IMouseTargetViewZone {\n\t\treturn { type, element, mouseColumn, position, range: this._deduceRage(position), detail };\n\t}\n\tpublic static createContentText(element: HTMLElement | null, mouseColumn: number, position: Position, range: EditorRange | null, detail: IMouseTargetContentTextData): IMouseTargetContentText {\n\t\treturn { type: MouseTargetType.CONTENT_TEXT, element, mouseColumn, position, range: this._deduceRage(position, range), detail };\n\t}\n\tpublic static createContentEmpty(element: HTMLElement | null, mouseColumn: number, position: Position, detail: IMouseTargetContentEmptyData): IMouseTargetContentEmpty {\n\t\treturn { type: MouseTargetType.CONTENT_EMPTY, element, mouseColumn, position, range: this._deduceRage(position), detail };\n\t}\n\tpublic static createContentWidget(element: HTMLElement | null, mouseColumn: number, detail: string): IMouseTargetContentWidget {\n\t\treturn { type: MouseTargetType.CONTENT_WIDGET, element, mouseColumn, position: null, range: null, detail };\n\t}\n\tpublic static createScrollbar(element: HTMLElement | null, mouseColumn: number, position: Position): IMouseTargetScrollbar {\n\t\treturn { type: MouseTargetType.SCROLLBAR, element, mouseColumn, position, range: this._deduceRage(position) };\n\t}\n\tpublic static createOverlayWidget(element: HTMLElement | null, mouseColumn: number, detail: string): IMouseTargetOverlayWidget {\n\t\treturn { type: MouseTargetType.OVERLAY_WIDGET, element, mouseColumn, position: null, range: null, detail };\n\t}\n\tpublic static createOutsideEditor(mouseColumn: number, position: Position, outsidePosition: 'above' | 'below' | 'left' | 'right', outsideDistance: number): IMouseTargetOutsideEditor {\n\t\treturn { type: MouseTargetType.OUTSIDE_EDITOR, element: null, mouseColumn, position, range: this._deduceRage(position), outsidePosition, outsideDistance };\n\t}\n\n\tprivate static _typeToString(type: MouseTargetType): string {\n\t\tif (type === MouseTargetType.TEXTAREA) {\n\t\t\treturn 'TEXTAREA';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_GLYPH_MARGIN) {\n\t\t\treturn 'GUTTER_GLYPH_MARGIN';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_LINE_NUMBERS) {\n\t\t\treturn 'GUTTER_LINE_NUMBERS';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_LINE_DECORATIONS) {\n\t\t\treturn 'GUTTER_LINE_DECORATIONS';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_VIEW_ZONE) {\n\t\t\treturn 'GUTTER_VIEW_ZONE';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_TEXT) {\n\t\t\treturn 'CONTENT_TEXT';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_EMPTY) {\n\t\t\treturn 'CONTENT_EMPTY';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_VIEW_ZONE) {\n\t\t\treturn 'CONTENT_VIEW_ZONE';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_WIDGET) {\n\t\t\treturn 'CONTENT_WIDGET';\n\t\t}\n\t\tif (type === MouseTargetType.OVERVIEW_RULER) {\n\t\t\treturn 'OVERVIEW_RULER';\n\t\t}\n\t\tif (type === MouseTargetType.SCROLLBAR) {\n\t\t\treturn 'SCROLLBAR';\n\t\t}\n\t\tif (type === MouseTargetType.OVERLAY_WIDGET) {\n\t\t\treturn 'OVERLAY_WIDGET';\n\t\t}\n\t\treturn 'UNKNOWN';\n\t}\n\n\tpublic static toString(target: IMouseTarget): string {\n\t\treturn this._typeToString(target.type) + ': ' + target.position + ' - ' + target.range + ' - ' + JSON.stringify((target as unknown as Record<string, unknown>).detail);\n\t}\n}\n\nclass ElementPath {\n\n\tpublic static isTextArea(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length === 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.TextArea\n\t\t);\n\t}\n\n\tpublic static isChildOfViewLines(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 4\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[3] === PartFingerprint.ViewLines\n\t\t);\n\t}\n\n\tpublic static isStrictChildOfViewLines(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length > 4\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[3] === PartFingerprint.ViewLines\n\t\t);\n\t}\n\n\tpublic static isChildOfScrollableElement(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.ScrollableElement\n\t\t);\n\t}\n\n\tpublic static isChildOfMinimap(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.Minimap\n\t\t);\n\t}\n\n\tpublic static isChildOfContentWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 4\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[3] === PartFingerprint.ContentWidgets\n\t\t);\n\t}\n\n\tpublic static isChildOfOverflowGuard(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 1\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t);\n\t}\n\n\tpublic static isChildOfOverflowingContentWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 1\n\t\t\t&& path[0] === PartFingerprint.OverflowingContentWidgets\n\t\t);\n\t}\n\n\tpublic static isChildOfOverlayWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.OverlayWidgets\n\t\t);\n\t}\n\n\tpublic static isChildOfOverflowingOverlayWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 1\n\t\t\t&& path[0] === PartFingerprint.OverflowingOverlayWidgets\n\t\t);\n\t}\n}\n\nexport class HitTestContext {\n\n\tpublic readonly viewModel: IViewModel;\n\tpublic readonly layoutInfo: EditorLayoutInfo;\n\tpublic readonly viewDomNode: HTMLElement;\n\tpublic readonly viewLinesGpu: ViewLinesGpu | undefined;\n\tpublic readonly lineHeight: number;\n\tpublic readonly stickyTabStops: boolean;\n\tpublic readonly typicalHalfwidthCharacterWidth: number;\n\tpublic readonly lastRenderData: PointerHandlerLastRenderData;\n\n\tprivate readonly _context: ViewContext;\n\tprivate readonly _viewHelper: IPointerHandlerHelper;\n\n\tconstructor(context: ViewContext, viewHelper: IPointerHandlerHelper, lastRenderData: PointerHandlerLastRenderData) {\n\t\tthis.viewModel = context.viewModel;\n\t\tconst options = context.configuration.options;\n\t\tthis.layoutInfo = options.get(EditorOption.layoutInfo);\n\t\tthis.viewDomNode = viewHelper.viewDomNode;\n\t\tthis.viewLinesGpu = viewHelper.viewLinesGpu;\n\t\tthis.lineHeight = options.get(EditorOption.lineHeight);\n\t\tthis.stickyTabStops = options.get(EditorOption.stickyTabStops);\n\t\tthis.typicalHalfwidthCharacterWidth = options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth;\n\t\tthis.lastRenderData = lastRenderData;\n\t\tthis._context = context;\n\t\tthis._viewHelper = viewHelper;\n\t}\n\n\tpublic getZoneAtCoord(mouseVerticalOffset: number): IMouseTargetViewZoneData | null {\n\t\treturn HitTestContext.getZoneAtCoord(this._context, mouseVerticalOffset);\n\t}\n\n\tpublic static getZoneAtCoord(context: ViewContext, mouseVerticalOffset: number): IMouseTargetViewZoneData | null {\n\t\t// The target is either a view zone or the empty space after the last view-line\n\t\tconst viewZoneWhitespace = context.viewLayout.getWhitespaceAtVerticalOffset(mouseVerticalOffset);\n\n\t\tif (viewZoneWhitespace) {\n\t\t\tconst viewZoneMiddle = viewZoneWhitespace.verticalOffset + viewZoneWhitespace.height / 2;\n\t\t\tconst lineCount = context.viewModel.getLineCount();\n\t\t\tlet positionBefore: Position | null = null;\n\t\t\tlet position: Position | null;\n\t\t\tlet positionAfter: Position | null = null;\n\n\t\t\tif (viewZoneWhitespace.afterLineNumber !== lineCount) {\n\t\t\t\t// There are more lines after this view zone\n\t\t\t\tpositionAfter = new Position(viewZoneWhitespace.afterLineNumber + 1, 1);\n\t\t\t}\n\t\t\tif (viewZoneWhitespace.afterLineNumber > 0) {\n\t\t\t\t// There are more lines above this view zone\n\t\t\t\tpositionBefore = new Position(viewZoneWhitespace.afterLineNumber, context.viewModel.getLineMaxColumn(viewZoneWhitespace.afterLineNumber));\n\t\t\t}\n\n\t\t\tif (positionAfter === null) {\n\t\t\t\tposition = positionBefore;\n\t\t\t} else if (positionBefore === null) {\n\t\t\t\tposition = positionAfter;\n\t\t\t} else if (mouseVerticalOffset < viewZoneMiddle) {\n\t\t\t\tposition = positionBefore;\n\t\t\t} else {\n\t\t\t\tposition = positionAfter;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tviewZoneId: viewZoneWhitespace.id,\n\t\t\t\tafterLineNumber: viewZoneWhitespace.afterLineNumber,\n\t\t\t\tpositionBefore: positionBefore,\n\t\t\t\tpositionAfter: positionAfter,\n\t\t\t\tposition: position!\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic getFullLineRangeAtCoord(mouseVerticalOffset: number): { range: EditorRange; isAfterLines: boolean } {\n\t\tif (this._context.viewLayout.isAfterLines(mouseVerticalOffset)) {\n\t\t\t// Below the last line\n\t\t\tconst lineNumber = this._context.viewModel.getLineCount();\n\t\t\tconst maxLineColumn = this._context.viewModel.getLineMaxColumn(lineNumber);\n\t\t\treturn {\n\t\t\t\trange: new EditorRange(lineNumber, maxLineColumn, lineNumber, maxLineColumn),\n\t\t\t\tisAfterLines: true\n\t\t\t};\n\t\t}\n\n\t\tconst lineNumber = this._context.viewLayout.getLineNumberAtVerticalOffset(mouseVerticalOffset);\n\t\tconst maxLineColumn = this._context.viewModel.getLineMaxColumn(lineNumber);\n\t\treturn {\n\t\t\trange: new EditorRange(lineNumber, 1, lineNumber, maxLineColumn),\n\t\t\tisAfterLines: false\n\t\t};\n\t}\n\n\tpublic getLineNumberAtVerticalOffset(mouseVerticalOffset: number): number {\n\t\treturn this._context.viewLayout.getLineNumberAtVerticalOffset(mouseVerticalOffset);\n\t}\n\n\tpublic isAfterLines(mouseVerticalOffset: number): boolean {\n\t\treturn this._context.viewLayout.isAfterLines(mouseVerticalOffset);\n\t}\n\n\tpublic isInTopPadding(mouseVerticalOffset: number): boolean {\n\t\treturn this._context.viewLayout.isInTopPadding(mouseVerticalOffset);\n\t}\n\n\tpublic isInBottomPadding(mouseVerticalOffset: number): boolean {\n\t\treturn this._context.viewLayout.isInBottomPadding(mouseVerticalOffset);\n\t}\n\n\tpublic getVerticalOffsetForLineNumber(lineNumber: number): number {\n\t\treturn this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber);\n\t}\n\n\tpublic findAttribute(element: Element, attr: string): string | null {\n\t\treturn HitTestContext._findAttribute(element, attr, this._viewHelper.viewDomNode);\n\t}\n\n\tprivate static _findAttribute(element: Element, attr: string, stopAt: Element): string | null {\n\t\twhile (element && element !== element.ownerDocument.body) {\n\t\t\tif (element.hasAttribute && element.hasAttribute(attr)) {\n\t\t\t\treturn element.getAttribute(attr);\n\t\t\t}\n\t\t\tif (element === stopAt) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\telement = <Element>element.parentNode;\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic getLineWidth(lineNumber: number): number {\n\t\treturn this._viewHelper.getLineWidth(lineNumber);\n\t}\n\n\tpublic isRtl(lineNumber: number): boolean {\n\t\treturn this.viewModel.getTextDirection(lineNumber) === TextDirection.RTL;\n\n\t}\n\n\tpublic visibleRangeForPosition(lineNumber: number, column: number): HorizontalPosition | null {\n\t\treturn this._viewHelper.visibleRangeForPosition(lineNumber, column);\n\t}\n\n\tpublic getPositionFromDOMInfo(spanNode: HTMLElement, offset: number): Position | null {\n\t\treturn this._viewHelper.getPositionFromDOMInfo(spanNode, offset);\n\t}\n\n\tpublic getCurrentScrollTop(): number {\n\t\treturn this._context.viewLayout.getCurrentScrollTop();\n\t}\n\n\tpublic getCurrentScrollLeft(): number {\n\t\treturn this._context.viewLayout.getCurrentScrollLeft();\n\t}\n}\n\nabstract class BareHitTestRequest {\n\n\tpublic readonly editorPos: EditorPagePosition;\n\tpublic readonly pos: PageCoordinates;\n\tpublic readonly relativePos: CoordinatesRelativeToEditor;\n\tpublic readonly mouseVerticalOffset: number;\n\tpublic readonly isInMarginArea: boolean;\n\tpublic readonly isInContentArea: boolean;\n\tpublic readonly mouseContentHorizontalOffset: number;\n\n\tprotected readonly mouseColumn: number;\n\n\tconstructor(ctx: HitTestContext, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor) {\n\t\tthis.editorPos = editorPos;\n\t\tthis.pos = pos;\n\t\tthis.relativePos = relativePos;\n\n\t\tthis.mouseVerticalOffset = Math.max(0, ctx.getCurrentScrollTop() + this.relativePos.y);\n\t\tthis.mouseContentHorizontalOffset = ctx.getCurrentScrollLeft() + this.relativePos.x - ctx.layoutInfo.contentLeft;\n\t\tthis.isInMarginArea = (this.relativePos.x < ctx.layoutInfo.contentLeft && this.relativePos.x >= ctx.layoutInfo.glyphMarginLeft);\n\t\tthis.isInContentArea = !this.isInMarginArea;\n\t\tthis.mouseColumn = Math.max(0, MouseTargetFactory._getMouseColumn(this.mouseContentHorizontalOffset, ctx.typicalHalfwidthCharacterWidth));\n\t}\n}\n\nclass HitTestRequest extends BareHitTestRequest {\n\tprivate readonly _ctx: HitTestContext;\n\tprivate readonly _eventTarget: HTMLElement | null;\n\tpublic readonly hitTestResult = new Lazy(() => MouseTargetFactory.doHitTest(this._ctx, this));\n\tprivate _useHitTestTarget: boolean;\n\tprivate _targetPathCacheElement: HTMLElement | null = null;\n\tprivate _targetPathCacheValue: Uint8Array = new Uint8Array(0);\n\n\tpublic get target(): HTMLElement | null {\n\t\tif (this._useHitTestTarget) {\n\t\t\treturn this.hitTestResult.value.hitTarget;\n\t\t}\n\t\treturn this._eventTarget;\n\t}\n\n\tpublic get targetPath(): Uint8Array {\n\t\tif (this._targetPathCacheElement !== this.target) {\n\t\t\tthis._targetPathCacheElement = this.target;\n\t\t\tthis._targetPathCacheValue = PartFingerprints.collect(this.target, this._ctx.viewDomNode);\n\t\t}\n\t\treturn this._targetPathCacheValue;\n\t}\n\n\tconstructor(ctx: HitTestContext, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor, eventTarget: HTMLElement | null) {\n\t\tsuper(ctx, editorPos, pos, relativePos);\n\t\tthis._ctx = ctx;\n\t\tthis._eventTarget = eventTarget;\n\n\t\t// If no event target is passed in, we will use the hit test target\n\t\tconst hasEventTarget = Boolean(this._eventTarget);\n\t\tthis._useHitTestTarget = !hasEventTarget;\n\t}\n\n\tpublic override toString(): string {\n\t\treturn `pos(${this.pos.x},${this.pos.y}), editorPos(${this.editorPos.x},${this.editorPos.y}), relativePos(${this.relativePos.x},${this.relativePos.y}), mouseVerticalOffset: ${this.mouseVerticalOffset}, mouseContentHorizontalOffset: ${this.mouseContentHorizontalOffset}\\n\\ttarget: ${this.target ? (<HTMLElement>this.target).outerHTML : null}`;\n\t}\n\n\tpublic get wouldBenefitFromHitTestTargetSwitch(): boolean {\n\t\treturn (\n\t\t\t!this._useHitTestTarget\n\t\t\t&& this.hitTestResult.value.hitTarget !== null\n\t\t\t&& this.target !== this.hitTestResult.value.hitTarget\n\t\t);\n\t}\n\n\tpublic switchToHitTestTarget(): void {\n\t\tthis._useHitTestTarget = true;\n\t}\n\n\tprivate _getMouseColumn(position: Position | null = null): number {\n\t\tif (position && position.column < this._ctx.viewModel.getLineMaxColumn(position.lineNumber)) {\n\t\t\t// Most likely, the line contains foreign decorations...\n\t\t\treturn CursorColumns.visibleColumnFromColumn(this._ctx.viewModel.getLineContent(position.lineNumber), position.column, this._ctx.viewModel.model.getOptions().tabSize) + 1;\n\t\t}\n\t\treturn this.mouseColumn;\n\t}\n\n\tpublic fulfillUnknown(position: Position | null = null): IMouseTargetUnknown {\n\t\treturn MouseTarget.createUnknown(this.target, this._getMouseColumn(position), position);\n\t}\n\tpublic fulfillTextarea(): IMouseTargetTextarea {\n\t\treturn MouseTarget.createTextarea(this.target, this._getMouseColumn());\n\t}\n\tpublic fulfillMargin(type: MouseTargetType.GUTTER_GLYPH_MARGIN | MouseTargetType.GUTTER_LINE_NUMBERS | MouseTargetType.GUTTER_LINE_DECORATIONS, position: Position, range: EditorRange, detail: IMouseTargetMarginData): IMouseTargetMargin {\n\t\treturn MouseTarget.createMargin(type, this.target, this._getMouseColumn(position), position, range, detail);\n\t}\n\tpublic fulfillViewZone(type: MouseTargetType.GUTTER_VIEW_ZONE | MouseTargetType.CONTENT_VIEW_ZONE, position: Position, detail: IMouseTargetViewZoneData): IMouseTargetViewZone {\n\t\treturn MouseTarget.createViewZone(type, this.target, this._getMouseColumn(position), position, detail);\n\t}\n\tpublic fulfillContentText(position: Position, range: EditorRange | null, detail: IMouseTargetContentTextData): IMouseTargetContentText {\n\t\treturn MouseTarget.createContentText(this.target, this._getMouseColumn(position), position, range, detail);\n\t}\n\tpublic fulfillContentEmpty(position: Position, detail: IMouseTargetContentEmptyData): IMouseTargetContentEmpty {\n\t\treturn MouseTarget.createContentEmpty(this.target, this._getMouseColumn(position), position, detail);\n\t}\n\tpublic fulfillContentWidget(detail: string): IMouseTargetContentWidget {\n\t\treturn MouseTarget.createContentWidget(this.target, this._getMouseColumn(), detail);\n\t}\n\tpublic fulfillScrollbar(position: Position): IMouseTargetScrollbar {\n\t\treturn MouseTarget.createScrollbar(this.target, this._getMouseColumn(position), position);\n\t}\n\tpublic fulfillOverlayWidget(detail: string): IMouseTargetOverlayWidget {\n\t\treturn MouseTarget.createOverlayWidget(this.target, this._getMouseColumn(), detail);\n\t}\n}\n\ninterface ResolvedHitTestRequest extends HitTestRequest {\n\treadonly target: HTMLElement;\n}\n\nconst EMPTY_CONTENT_AFTER_LINES: IMouseTargetContentEmptyData = { isAfterLines: true };\n\nfunction createEmptyContentDataInLines(horizontalDistanceToText: number): IMouseTargetContentEmptyData {\n\treturn {\n\t\tisAfterLines: false,\n\t\thorizontalDistanceToText: horizontalDistanceToText\n\t};\n}\n\nexport class MouseTargetFactory {\n\n\tprivate readonly _context: ViewContext;\n\tprivate readonly _viewHelper: IPointerHandlerHelper;\n\n\tconstructor(context: ViewContext, viewHelper: IPointerHandlerHelper) {\n\t\tthis._context = context;\n\t\tthis._viewHelper = viewHelper;\n\t}\n\n\tpublic mouseTargetIsWidget(e: EditorMouseEvent): boolean {\n\t\tconst t = <Element>e.target;\n\t\tconst path = PartFingerprints.collect(t, this._viewHelper.viewDomNode);\n\n\t\t// Is it a content widget?\n\t\tif (ElementPath.isChildOfContentWidgets(path) || ElementPath.isChildOfOverflowingContentWidgets(path)) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Is it an overlay widget?\n\t\tif (ElementPath.isChildOfOverlayWidgets(path) || ElementPath.isChildOfOverflowingOverlayWidgets(path)) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpublic createMouseTarget(lastRenderData: PointerHandlerLastRenderData, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor, target: HTMLElement | null): IMouseTarget {\n\t\tconst ctx = new HitTestContext(this._context, this._viewHelper, lastRenderData);\n\t\tconst request = new HitTestRequest(ctx, editorPos, pos, relativePos, target);\n\t\ttry {\n\t\t\tconst r = MouseTargetFactory._createMouseTarget(ctx, request);\n\n\t\t\tif (r.type === MouseTargetType.CONTENT_TEXT) {\n\t\t\t\t// Snap to the nearest soft tab boundary if atomic soft tabs are enabled.\n\t\t\t\tif (ctx.stickyTabStops && r.position !== null) {\n\t\t\t\t\tconst position = MouseTargetFactory._snapToSoftTabBoundary(r.position, ctx.viewModel);\n\t\t\t\t\tconst range = EditorRange.fromPositions(position, position).plusRange(r.range);\n\t\t\t\t\treturn request.fulfillContentText(position, range, r.detail);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// console.log(MouseTarget.toString(r));\n\t\t\treturn r;\n\t\t} catch (err) {\n\t\t\t// console.log(err);\n\t\t\treturn request.fulfillUnknown();\n\t\t}\n\t}\n\n\tprivate static _createMouseTarget(ctx: HitTestContext, request: HitTestRequest): IMouseTarget {\n\n\t\t// console.log(`${domHitTestExecuted ? '=>' : ''}CAME IN REQUEST: ${request}`);\n\n\t\tif (request.target === null) {\n\t\t\t// No target\n\t\t\treturn request.fulfillUnknown();\n\t\t}\n\n\t\t// we know for a fact that request.target is not null\n\t\tconst resolvedRequest = <ResolvedHitTestRequest>request;\n\n\t\tlet result: IMouseTarget | null = null;\n\n\t\tif (!ElementPath.isChildOfOverflowGuard(request.targetPath) && !ElementPath.isChildOfOverflowingContentWidgets(request.targetPath) && !ElementPath.isChildOfOverflowingOverlayWidgets(request.targetPath)) {\n\t\t\t// We only render dom nodes inside the overflow guard or in the overflowing content widgets\n\t\t\tresult = result || request.fulfillUnknown();\n\t\t}\n\n\t\tresult = result || MouseTargetFactory._hitTestContentWidget(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestOverlayWidget(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestMinimap(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestScrollbarSlider(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestViewZone(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestMargin(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestViewCursor(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestTextArea(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestViewLines(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestScrollbar(ctx, resolvedRequest);\n\n\t\treturn (result || request.fulfillUnknown());\n\t}\n\n\tprivate static _hitTestContentWidget(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it a content widget?\n\t\tif (ElementPath.isChildOfContentWidgets(request.targetPath) || ElementPath.isChildOfOverflowingContentWidgets(request.targetPath)) {\n\t\t\tconst widgetId = ctx.findAttribute(request.target, 'widgetId');\n\t\t\tif (widgetId) {\n\t\t\t\treturn request.fulfillContentWidget(widgetId);\n\t\t\t} else {\n\t\t\t\treturn request.fulfillUnknown();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestOverlayWidget(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it an overlay widget?\n\t\tif (ElementPath.isChildOfOverlayWidgets(request.targetPath) || ElementPath.isChildOfOverflowingOverlayWidgets(request.targetPath)) {\n\t\t\tconst widgetId = ctx.findAttribute(request.target, 'widgetId');\n\t\t\tif (widgetId) {\n\t\t\t\treturn request.fulfillOverlayWidget(widgetId);\n\t\t\t} else {\n\t\t\t\treturn request.fulfillUnknown();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestViewCursor(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\n\t\tif (request.target) {\n\t\t\t// Check if we've hit a painted cursor\n\t\t\tconst lastViewCursorsRenderData = ctx.lastRenderData.lastViewCursorsRenderData;\n\n\t\t\tfor (const d of lastViewCursorsRenderData) {\n\n\t\t\t\tif (request.target === d.domNode) {\n\t\t\t\t\treturn request.fulfillContentText(d.position, null, { mightBeForeignElement: false, injectedText: null });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (request.isInContentArea) {\n\t\t\t// Edge has a bug when hit-testing the exact position of a cursor,\n\t\t\t// instead of returning the correct dom node, it returns the\n\t\t\t// first or last rendered view line dom node, therefore help it out\n\t\t\t// and first check if we are on top of a cursor\n\n\t\t\tconst lastViewCursorsRenderData = ctx.lastRenderData.lastViewCursorsRenderData;\n\t\t\tconst mouseContentHorizontalOffset = request.mouseContentHorizontalOffset;\n\t\t\tconst mouseVerticalOffset = request.mouseVerticalOffset;\n\n\t\t\tfor (const d of lastViewCursorsRenderData) {\n\n\t\t\t\tif (mouseContentHorizontalOffset < d.contentLeft) {\n\t\t\t\t\t// mouse position is to the left of the cursor\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (mouseContentHorizontalOffset > d.contentLeft + d.width) {\n\t\t\t\t\t// mouse position is to the right of the cursor\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst cursorVerticalOffset = ctx.getVerticalOffsetForLineNumber(d.position.lineNumber);\n\n\t\t\t\tif (\n\t\t\t\t\tcursorVerticalOffset <= mouseVerticalOffset\n\t\t\t\t\t&& mouseVerticalOffset <= cursorVerticalOffset + d.height\n\t\t\t\t) {\n\t\t\t\t\treturn request.fulfillContentText(d.position, null, { mightBeForeignElement: false, injectedText: null });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestViewZone(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tconst viewZoneData = ctx.getZoneAtCoord(request.mouseVerticalOffset);\n\t\tif (viewZoneData) {\n\t\t\tconst mouseTargetType = (request.isInContentArea ? MouseTargetType.CONTENT_VIEW_ZONE : MouseTargetType.GUTTER_VIEW_ZONE);\n\t\t\treturn request.fulfillViewZone(mouseTargetType, viewZoneData.position, viewZoneData);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestTextArea(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it the textarea?\n\t\tif (ElementPath.isTextArea(request.targetPath)) {\n\t\t\tif (ctx.lastRenderData.lastTextareaPosition) {\n\t\t\t\treturn request.fulfillContentText(ctx.lastRenderData.lastTextareaPosition, null, { mightBeForeignElement: false, injectedText: null });\n\t\t\t}\n\t\t\treturn request.fulfillTextarea();\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestMargin(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (request.isInMarginArea) {\n\t\t\tconst res = ctx.getFullLineRangeAtCoord(request.mouseVerticalOffset);\n\t\t\tconst pos = res.range.getStartPosition();\n\t\t\tlet offset = Math.abs(request.relativePos.x);\n\t\t\tconst detail: Mutable<IMouseTargetMarginData> = {\n\t\t\t\tisAfterLines: res.isAfterLines,\n\t\t\t\tglyphMarginLeft: ctx.layoutInfo.glyphMarginLeft,\n\t\t\t\tglyphMarginWidth: ctx.layoutInfo.glyphMarginWidth,\n\t\t\t\tlineNumbersWidth: ctx.layoutInfo.lineNumbersWidth,\n\t\t\t\toffsetX: offset\n\t\t\t};\n\n\t\t\toffset -= ctx.layoutInfo.glyphMarginLeft;\n\n\t\t\tif (offset <= ctx.layoutInfo.glyphMarginWidth) {\n\t\t\t\t// On the glyph margin\n\t\t\t\tconst modelCoordinate = ctx.viewModel.coordinatesConverter.convertViewPositionToModelPosition(res.range.getStartPosition());\n\t\t\t\tconst lanes = ctx.viewModel.glyphLanes.getLanesAtLine(modelCoordinate.lineNumber);\n\t\t\t\tdetail.glyphMarginLane = lanes[Math.floor(offset / ctx.lineHeight)];\n\t\t\t\treturn request.fulfillMargin(MouseTargetType.GUTTER_GLYPH_MARGIN, pos, res.range, detail);\n\t\t\t}\n\t\t\toffset -= ctx.layoutInfo.glyphMarginWidth;\n\n\t\t\tif (offset <= ctx.layoutInfo.lineNumbersWidth) {\n\t\t\t\t// On the line numbers\n\t\t\t\treturn request.fulfillMargin(MouseTargetType.GUTTER_LINE_NUMBERS, pos, res.range, detail);\n\t\t\t}\n\t\t\toffset -= ctx.layoutInfo.lineNumbersWidth;\n\n\t\t\t// On the line decorations\n\t\t\treturn request.fulfillMargin(MouseTargetType.GUTTER_LINE_DECORATIONS, pos, res.range, detail);\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestViewLines(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (!ElementPath.isChildOfViewLines(request.targetPath)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (ctx.isInTopPadding(request.mouseVerticalOffset)) {\n\t\t\treturn request.fulfillContentEmpty(new Position(1, 1), EMPTY_CONTENT_AFTER_LINES);\n\t\t}\n\n\t\t// Check if it is below any lines and any view zones\n\t\tif (ctx.isAfterLines(request.mouseVerticalOffset) || ctx.isInBottomPadding(request.mouseVerticalOffset)) {\n\t\t\t// This most likely indicates it happened after the last view-line\n\t\t\tconst lineCount = ctx.viewModel.getLineCount();\n\t\t\tconst maxLineColumn = ctx.viewModel.getLineMaxColumn(lineCount);\n\t\t\treturn request.fulfillContentEmpty(new Position(lineCount, maxLineColumn), EMPTY_CONTENT_AFTER_LINES);\n\t\t}\n\n\t\t// Check if we are hitting a view-line (can happen in the case of inline decorations on empty lines)\n\t\t// See https://github.com/microsoft/vscode/issues/46942\n\t\tif (ElementPath.isStrictChildOfViewLines(request.targetPath)) {\n\t\t\tconst lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\tconst lineLength = ctx.viewModel.getLineLength(lineNumber);\n\t\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\t\t\tif (lineLength === 0) {\n\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\treturn request.fulfillContentEmpty(new Position(lineNumber, 1), detail);\n\t\t\t}\n\n\t\t\tconst isRtl = ctx.isRtl(lineNumber);\n\t\t\tif (isRtl) {\n\t\t\t\tif (request.mouseContentHorizontalOffset + lineWidth <= ctx.layoutInfo.contentWidth - ctx.layoutInfo.verticalScrollbarWidth) {\n\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t\t}\n\t\t\t} else if (request.mouseContentHorizontalOffset >= lineWidth) {\n\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t}\n\t\t} else {\n\t\t\tif (ctx.viewLinesGpu) {\n\t\t\t\tconst lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\t\tif (ctx.viewModel.getLineLength(lineNumber) === 0) {\n\t\t\t\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\treturn request.fulfillContentEmpty(new Position(lineNumber, 1), detail);\n\t\t\t\t}\n\n\t\t\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\t\t\t\tconst isRtl = ctx.isRtl(lineNumber);\n\t\t\t\tif (isRtl) {\n\t\t\t\t\tif (request.mouseContentHorizontalOffset + lineWidth <= ctx.layoutInfo.contentWidth - ctx.layoutInfo.verticalScrollbarWidth) {\n\t\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t\t\t}\n\t\t\t\t} else if (request.mouseContentHorizontalOffset >= lineWidth) {\n\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t\t}\n\n\t\t\t\tconst position = ctx.viewLinesGpu.getPositionAtCoordinate(lineNumber, request.mouseContentHorizontalOffset);\n\t\t\t\tif (position) {\n\t\t\t\t\tconst detail: IMouseTargetContentTextData = {\n\t\t\t\t\t\tinjectedText: null,\n\t\t\t\t\t\tmightBeForeignElement: false\n\t\t\t\t\t};\n\t\t\t\t\treturn request.fulfillContentText(position, EditorRange.fromPositions(position, position), detail);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Do the hit test (if not already done)\n\t\tconst hitTestResult = request.hitTestResult.value;\n\n\t\tif (hitTestResult.type === HitTestResultType.Content) {\n\t\t\treturn MouseTargetFactory.createMouseTargetFromHitTestPosition(ctx, request, hitTestResult.spanNode, hitTestResult.position, hitTestResult.injectedText);\n\t\t}\n\n\t\t// We didn't hit content...\n\t\tif (request.wouldBenefitFromHitTestTargetSwitch) {\n\t\t\t// We actually hit something different... Give it one last change by trying again with this new target\n\t\t\trequest.switchToHitTestTarget();\n\t\t\treturn this._createMouseTarget(ctx, request);\n\t\t}\n\n\t\t// We have tried everything...\n\t\treturn request.fulfillUnknown();\n\t}\n\n\tprivate static _hitTestMinimap(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (ElementPath.isChildOfMinimap(request.targetPath)) {\n\t\t\tconst possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\tconst maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber);\n\t\t\treturn request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn));\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestScrollbarSlider(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (ElementPath.isChildOfScrollableElement(request.targetPath)) {\n\t\t\tif (request.target && request.target.nodeType === 1) {\n\t\t\t\tconst className = request.target.className;\n\t\t\t\tif (className && /\\b(slider|scrollbar)\\b/.test(className)) {\n\t\t\t\t\tconst possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\t\t\tconst maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber);\n\t\t\t\t\treturn request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestScrollbar(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it the overview ruler?\n\t\t// Is it a child of the scrollable element?\n\t\tif (ElementPath.isChildOfScrollableElement(request.targetPath)) {\n\t\t\tconst possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\tconst maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber);\n\t\t\treturn request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn));\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic getMouseColumn(relativePos: CoordinatesRelativeToEditor): number {\n\t\tconst options = this._context.configuration.options;\n\t\tconst layoutInfo = options.get(EditorOption.layoutInfo);\n\t\tconst mouseContentHorizontalOffset = this._context.viewLayout.getCurrentScrollLeft() + relativePos.x - layoutInfo.contentLeft;\n\t\treturn MouseTargetFactory._getMouseColumn(mouseContentHorizontalOffset, options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth);\n\t}\n\n\tpublic static _getMouseColumn(mouseContentHorizontalOffset: number, typicalHalfwidthCharacterWidth: number): number {\n\t\tif (mouseContentHorizontalOffset < 0) {\n\t\t\treturn 1;\n\t\t}\n\t\tconst chars = Math.round(mouseContentHorizontalOffset / typicalHalfwidthCharacterWidth);\n\t\treturn (chars + 1);\n\t}\n\n\tprivate static createMouseTargetFromHitTestPosition(ctx: HitTestContext, request: HitTestRequest, spanNode: HTMLElement, pos: Position, injectedText: InjectedText | null): IMouseTarget {\n\t\tconst lineNumber = pos.lineNumber;\n\t\tconst column = pos.column;\n\n\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\n\t\tif (request.mouseContentHorizontalOffset > lineWidth) {\n\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t}\n\n\t\tconst visibleRange = ctx.visibleRangeForPosition(lineNumber, column);\n\n\t\tif (!visibleRange) {\n\t\t\treturn request.fulfillUnknown(pos);\n\t\t}\n\n\t\tconst columnHorizontalOffset = visibleRange.left;\n\n\t\tif (Math.abs(request.mouseContentHorizontalOffset - columnHorizontalOffset) < 1) {\n\t\t\treturn request.fulfillContentText(pos, null, { mightBeForeignElement: !!injectedText, injectedText });\n\t\t}\n\n\t\t// Let's define a, b, c and check if the offset is in between them...\n\t\tinterface OffsetColumn { offset: number; column: number }\n\n\t\tconst points: OffsetColumn[] = [];\n\t\tpoints.push({ offset: visibleRange.left, column: column });\n\t\tif (column > 1) {\n\t\t\tconst visibleRange = ctx.visibleRangeForPosition(lineNumber, column - 1);\n\t\t\tif (visibleRange) {\n\t\t\t\tpoints.push({ offset: visibleRange.left, column: column - 1 });\n\t\t\t}\n\t\t}\n\t\tconst lineMaxColumn = ctx.viewModel.getLineMaxColumn(lineNumber);\n\t\tif (column < lineMaxColumn) {\n\t\t\tconst visibleRange = ctx.visibleRangeForPosition(lineNumber, column + 1);\n\t\t\tif (visibleRange) {\n\t\t\t\tpoints.push({ offset: visibleRange.left, column: column + 1 });\n\t\t\t}\n\t\t}\n\n\t\tpoints.sort((a, b) => a.offset - b.offset);\n\n\t\tconst mouseCoordinates = request.pos.toClientCoordinates(dom.getWindow(ctx.viewDomNode));\n\t\tconst spanNodeClientRect = spanNode.getBoundingClientRect();\n\t\tconst mouseIsOverSpanNode = (spanNodeClientRect.left <= mouseCoordinates.clientX && mouseCoordinates.clientX <= spanNodeClientRect.right);\n\n\t\tlet rng: EditorRange | null = null;\n\n\t\tfor (let i = 1; i < points.length; i++) {\n\t\t\tconst prev = points[i - 1];\n\t\t\tconst curr = points[i];\n\t\t\tif (prev.offset <= request.mouseContentHorizontalOffset && request.mouseContentHorizontalOffset <= curr.offset) {\n\t\t\t\trng = new EditorRange(lineNumber, prev.column, lineNumber, curr.column);\n\n\t\t\t\t// See https://github.com/microsoft/vscode/issues/152819\n\t\t\t\t// Due to the use of zwj, the browser's hit test result is skewed towards the left\n\t\t\t\t// Here we try to correct that if the mouse horizontal offset is closer to the right than the left\n\n\t\t\t\tconst prevDelta = Math.abs(prev.offset - request.mouseContentHorizontalOffset);\n\t\t\t\tconst nextDelta = Math.abs(curr.offset - request.mouseContentHorizontalOffset);\n\n\t\t\t\tpos = (\n\t\t\t\t\tprevDelta < nextDelta\n\t\t\t\t\t\t? new Position(lineNumber, prev.column)\n\t\t\t\t\t\t: new Position(lineNumber, curr.column)\n\t\t\t\t);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn request.fulfillContentText(pos, rng, { mightBeForeignElement: !mouseIsOverSpanNode || !!injectedText, injectedText });\n\t}\n\n\t/**\n\t * Most probably WebKit browsers and Edge\n\t */\n\tprivate static _doHitTestWithCaretRangeFromPoint(ctx: HitTestContext, request: BareHitTestRequest): HitTestResult {\n\n\t\t// In Chrome, especially on Linux it is possible to click between lines,\n\t\t// so try to adjust the `hity` below so that it lands in the center of a line\n\t\tconst lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\tconst lineStartVerticalOffset = ctx.getVerticalOffsetForLineNumber(lineNumber);\n\t\tconst lineEndVerticalOffset = lineStartVerticalOffset + ctx.lineHeight;\n\n\t\tconst isBelowLastLine = (\n\t\t\tlineNumber === ctx.viewModel.getLineCount()\n\t\t\t&& request.mouseVerticalOffset > lineEndVerticalOffset\n\t\t);\n\n\t\tif (!isBelowLastLine) {\n\t\t\tconst lineCenteredVerticalOffset = Math.floor((lineStartVerticalOffset + lineEndVerticalOffset) / 2);\n\t\t\tlet adjustedPageY = request.pos.y + (lineCenteredVerticalOffset - request.mouseVerticalOffset);\n\n\t\t\tif (adjustedPageY <= request.editorPos.y) {\n\t\t\t\tadjustedPageY = request.editorPos.y + 1;\n\t\t\t}\n\t\t\tif (adjustedPageY >= request.editorPos.y + request.editorPos.height) {\n\t\t\t\tadjustedPageY = request.editorPos.y + request.editorPos.height - 1;\n\t\t\t}\n\n\t\t\tconst adjustedPage = new PageCoordinates(request.pos.x, adjustedPageY);\n\n\t\t\tconst r = this._actualDoHitTestWithCaretRangeFromPoint(ctx, adjustedPage.toClientCoordinates(dom.getWindow(ctx.viewDomNode)));\n\t\t\tif (r.type === HitTestResultType.Content) {\n\t\t\t\treturn r;\n\t\t\t}\n\t\t}\n\n\t\t// Also try to hit test without the adjustment (for the edge cases that we are near the top or bottom)\n\t\treturn this._actualDoHitTestWithCaretRangeFromPoint(ctx, request.pos.toClientCoordinates(dom.getWindow(ctx.viewDomNode)));\n\t}\n\n\tprivate static _actualDoHitTestWithCaretRangeFromPoint(ctx: HitTestContext, coords: ClientCoordinates): HitTestResult {\n\t\tconst shadowRoot = dom.getShadowRoot(ctx.viewDomNode);\n\t\tlet range: Range;\n\t\tif (shadowRoot) {\n\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t\tif (typeof (<any>shadowRoot).caretRangeFromPoint === 'undefined') {\n\t\t\t\trange = shadowCaretRangeFromPoint(shadowRoot, coords.clientX, coords.clientY);\n\t\t\t} else {\n\t\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t\t\trange = (<any>shadowRoot).caretRangeFromPoint(coords.clientX, coords.clientY);\n\t\t\t}\n\t\t} else {\n\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t\trange = (<any>ctx.viewDomNode.ownerDocument).caretRangeFromPoint(coords.clientX, coords.clientY);\n\t\t}\n\n\t\tif (!range || !range.startContainer) {\n\t\t\treturn new UnknownHitTestResult();\n\t\t}\n\n\t\t// Chrome always hits a TEXT_NODE, while Edge sometimes hits a token span\n\t\tconst startContainer = range.startContainer;\n\n\t\tif (startContainer.nodeType === startContainer.TEXT_NODE) {\n\t\t\t// startContainer is expected to be the token text\n\t\t\tconst parent1 = startContainer.parentNode; // expected to be the token span\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null; // expected to be the view line container span\n\t\t\tconst parent3 = parent2 ? parent2.parentNode : null; // expected to be the view line div\n\t\t\tconst parent3ClassName = parent3 && parent3.nodeType === parent3.ELEMENT_NODE ? (<HTMLElement>parent3).className : null;\n\n\t\t\tif (parent3ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>parent1, range.startOffset);\n\t\t\t} else {\n\t\t\t\treturn new UnknownHitTestResult(<HTMLElement>startContainer.parentNode);\n\t\t\t}\n\t\t} else if (startContainer.nodeType === startContainer.ELEMENT_NODE) {\n\t\t\t// startContainer is expected to be the token span\n\t\t\tconst parent1 = startContainer.parentNode; // expected to be the view line container span\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null; // expected to be the view line div\n\t\t\tconst parent2ClassName = parent2 && parent2.nodeType === parent2.ELEMENT_NODE ? (<HTMLElement>parent2).className : null;\n\n\t\t\tif (parent2ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>startContainer, (<HTMLElement>startContainer).textContent!.length);\n\t\t\t} else {\n\t\t\t\treturn new UnknownHitTestResult(<HTMLElement>startContainer);\n\t\t\t}\n\t\t}\n\n\t\treturn new UnknownHitTestResult();\n\t}\n\n\t/**\n\t * Most probably Gecko\n\t */\n\tprivate static _doHitTestWithCaretPositionFromPoint(ctx: HitTestContext, coords: ClientCoordinates): HitTestResult {\n\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\tconst hitResult: { offsetNode: Node; offset: number } = (<any>ctx.viewDomNode.ownerDocument).caretPositionFromPoint(coords.clientX, coords.clientY);\n\n\t\tif (hitResult.offsetNode.nodeType === hitResult.offsetNode.TEXT_NODE) {\n\t\t\t// offsetNode is expected to be the token text\n\t\t\tconst parent1 = hitResult.offsetNode.parentNode; // expected to be the token span\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null; // expected to be the view line container span\n\t\t\tconst parent3 = parent2 ? parent2.parentNode : null; // expected to be the view line div\n\t\t\tconst parent3ClassName = parent3 && parent3.nodeType === parent3.ELEMENT_NODE ? (<HTMLElement>parent3).className : null;\n\n\t\t\tif (parent3ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>hitResult.offsetNode.parentNode, hitResult.offset);\n\t\t\t} else {\n\t\t\t\treturn new UnknownHitTestResult(<HTMLElement>hitResult.offsetNode.parentNode);\n\t\t\t}\n\t\t}\n\n\t\t// For inline decorations, Gecko sometimes returns the `<span>` of the line and the offset is the `<span>` with the inline decoration\n\t\t// Some other times, it returns the `<span>` with the inline decoration\n\t\tif (hitResult.offsetNode.nodeType === hitResult.offsetNode.ELEMENT_NODE) {\n\t\t\tconst parent1 = hitResult.offsetNode.parentNode;\n\t\t\tconst parent1ClassName = parent1 && parent1.nodeType === parent1.ELEMENT_NODE ? (<HTMLElement>parent1).className : null;\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null;\n\t\t\tconst parent2ClassName = parent2 && parent2.nodeType === parent2.ELEMENT_NODE ? (<HTMLElement>parent2).className : null;\n\n\t\t\tif (parent1ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\t// it returned the `<span>` of the line and the offset is the `<span>` with the inline decoration\n\t\t\t\tconst tokenSpan = hitResult.offsetNode.childNodes[Math.min(hitResult.offset, hitResult.offsetNode.childNodes.length - 1)];\n\t\t\t\tif (tokenSpan) {\n\t\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>tokenSpan, 0);\n\t\t\t\t}\n\t\t\t} else if (parent2ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\t// it returned the `<span>` with the inline decoration\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>hitResult.offsetNode, 0);\n\t\t\t}\n\t\t}\n\n\t\treturn new UnknownHitTestResult(<HTMLElement>hitResult.offsetNode);\n\t}\n\n\tprivate static _snapToSoftTabBoundary(position: Position, viewModel: IViewModel): Position {\n\t\tconst lineContent = viewModel.getLineContent(position.lineNumber);\n\t\tconst { tabSize } = viewModel.model.getOptions();\n\t\tconst newPosition = AtomicTabMoveOperations.atomicPosition(lineContent, position.column - 1, tabSize, Direction.Nearest);\n\t\tif (newPosition !== -1) {\n\t\t\treturn new Position(position.lineNumber, newPosition + 1);\n\t\t}\n\t\treturn position;\n\t}\n\n\tpublic static doHitTest(ctx: HitTestContext, request: BareHitTestRequest): HitTestResult {\n\n\t\tlet result: HitTestResult = new UnknownHitTestResult();\n\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\tif (typeof (<any>ctx.viewDomNode.ownerDocument).caretRangeFromPoint === 'function') {\n\t\t\tresult = this._doHitTestWithCaretRangeFromPoint(ctx, request);\n\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t} else if ((<any>ctx.viewDomNode.ownerDocument).caretPositionFromPoint) {\n\t\t\tresult = this._doHitTestWithCaretPositionFromPoint(ctx, request.pos.toClientCoordinates(dom.getWindow(ctx.viewDomNode)));\n\t\t}\n\t\tif (result.type === HitTestResultType.Content) {\n\t\t\tconst injectedText = ctx.viewModel.getInjectedTextAt(result.position);\n\n\t\t\tconst normalizedPosition = ctx.viewModel.normalizePosition(result.position, PositionAffinity.None);\n\t\t\tif (injectedText || !normalizedPosition.equals(result.position)) {\n\t\t\t\tresult = new ContentHitTestResult(normalizedPosition, result.spanNode, injectedText);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n}\n\nfunction shadowCaretRangeFromPoint(shadowRoot: ShadowRoot, x: number, y: number): Range {\n\tconst range = document.createRange();\n\n\t// Get the element under the point\n\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\tlet el: HTMLElement | null = (<any>shadowRoot).elementFromPoint(x, y);\n\t// When el is not null, it may be div.monaco-mouse-cursor-text Element, which has not childNodes, we don't need to handle it.\n\tif (el?.hasChildNodes()) {\n\t\t// Get the last child of the element until its firstChild is a text node\n\t\t// This assumes that the pointer is on the right of the line, out of the tokens\n\t\t// and that we want to get the offset of the last token of the line\n\t\twhile (el && el.firstChild && el.firstChild.nodeType !== el.firstChild.TEXT_NODE && el.lastChild && el.lastChild.firstChild) {\n\t\t\tel = <HTMLElement>el.lastChild;\n\t\t}\n\n\t\t// Grab its rect\n\t\tconst rect = el.getBoundingClientRect();\n\n\t\t// And its font (the computed shorthand font property might be empty, see #3217)\n\t\tconst elWindow = dom.getWindow(el);\n\t\tconst fontStyle = elWindow.getComputedStyle(el, null).getPropertyValue('font-style');\n\t\tconst fontVariant = elWindow.getComputedStyle(el, null).getPropertyValue('font-variant');\n\t\tconst fontWeight = elWindow.getComputedStyle(el, null).getPropertyValue('font-weight');\n\t\tconst fontSize = elWindow.getComputedStyle(el, null).getPropertyValue('font-size');\n\t\tconst lineHeight = elWindow.getComputedStyle(el, null).getPropertyValue('line-height');\n\t\tconst fontFamily = elWindow.getComputedStyle(el, null).getPropertyValue('font-family');\n\t\tconst font = `${fontStyle} ${fontVariant} ${fontWeight} ${fontSize}/${lineHeight} ${fontFamily}`;\n\n\t\t// And also its txt content\n\t\tconst text = el.innerText;\n\n\t\t// Position the pixel cursor at the left of the element\n\t\tlet pixelCursor = rect.left;\n\t\tlet offset = 0;\n\t\tlet step: number;\n\n\t\t// If the point is on the right of the box put the cursor after the last character\n\t\tif (x > rect.left + rect.width) {\n\t\t\toffset = text.length;\n\t\t} else {\n\t\t\tconst charWidthReader = CharWidthReader.getInstance();\n\t\t\t// Goes through all the characters of the innerText, and checks if the x of the point\n\t\t\t// belongs to the character.\n\t\t\tfor (let i = 0; i < text.length + 1; i++) {\n\t\t\t\t// The step is half the width of the character\n\t\t\t\tstep = charWidthReader.getCharWidth(text.charAt(i), font) / 2;\n\t\t\t\t// Move to the center of the character\n\t\t\t\tpixelCursor += step;\n\t\t\t\t// If the x of the point is smaller that the position of the cursor, the point is over that character\n\t\t\t\tif (x < pixelCursor) {\n\t\t\t\t\toffset = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// Move between the current character and the next\n\t\t\t\tpixelCursor += step;\n\t\t\t}\n\t\t}\n\n\t\t// Creates a range with the text node of the element and set the offset found\n\t\trange.setStart(el.firstChild!, offset);\n\t\trange.setEnd(el.firstChild!, offset);\n\t}\n\n\treturn range;\n}\n\nclass CharWidthReader {\n\tprivate static _INSTANCE: CharWidthReader | null = null;\n\n\tpublic static getInstance(): CharWidthReader {\n\t\tif (!CharWidthReader._INSTANCE) {\n\t\t\tCharWidthReader._INSTANCE = new CharWidthReader();\n\t\t}\n\t\treturn CharWidthReader._INSTANCE;\n\t}\n\n\tprivate readonly _cache: { [cacheKey: string]: number };\n\tprivate readonly _canvas: HTMLCanvasElement;\n\n\tprivate constructor() {\n\t\tthis._cache = {};\n\t\tthis._canvas = document.createElement('canvas');\n\t}\n\n\tpublic getCharWidth(char: string, font: string): number {\n\t\tconst cacheKey = char + font;\n\t\tif (this._cache[cacheKey]) {\n\t\t\treturn this._cache[cacheKey];\n\t\t}\n\n\t\tconst context = this._canvas.getContext('2d')!;\n\t\tcontext.font = font;\n\t\tconst metrics = context.measureText(char);\n\t\tconst width = metrics.width;\n\t\tthis._cache[cacheKey] = width;\n\t\treturn width;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/browser/controller/mouseTarget.ts","vs/editor/browser/controller/mouseTarget.ts"],"names":[],"mappings":"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","file":"mouseTarget.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 { IPointerHandlerHelper } from './mouseHandler.js';\nimport { IMouseTargetContentEmptyData, IMouseTargetMarginData, IMouseTarget, IMouseTargetContentEmpty, IMouseTargetContentText, IMouseTargetContentWidget, IMouseTargetMargin, IMouseTargetOutsideEditor, IMouseTargetOverlayWidget, IMouseTargetScrollbar, IMouseTargetTextarea, IMouseTargetUnknown, IMouseTargetViewZone, IMouseTargetContentTextData, IMouseTargetViewZoneData, MouseTargetType } from '../editorBrowser.js';\nimport { ClientCoordinates, EditorMouseEvent, EditorPagePosition, PageCoordinates, CoordinatesRelativeToEditor } from '../editorDom.js';\nimport { PartFingerprint, PartFingerprints } from '../view/viewPart.js';\nimport { ViewLine } from '../viewParts/viewLines/viewLine.js';\nimport { IViewCursorRenderData } from '../viewParts/viewCursors/viewCursor.js';\nimport { EditorLayoutInfo, EditorOption } from '../../common/config/editorOptions.js';\nimport { Position } from '../../common/core/position.js';\nimport { Range as EditorRange } from '../../common/core/range.js';\nimport { HorizontalPosition } from '../view/renderingContext.js';\nimport { ViewContext } from '../../common/viewModel/viewContext.js';\nimport { IViewModel } from '../../common/viewModel.js';\nimport { CursorColumns } from '../../common/core/cursorColumns.js';\nimport * as dom from '../../../base/browser/dom.js';\nimport { AtomicTabMoveOperations, Direction } from '../../common/cursor/cursorAtomicMoveOperations.js';\nimport { PositionAffinity, TextDirection } from '../../common/model.js';\nimport { InjectedText } from '../../common/modelLineProjectionData.js';\nimport { Mutable } from '../../../base/common/types.js';\nimport { Lazy } from '../../../base/common/lazy.js';\nimport { ViewLinesGpu } from '../viewParts/viewLinesGpu/viewLinesGpu.js';\n\nconst enum HitTestResultType {\n\tUnknown,\n\tContent,\n}\n\nclass UnknownHitTestResult {\n\treadonly type = HitTestResultType.Unknown;\n\tconstructor(\n\t\treadonly hitTarget: HTMLElement | null = null\n\t) { }\n}\n\nclass ContentHitTestResult {\n\treadonly type = HitTestResultType.Content;\n\n\tget hitTarget(): HTMLElement { return this.spanNode; }\n\n\tconstructor(\n\t\treadonly position: Position,\n\t\treadonly spanNode: HTMLElement,\n\t\treadonly injectedText: InjectedText | null,\n\t) { }\n}\n\ntype HitTestResult = UnknownHitTestResult | ContentHitTestResult;\n\nnamespace HitTestResult {\n\texport function createFromDOMInfo(ctx: HitTestContext, spanNode: HTMLElement, offset: number): HitTestResult {\n\t\tconst position = ctx.getPositionFromDOMInfo(spanNode, offset);\n\t\tif (position) {\n\t\t\treturn new ContentHitTestResult(position, spanNode, null);\n\t\t}\n\t\treturn new UnknownHitTestResult(spanNode);\n\t}\n}\n\nexport class PointerHandlerLastRenderData {\n\tconstructor(\n\t\tpublic readonly lastViewCursorsRenderData: IViewCursorRenderData[],\n\t\tpublic readonly lastTextareaPosition: Position | null\n\t) { }\n}\n\nexport class MouseTarget {\n\n\tprivate static _deduceRage(position: Position): EditorRange;\n\tprivate static _deduceRage(position: Position, range: EditorRange | null): EditorRange;\n\tprivate static _deduceRage(position: Position | null): EditorRange | null;\n\tprivate static _deduceRage(position: Position | null, range: EditorRange | null = null): EditorRange | null {\n\t\tif (!range && position) {\n\t\t\treturn new EditorRange(position.lineNumber, position.column, position.lineNumber, position.column);\n\t\t}\n\t\treturn range ?? null;\n\t}\n\tpublic static createUnknown(element: HTMLElement | null, mouseColumn: number, position: Position | null): IMouseTargetUnknown {\n\t\treturn { type: MouseTargetType.UNKNOWN, element, mouseColumn, position, range: this._deduceRage(position) };\n\t}\n\tpublic static createTextarea(element: HTMLElement | null, mouseColumn: number): IMouseTargetTextarea {\n\t\treturn { type: MouseTargetType.TEXTAREA, element, mouseColumn, position: null, range: null };\n\t}\n\tpublic static createMargin(type: MouseTargetType.GUTTER_GLYPH_MARGIN | MouseTargetType.GUTTER_LINE_NUMBERS | MouseTargetType.GUTTER_LINE_DECORATIONS, element: HTMLElement | null, mouseColumn: number, position: Position, range: EditorRange, detail: IMouseTargetMarginData): IMouseTargetMargin {\n\t\treturn { type, element, mouseColumn, position, range, detail };\n\t}\n\tpublic static createViewZone(type: MouseTargetType.GUTTER_VIEW_ZONE | MouseTargetType.CONTENT_VIEW_ZONE, element: HTMLElement | null, mouseColumn: number, position: Position, detail: IMouseTargetViewZoneData): IMouseTargetViewZone {\n\t\treturn { type, element, mouseColumn, position, range: this._deduceRage(position), detail };\n\t}\n\tpublic static createContentText(element: HTMLElement | null, mouseColumn: number, position: Position, range: EditorRange | null, detail: IMouseTargetContentTextData): IMouseTargetContentText {\n\t\treturn { type: MouseTargetType.CONTENT_TEXT, element, mouseColumn, position, range: this._deduceRage(position, range), detail };\n\t}\n\tpublic static createContentEmpty(element: HTMLElement | null, mouseColumn: number, position: Position, detail: IMouseTargetContentEmptyData): IMouseTargetContentEmpty {\n\t\treturn { type: MouseTargetType.CONTENT_EMPTY, element, mouseColumn, position, range: this._deduceRage(position), detail };\n\t}\n\tpublic static createContentWidget(element: HTMLElement | null, mouseColumn: number, detail: string): IMouseTargetContentWidget {\n\t\treturn { type: MouseTargetType.CONTENT_WIDGET, element, mouseColumn, position: null, range: null, detail };\n\t}\n\tpublic static createScrollbar(element: HTMLElement | null, mouseColumn: number, position: Position): IMouseTargetScrollbar {\n\t\treturn { type: MouseTargetType.SCROLLBAR, element, mouseColumn, position, range: this._deduceRage(position) };\n\t}\n\tpublic static createOverlayWidget(element: HTMLElement | null, mouseColumn: number, detail: string): IMouseTargetOverlayWidget {\n\t\treturn { type: MouseTargetType.OVERLAY_WIDGET, element, mouseColumn, position: null, range: null, detail };\n\t}\n\tpublic static createOutsideEditor(mouseColumn: number, position: Position, outsidePosition: 'above' | 'below' | 'left' | 'right', outsideDistance: number): IMouseTargetOutsideEditor {\n\t\treturn { type: MouseTargetType.OUTSIDE_EDITOR, element: null, mouseColumn, position, range: this._deduceRage(position), outsidePosition, outsideDistance };\n\t}\n\n\tprivate static _typeToString(type: MouseTargetType): string {\n\t\tif (type === MouseTargetType.TEXTAREA) {\n\t\t\treturn 'TEXTAREA';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_GLYPH_MARGIN) {\n\t\t\treturn 'GUTTER_GLYPH_MARGIN';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_LINE_NUMBERS) {\n\t\t\treturn 'GUTTER_LINE_NUMBERS';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_LINE_DECORATIONS) {\n\t\t\treturn 'GUTTER_LINE_DECORATIONS';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_VIEW_ZONE) {\n\t\t\treturn 'GUTTER_VIEW_ZONE';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_TEXT) {\n\t\t\treturn 'CONTENT_TEXT';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_EMPTY) {\n\t\t\treturn 'CONTENT_EMPTY';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_VIEW_ZONE) {\n\t\t\treturn 'CONTENT_VIEW_ZONE';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_WIDGET) {\n\t\t\treturn 'CONTENT_WIDGET';\n\t\t}\n\t\tif (type === MouseTargetType.OVERVIEW_RULER) {\n\t\t\treturn 'OVERVIEW_RULER';\n\t\t}\n\t\tif (type === MouseTargetType.SCROLLBAR) {\n\t\t\treturn 'SCROLLBAR';\n\t\t}\n\t\tif (type === MouseTargetType.OVERLAY_WIDGET) {\n\t\t\treturn 'OVERLAY_WIDGET';\n\t\t}\n\t\treturn 'UNKNOWN';\n\t}\n\n\tpublic static toString(target: IMouseTarget): string {\n\t\treturn this._typeToString(target.type) + ': ' + target.position + ' - ' + target.range + ' - ' + JSON.stringify((target as unknown as Record<string, unknown>).detail);\n\t}\n}\n\nclass ElementPath {\n\n\tpublic static isTextArea(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length === 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.TextArea\n\t\t);\n\t}\n\n\tpublic static isChildOfViewLines(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 4\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[3] === PartFingerprint.ViewLines\n\t\t);\n\t}\n\n\tpublic static isStrictChildOfViewLines(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length > 4\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[3] === PartFingerprint.ViewLines\n\t\t);\n\t}\n\n\tpublic static isChildOfScrollableElement(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.ScrollableElement\n\t\t);\n\t}\n\n\tpublic static isChildOfMinimap(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.Minimap\n\t\t);\n\t}\n\n\tpublic static isChildOfContentWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 4\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[3] === PartFingerprint.ContentWidgets\n\t\t);\n\t}\n\n\tpublic static isChildOfOverflowGuard(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 1\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t);\n\t}\n\n\tpublic static isChildOfOverflowingContentWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 1\n\t\t\t&& path[0] === PartFingerprint.OverflowingContentWidgets\n\t\t);\n\t}\n\n\tpublic static isChildOfOverlayWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.OverlayWidgets\n\t\t);\n\t}\n\n\tpublic static isChildOfOverflowingOverlayWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 1\n\t\t\t&& path[0] === PartFingerprint.OverflowingOverlayWidgets\n\t\t);\n\t}\n}\n\nexport class HitTestContext {\n\n\tpublic readonly viewModel: IViewModel;\n\tpublic readonly layoutInfo: EditorLayoutInfo;\n\tpublic readonly viewDomNode: HTMLElement;\n\tpublic readonly viewLinesGpu: ViewLinesGpu | undefined;\n\tpublic readonly lineHeight: number;\n\tpublic readonly stickyTabStops: boolean;\n\tpublic readonly typicalHalfwidthCharacterWidth: number;\n\tpublic readonly lastRenderData: PointerHandlerLastRenderData;\n\n\tprivate readonly _context: ViewContext;\n\tprivate readonly _viewHelper: IPointerHandlerHelper;\n\n\tconstructor(context: ViewContext, viewHelper: IPointerHandlerHelper, lastRenderData: PointerHandlerLastRenderData) {\n\t\tthis.viewModel = context.viewModel;\n\t\tconst options = context.configuration.options;\n\t\tthis.layoutInfo = options.get(EditorOption.layoutInfo);\n\t\tthis.viewDomNode = viewHelper.viewDomNode;\n\t\tthis.viewLinesGpu = viewHelper.viewLinesGpu;\n\t\tthis.lineHeight = options.get(EditorOption.lineHeight);\n\t\tthis.stickyTabStops = options.get(EditorOption.stickyTabStops);\n\t\tthis.typicalHalfwidthCharacterWidth = options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth;\n\t\tthis.lastRenderData = lastRenderData;\n\t\tthis._context = context;\n\t\tthis._viewHelper = viewHelper;\n\t}\n\n\tpublic getZoneAtCoord(mouseVerticalOffset: number): IMouseTargetViewZoneData | null {\n\t\treturn HitTestContext.getZoneAtCoord(this._context, mouseVerticalOffset);\n\t}\n\n\tpublic static getZoneAtCoord(context: ViewContext, mouseVerticalOffset: number): IMouseTargetViewZoneData | null {\n\t\t// The target is either a view zone or the empty space after the last view-line\n\t\tconst viewZoneWhitespace = context.viewLayout.getWhitespaceAtVerticalOffset(mouseVerticalOffset);\n\n\t\tif (viewZoneWhitespace) {\n\t\t\tconst viewZoneMiddle = viewZoneWhitespace.verticalOffset + viewZoneWhitespace.height / 2;\n\t\t\tconst lineCount = context.viewModel.getLineCount();\n\t\t\tlet positionBefore: Position | null = null;\n\t\t\tlet position: Position | null;\n\t\t\tlet positionAfter: Position | null = null;\n\n\t\t\tif (viewZoneWhitespace.afterLineNumber !== lineCount) {\n\t\t\t\t// There are more lines after this view zone\n\t\t\t\tpositionAfter = new Position(viewZoneWhitespace.afterLineNumber + 1, 1);\n\t\t\t}\n\t\t\tif (viewZoneWhitespace.afterLineNumber > 0) {\n\t\t\t\t// There are more lines above this view zone\n\t\t\t\tpositionBefore = new Position(viewZoneWhitespace.afterLineNumber, context.viewModel.getLineMaxColumn(viewZoneWhitespace.afterLineNumber));\n\t\t\t}\n\n\t\t\tif (positionAfter === null) {\n\t\t\t\tposition = positionBefore;\n\t\t\t} else if (positionBefore === null) {\n\t\t\t\tposition = positionAfter;\n\t\t\t} else if (mouseVerticalOffset < viewZoneMiddle) {\n\t\t\t\tposition = positionBefore;\n\t\t\t} else {\n\t\t\t\tposition = positionAfter;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tviewZoneId: viewZoneWhitespace.id,\n\t\t\t\tafterLineNumber: viewZoneWhitespace.afterLineNumber,\n\t\t\t\tpositionBefore: positionBefore,\n\t\t\t\tpositionAfter: positionAfter,\n\t\t\t\tposition: position!\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic getFullLineRangeAtCoord(mouseVerticalOffset: number): { range: EditorRange; isAfterLines: boolean } {\n\t\tif (this._context.viewLayout.isAfterLines(mouseVerticalOffset)) {\n\t\t\t// Below the last line\n\t\t\tconst lineNumber = this._context.viewModel.getLineCount();\n\t\t\tconst maxLineColumn = this._context.viewModel.getLineMaxColumn(lineNumber);\n\t\t\treturn {\n\t\t\t\trange: new EditorRange(lineNumber, maxLineColumn, lineNumber, maxLineColumn),\n\t\t\t\tisAfterLines: true\n\t\t\t};\n\t\t}\n\n\t\tconst lineNumber = this._context.viewLayout.getLineNumberAtVerticalOffset(mouseVerticalOffset);\n\t\tconst maxLineColumn = this._context.viewModel.getLineMaxColumn(lineNumber);\n\t\treturn {\n\t\t\trange: new EditorRange(lineNumber, 1, lineNumber, maxLineColumn),\n\t\t\tisAfterLines: false\n\t\t};\n\t}\n\n\tpublic getLineNumberAtVerticalOffset(mouseVerticalOffset: number): number {\n\t\treturn this._context.viewLayout.getLineNumberAtVerticalOffset(mouseVerticalOffset);\n\t}\n\n\tpublic isAfterLines(mouseVerticalOffset: number): boolean {\n\t\treturn this._context.viewLayout.isAfterLines(mouseVerticalOffset);\n\t}\n\n\tpublic isInTopPadding(mouseVerticalOffset: number): boolean {\n\t\treturn this._context.viewLayout.isInTopPadding(mouseVerticalOffset);\n\t}\n\n\tpublic isInBottomPadding(mouseVerticalOffset: number): boolean {\n\t\treturn this._context.viewLayout.isInBottomPadding(mouseVerticalOffset);\n\t}\n\n\tpublic getVerticalOffsetForLineNumber(lineNumber: number): number {\n\t\treturn this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber);\n\t}\n\n\tpublic findAttribute(element: Element, attr: string): string | null {\n\t\treturn HitTestContext._findAttribute(element, attr, this._viewHelper.viewDomNode);\n\t}\n\n\tprivate static _findAttribute(element: Element, attr: string, stopAt: Element): string | null {\n\t\twhile (element && element !== element.ownerDocument.body) {\n\t\t\tif (element.hasAttribute && element.hasAttribute(attr)) {\n\t\t\t\treturn element.getAttribute(attr);\n\t\t\t}\n\t\t\tif (element === stopAt) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\telement = <Element>element.parentNode;\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic getLineWidth(lineNumber: number): number {\n\t\treturn this._viewHelper.getLineWidth(lineNumber);\n\t}\n\n\tpublic isRtl(lineNumber: number): boolean {\n\t\treturn this.viewModel.getTextDirection(lineNumber) === TextDirection.RTL;\n\n\t}\n\n\tpublic visibleRangeForPosition(lineNumber: number, column: number): HorizontalPosition | null {\n\t\treturn this._viewHelper.visibleRangeForPosition(lineNumber, column);\n\t}\n\n\tpublic getPositionFromDOMInfo(spanNode: HTMLElement, offset: number): Position | null {\n\t\treturn this._viewHelper.getPositionFromDOMInfo(spanNode, offset);\n\t}\n\n\tpublic getCurrentScrollTop(): number {\n\t\treturn this._context.viewLayout.getCurrentScrollTop();\n\t}\n\n\tpublic getCurrentScrollLeft(): number {\n\t\treturn this._context.viewLayout.getCurrentScrollLeft();\n\t}\n}\n\nabstract class BareHitTestRequest {\n\n\tpublic readonly editorPos: EditorPagePosition;\n\tpublic readonly pos: PageCoordinates;\n\tpublic readonly relativePos: CoordinatesRelativeToEditor;\n\tpublic readonly mouseVerticalOffset: number;\n\tpublic readonly isInMarginArea: boolean;\n\tpublic readonly isInContentArea: boolean;\n\tpublic readonly mouseContentHorizontalOffset: number;\n\n\tprotected readonly mouseColumn: number;\n\n\tconstructor(ctx: HitTestContext, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor) {\n\t\tthis.editorPos = editorPos;\n\t\tthis.pos = pos;\n\t\tthis.relativePos = relativePos;\n\n\t\tthis.mouseVerticalOffset = Math.max(0, ctx.getCurrentScrollTop() + this.relativePos.y);\n\t\tthis.mouseContentHorizontalOffset = ctx.getCurrentScrollLeft() + this.relativePos.x - ctx.layoutInfo.contentLeft;\n\t\tthis.isInMarginArea = (this.relativePos.x < ctx.layoutInfo.contentLeft && this.relativePos.x >= ctx.layoutInfo.glyphMarginLeft);\n\t\tthis.isInContentArea = !this.isInMarginArea;\n\t\tthis.mouseColumn = Math.max(0, MouseTargetFactory._getMouseColumn(this.mouseContentHorizontalOffset, ctx.typicalHalfwidthCharacterWidth));\n\t}\n}\n\nclass HitTestRequest extends BareHitTestRequest {\n\tprivate readonly _ctx: HitTestContext;\n\tprivate readonly _eventTarget: HTMLElement | null;\n\tpublic readonly hitTestResult = new Lazy(() => MouseTargetFactory.doHitTest(this._ctx, this));\n\tprivate _useHitTestTarget: boolean;\n\tprivate _targetPathCacheElement: HTMLElement | null = null;\n\tprivate _targetPathCacheValue: Uint8Array = new Uint8Array(0);\n\n\tpublic get target(): HTMLElement | null {\n\t\tif (this._useHitTestTarget) {\n\t\t\treturn this.hitTestResult.value.hitTarget;\n\t\t}\n\t\treturn this._eventTarget;\n\t}\n\n\tpublic get targetPath(): Uint8Array {\n\t\tif (this._targetPathCacheElement !== this.target) {\n\t\t\tthis._targetPathCacheElement = this.target;\n\t\t\tthis._targetPathCacheValue = PartFingerprints.collect(this.target, this._ctx.viewDomNode);\n\t\t}\n\t\treturn this._targetPathCacheValue;\n\t}\n\n\tconstructor(ctx: HitTestContext, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor, eventTarget: HTMLElement | null) {\n\t\tsuper(ctx, editorPos, pos, relativePos);\n\t\tthis._ctx = ctx;\n\t\tthis._eventTarget = eventTarget;\n\n\t\t// If no event target is passed in, we will use the hit test target\n\t\tconst hasEventTarget = Boolean(this._eventTarget);\n\t\tthis._useHitTestTarget = !hasEventTarget;\n\t}\n\n\tpublic override toString(): string {\n\t\treturn `pos(${this.pos.x},${this.pos.y}), editorPos(${this.editorPos.x},${this.editorPos.y}), relativePos(${this.relativePos.x},${this.relativePos.y}), mouseVerticalOffset: ${this.mouseVerticalOffset}, mouseContentHorizontalOffset: ${this.mouseContentHorizontalOffset}\\n\\ttarget: ${this.target ? (<HTMLElement>this.target).outerHTML : null}`;\n\t}\n\n\tpublic get wouldBenefitFromHitTestTargetSwitch(): boolean {\n\t\treturn (\n\t\t\t!this._useHitTestTarget\n\t\t\t&& this.hitTestResult.value.hitTarget !== null\n\t\t\t&& this.target !== this.hitTestResult.value.hitTarget\n\t\t);\n\t}\n\n\tpublic switchToHitTestTarget(): void {\n\t\tthis._useHitTestTarget = true;\n\t}\n\n\tprivate _getMouseColumn(position: Position | null = null): number {\n\t\tif (position && position.column < this._ctx.viewModel.getLineMaxColumn(position.lineNumber)) {\n\t\t\t// Most likely, the line contains foreign decorations...\n\t\t\treturn CursorColumns.visibleColumnFromColumn(this._ctx.viewModel.getLineContent(position.lineNumber), position.column, this._ctx.viewModel.model.getOptions().tabSize) + 1;\n\t\t}\n\t\treturn this.mouseColumn;\n\t}\n\n\tpublic fulfillUnknown(position: Position | null = null): IMouseTargetUnknown {\n\t\treturn MouseTarget.createUnknown(this.target, this._getMouseColumn(position), position);\n\t}\n\tpublic fulfillTextarea(): IMouseTargetTextarea {\n\t\treturn MouseTarget.createTextarea(this.target, this._getMouseColumn());\n\t}\n\tpublic fulfillMargin(type: MouseTargetType.GUTTER_GLYPH_MARGIN | MouseTargetType.GUTTER_LINE_NUMBERS | MouseTargetType.GUTTER_LINE_DECORATIONS, position: Position, range: EditorRange, detail: IMouseTargetMarginData): IMouseTargetMargin {\n\t\treturn MouseTarget.createMargin(type, this.target, this._getMouseColumn(position), position, range, detail);\n\t}\n\tpublic fulfillViewZone(type: MouseTargetType.GUTTER_VIEW_ZONE | MouseTargetType.CONTENT_VIEW_ZONE, position: Position, detail: IMouseTargetViewZoneData): IMouseTargetViewZone {\n\t\t// Always return the usual mouse column for a view zone.\n\t\treturn MouseTarget.createViewZone(type, this.target, this._getMouseColumn(), position, detail);\n\t}\n\tpublic fulfillContentText(position: Position, range: EditorRange | null, detail: IMouseTargetContentTextData): IMouseTargetContentText {\n\t\treturn MouseTarget.createContentText(this.target, this._getMouseColumn(position), position, range, detail);\n\t}\n\tpublic fulfillContentEmpty(position: Position, detail: IMouseTargetContentEmptyData): IMouseTargetContentEmpty {\n\t\treturn MouseTarget.createContentEmpty(this.target, this._getMouseColumn(position), position, detail);\n\t}\n\tpublic fulfillContentWidget(detail: string): IMouseTargetContentWidget {\n\t\treturn MouseTarget.createContentWidget(this.target, this._getMouseColumn(), detail);\n\t}\n\tpublic fulfillScrollbar(position: Position): IMouseTargetScrollbar {\n\t\treturn MouseTarget.createScrollbar(this.target, this._getMouseColumn(position), position);\n\t}\n\tpublic fulfillOverlayWidget(detail: string): IMouseTargetOverlayWidget {\n\t\treturn MouseTarget.createOverlayWidget(this.target, this._getMouseColumn(), detail);\n\t}\n}\n\ninterface ResolvedHitTestRequest extends HitTestRequest {\n\treadonly target: HTMLElement;\n}\n\nconst EMPTY_CONTENT_AFTER_LINES: IMouseTargetContentEmptyData = { isAfterLines: true };\n\nfunction createEmptyContentDataInLines(horizontalDistanceToText: number): IMouseTargetContentEmptyData {\n\treturn {\n\t\tisAfterLines: false,\n\t\thorizontalDistanceToText: horizontalDistanceToText\n\t};\n}\n\nexport class MouseTargetFactory {\n\n\tprivate readonly _context: ViewContext;\n\tprivate readonly _viewHelper: IPointerHandlerHelper;\n\n\tconstructor(context: ViewContext, viewHelper: IPointerHandlerHelper) {\n\t\tthis._context = context;\n\t\tthis._viewHelper = viewHelper;\n\t}\n\n\tpublic mouseTargetIsWidget(e: EditorMouseEvent): boolean {\n\t\tconst t = <Element>e.target;\n\t\tconst path = PartFingerprints.collect(t, this._viewHelper.viewDomNode);\n\n\t\t// Is it a content widget?\n\t\tif (ElementPath.isChildOfContentWidgets(path) || ElementPath.isChildOfOverflowingContentWidgets(path)) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Is it an overlay widget?\n\t\tif (ElementPath.isChildOfOverlayWidgets(path) || ElementPath.isChildOfOverflowingOverlayWidgets(path)) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpublic createMouseTarget(lastRenderData: PointerHandlerLastRenderData, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor, target: HTMLElement | null): IMouseTarget {\n\t\tconst ctx = new HitTestContext(this._context, this._viewHelper, lastRenderData);\n\t\tconst request = new HitTestRequest(ctx, editorPos, pos, relativePos, target);\n\t\ttry {\n\t\t\tconst r = MouseTargetFactory._createMouseTarget(ctx, request);\n\n\t\t\tif (r.type === MouseTargetType.CONTENT_TEXT) {\n\t\t\t\t// Snap to the nearest soft tab boundary if atomic soft tabs are enabled.\n\t\t\t\tif (ctx.stickyTabStops && r.position !== null) {\n\t\t\t\t\tconst position = MouseTargetFactory._snapToSoftTabBoundary(r.position, ctx.viewModel);\n\t\t\t\t\tconst range = EditorRange.fromPositions(position, position).plusRange(r.range);\n\t\t\t\t\treturn request.fulfillContentText(position, range, r.detail);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// console.log(MouseTarget.toString(r));\n\t\t\treturn r;\n\t\t} catch (err) {\n\t\t\t// console.log(err);\n\t\t\treturn request.fulfillUnknown();\n\t\t}\n\t}\n\n\tprivate static _createMouseTarget(ctx: HitTestContext, request: HitTestRequest): IMouseTarget {\n\n\t\t// console.log(`${domHitTestExecuted ? '=>' : ''}CAME IN REQUEST: ${request}`);\n\n\t\tif (request.target === null) {\n\t\t\t// No target\n\t\t\treturn request.fulfillUnknown();\n\t\t}\n\n\t\t// we know for a fact that request.target is not null\n\t\tconst resolvedRequest = <ResolvedHitTestRequest>request;\n\n\t\tlet result: IMouseTarget | null = null;\n\n\t\tif (!ElementPath.isChildOfOverflowGuard(request.targetPath) && !ElementPath.isChildOfOverflowingContentWidgets(request.targetPath) && !ElementPath.isChildOfOverflowingOverlayWidgets(request.targetPath)) {\n\t\t\t// We only render dom nodes inside the overflow guard or in the overflowing content widgets\n\t\t\tresult = result || request.fulfillUnknown();\n\t\t}\n\n\t\tresult = result || MouseTargetFactory._hitTestContentWidget(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestOverlayWidget(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestMinimap(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestScrollbarSlider(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestViewZone(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestMargin(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestViewCursor(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestTextArea(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestViewLines(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestScrollbar(ctx, resolvedRequest);\n\n\t\treturn (result || request.fulfillUnknown());\n\t}\n\n\tprivate static _hitTestContentWidget(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it a content widget?\n\t\tif (ElementPath.isChildOfContentWidgets(request.targetPath) || ElementPath.isChildOfOverflowingContentWidgets(request.targetPath)) {\n\t\t\tconst widgetId = ctx.findAttribute(request.target, 'widgetId');\n\t\t\tif (widgetId) {\n\t\t\t\treturn request.fulfillContentWidget(widgetId);\n\t\t\t} else {\n\t\t\t\treturn request.fulfillUnknown();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestOverlayWidget(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it an overlay widget?\n\t\tif (ElementPath.isChildOfOverlayWidgets(request.targetPath) || ElementPath.isChildOfOverflowingOverlayWidgets(request.targetPath)) {\n\t\t\tconst widgetId = ctx.findAttribute(request.target, 'widgetId');\n\t\t\tif (widgetId) {\n\t\t\t\treturn request.fulfillOverlayWidget(widgetId);\n\t\t\t} else {\n\t\t\t\treturn request.fulfillUnknown();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestViewCursor(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\n\t\tif (request.target) {\n\t\t\t// Check if we've hit a painted cursor\n\t\t\tconst lastViewCursorsRenderData = ctx.lastRenderData.lastViewCursorsRenderData;\n\n\t\t\tfor (const d of lastViewCursorsRenderData) {\n\n\t\t\t\tif (request.target === d.domNode) {\n\t\t\t\t\treturn request.fulfillContentText(d.position, null, { mightBeForeignElement: false, injectedText: null });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (request.isInContentArea) {\n\t\t\t// Edge has a bug when hit-testing the exact position of a cursor,\n\t\t\t// instead of returning the correct dom node, it returns the\n\t\t\t// first or last rendered view line dom node, therefore help it out\n\t\t\t// and first check if we are on top of a cursor\n\n\t\t\tconst lastViewCursorsRenderData = ctx.lastRenderData.lastViewCursorsRenderData;\n\t\t\tconst mouseContentHorizontalOffset = request.mouseContentHorizontalOffset;\n\t\t\tconst mouseVerticalOffset = request.mouseVerticalOffset;\n\n\t\t\tfor (const d of lastViewCursorsRenderData) {\n\n\t\t\t\tif (mouseContentHorizontalOffset < d.contentLeft) {\n\t\t\t\t\t// mouse position is to the left of the cursor\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (mouseContentHorizontalOffset > d.contentLeft + d.width) {\n\t\t\t\t\t// mouse position is to the right of the cursor\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst cursorVerticalOffset = ctx.getVerticalOffsetForLineNumber(d.position.lineNumber);\n\n\t\t\t\tif (\n\t\t\t\t\tcursorVerticalOffset <= mouseVerticalOffset\n\t\t\t\t\t&& mouseVerticalOffset <= cursorVerticalOffset + d.height\n\t\t\t\t) {\n\t\t\t\t\treturn request.fulfillContentText(d.position, null, { mightBeForeignElement: false, injectedText: null });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestViewZone(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tconst viewZoneData = ctx.getZoneAtCoord(request.mouseVerticalOffset);\n\t\tif (viewZoneData) {\n\t\t\tconst mouseTargetType = (request.isInContentArea ? MouseTargetType.CONTENT_VIEW_ZONE : MouseTargetType.GUTTER_VIEW_ZONE);\n\t\t\treturn request.fulfillViewZone(mouseTargetType, viewZoneData.position, viewZoneData);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestTextArea(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it the textarea?\n\t\tif (ElementPath.isTextArea(request.targetPath)) {\n\t\t\tif (ctx.lastRenderData.lastTextareaPosition) {\n\t\t\t\treturn request.fulfillContentText(ctx.lastRenderData.lastTextareaPosition, null, { mightBeForeignElement: false, injectedText: null });\n\t\t\t}\n\t\t\treturn request.fulfillTextarea();\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestMargin(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (request.isInMarginArea) {\n\t\t\tconst res = ctx.getFullLineRangeAtCoord(request.mouseVerticalOffset);\n\t\t\tconst pos = res.range.getStartPosition();\n\t\t\tlet offset = Math.abs(request.relativePos.x);\n\t\t\tconst detail: Mutable<IMouseTargetMarginData> = {\n\t\t\t\tisAfterLines: res.isAfterLines,\n\t\t\t\tglyphMarginLeft: ctx.layoutInfo.glyphMarginLeft,\n\t\t\t\tglyphMarginWidth: ctx.layoutInfo.glyphMarginWidth,\n\t\t\t\tlineNumbersWidth: ctx.layoutInfo.lineNumbersWidth,\n\t\t\t\toffsetX: offset\n\t\t\t};\n\n\t\t\toffset -= ctx.layoutInfo.glyphMarginLeft;\n\n\t\t\tif (offset <= ctx.layoutInfo.glyphMarginWidth) {\n\t\t\t\t// On the glyph margin\n\t\t\t\tconst modelCoordinate = ctx.viewModel.coordinatesConverter.convertViewPositionToModelPosition(res.range.getStartPosition());\n\t\t\t\tconst lanes = ctx.viewModel.glyphLanes.getLanesAtLine(modelCoordinate.lineNumber);\n\t\t\t\tdetail.glyphMarginLane = lanes[Math.floor(offset / ctx.lineHeight)];\n\t\t\t\treturn request.fulfillMargin(MouseTargetType.GUTTER_GLYPH_MARGIN, pos, res.range, detail);\n\t\t\t}\n\t\t\toffset -= ctx.layoutInfo.glyphMarginWidth;\n\n\t\t\tif (offset <= ctx.layoutInfo.lineNumbersWidth) {\n\t\t\t\t// On the line numbers\n\t\t\t\treturn request.fulfillMargin(MouseTargetType.GUTTER_LINE_NUMBERS, pos, res.range, detail);\n\t\t\t}\n\t\t\toffset -= ctx.layoutInfo.lineNumbersWidth;\n\n\t\t\t// On the line decorations\n\t\t\treturn request.fulfillMargin(MouseTargetType.GUTTER_LINE_DECORATIONS, pos, res.range, detail);\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestViewLines(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (!ElementPath.isChildOfViewLines(request.targetPath)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (ctx.isInTopPadding(request.mouseVerticalOffset)) {\n\t\t\treturn request.fulfillContentEmpty(new Position(1, 1), EMPTY_CONTENT_AFTER_LINES);\n\t\t}\n\n\t\t// Check if it is below any lines and any view zones\n\t\tif (ctx.isAfterLines(request.mouseVerticalOffset) || ctx.isInBottomPadding(request.mouseVerticalOffset)) {\n\t\t\t// This most likely indicates it happened after the last view-line\n\t\t\tconst lineCount = ctx.viewModel.getLineCount();\n\t\t\tconst maxLineColumn = ctx.viewModel.getLineMaxColumn(lineCount);\n\t\t\treturn request.fulfillContentEmpty(new Position(lineCount, maxLineColumn), EMPTY_CONTENT_AFTER_LINES);\n\t\t}\n\n\t\t// Check if we are hitting a view-line (can happen in the case of inline decorations on empty lines)\n\t\t// See https://github.com/microsoft/vscode/issues/46942\n\t\tif (ElementPath.isStrictChildOfViewLines(request.targetPath)) {\n\t\t\tconst lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\tconst lineLength = ctx.viewModel.getLineLength(lineNumber);\n\t\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\t\t\tif (lineLength === 0) {\n\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\treturn request.fulfillContentEmpty(new Position(lineNumber, 1), detail);\n\t\t\t}\n\n\t\t\tconst isRtl = ctx.isRtl(lineNumber);\n\t\t\tif (isRtl) {\n\t\t\t\tif (request.mouseContentHorizontalOffset + lineWidth <= ctx.layoutInfo.contentWidth - ctx.layoutInfo.verticalScrollbarWidth) {\n\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t\t}\n\t\t\t} else if (request.mouseContentHorizontalOffset >= lineWidth) {\n\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t}\n\t\t} else {\n\t\t\tif (ctx.viewLinesGpu) {\n\t\t\t\tconst lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\t\tif (ctx.viewModel.getLineLength(lineNumber) === 0) {\n\t\t\t\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\treturn request.fulfillContentEmpty(new Position(lineNumber, 1), detail);\n\t\t\t\t}\n\n\t\t\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\t\t\t\tconst isRtl = ctx.isRtl(lineNumber);\n\t\t\t\tif (isRtl) {\n\t\t\t\t\tif (request.mouseContentHorizontalOffset + lineWidth <= ctx.layoutInfo.contentWidth - ctx.layoutInfo.verticalScrollbarWidth) {\n\t\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t\t\t}\n\t\t\t\t} else if (request.mouseContentHorizontalOffset >= lineWidth) {\n\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t\t}\n\n\t\t\t\tconst position = ctx.viewLinesGpu.getPositionAtCoordinate(lineNumber, request.mouseContentHorizontalOffset);\n\t\t\t\tif (position) {\n\t\t\t\t\tconst detail: IMouseTargetContentTextData = {\n\t\t\t\t\t\tinjectedText: null,\n\t\t\t\t\t\tmightBeForeignElement: false\n\t\t\t\t\t};\n\t\t\t\t\treturn request.fulfillContentText(position, EditorRange.fromPositions(position, position), detail);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Do the hit test (if not already done)\n\t\tconst hitTestResult = request.hitTestResult.value;\n\n\t\tif (hitTestResult.type === HitTestResultType.Content) {\n\t\t\treturn MouseTargetFactory.createMouseTargetFromHitTestPosition(ctx, request, hitTestResult.spanNode, hitTestResult.position, hitTestResult.injectedText);\n\t\t}\n\n\t\t// We didn't hit content...\n\t\tif (request.wouldBenefitFromHitTestTargetSwitch) {\n\t\t\t// We actually hit something different... Give it one last change by trying again with this new target\n\t\t\trequest.switchToHitTestTarget();\n\t\t\treturn this._createMouseTarget(ctx, request);\n\t\t}\n\n\t\t// We have tried everything...\n\t\treturn request.fulfillUnknown();\n\t}\n\n\tprivate static _hitTestMinimap(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (ElementPath.isChildOfMinimap(request.targetPath)) {\n\t\t\tconst possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\tconst maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber);\n\t\t\treturn request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn));\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestScrollbarSlider(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (ElementPath.isChildOfScrollableElement(request.targetPath)) {\n\t\t\tif (request.target && request.target.nodeType === 1) {\n\t\t\t\tconst className = request.target.className;\n\t\t\t\tif (className && /\\b(slider|scrollbar)\\b/.test(className)) {\n\t\t\t\t\tconst possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\t\t\tconst maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber);\n\t\t\t\t\treturn request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestScrollbar(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it the overview ruler?\n\t\t// Is it a child of the scrollable element?\n\t\tif (ElementPath.isChildOfScrollableElement(request.targetPath)) {\n\t\t\tconst possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\tconst maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber);\n\t\t\treturn request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn));\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic getMouseColumn(relativePos: CoordinatesRelativeToEditor): number {\n\t\tconst options = this._context.configuration.options;\n\t\tconst layoutInfo = options.get(EditorOption.layoutInfo);\n\t\tconst mouseContentHorizontalOffset = this._context.viewLayout.getCurrentScrollLeft() + relativePos.x - layoutInfo.contentLeft;\n\t\treturn MouseTargetFactory._getMouseColumn(mouseContentHorizontalOffset, options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth);\n\t}\n\n\tpublic static _getMouseColumn(mouseContentHorizontalOffset: number, typicalHalfwidthCharacterWidth: number): number {\n\t\tif (mouseContentHorizontalOffset < 0) {\n\t\t\treturn 1;\n\t\t}\n\t\tconst chars = Math.round(mouseContentHorizontalOffset / typicalHalfwidthCharacterWidth);\n\t\treturn (chars + 1);\n\t}\n\n\tprivate static createMouseTargetFromHitTestPosition(ctx: HitTestContext, request: HitTestRequest, spanNode: HTMLElement, pos: Position, injectedText: InjectedText | null): IMouseTarget {\n\t\tconst lineNumber = pos.lineNumber;\n\t\tconst column = pos.column;\n\n\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\n\t\tif (request.mouseContentHorizontalOffset > lineWidth) {\n\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t}\n\n\t\tconst visibleRange = ctx.visibleRangeForPosition(lineNumber, column);\n\n\t\tif (!visibleRange) {\n\t\t\treturn request.fulfillUnknown(pos);\n\t\t}\n\n\t\tconst columnHorizontalOffset = visibleRange.left;\n\n\t\tif (Math.abs(request.mouseContentHorizontalOffset - columnHorizontalOffset) < 1) {\n\t\t\treturn request.fulfillContentText(pos, null, { mightBeForeignElement: !!injectedText, injectedText });\n\t\t}\n\n\t\t// Let's define a, b, c and check if the offset is in between them...\n\t\tinterface OffsetColumn { offset: number; column: number }\n\n\t\tconst points: OffsetColumn[] = [];\n\t\tpoints.push({ offset: visibleRange.left, column: column });\n\t\tif (column > 1) {\n\t\t\tconst visibleRange = ctx.visibleRangeForPosition(lineNumber, column - 1);\n\t\t\tif (visibleRange) {\n\t\t\t\tpoints.push({ offset: visibleRange.left, column: column - 1 });\n\t\t\t}\n\t\t}\n\t\tconst lineMaxColumn = ctx.viewModel.getLineMaxColumn(lineNumber);\n\t\tif (column < lineMaxColumn) {\n\t\t\tconst visibleRange = ctx.visibleRangeForPosition(lineNumber, column + 1);\n\t\t\tif (visibleRange) {\n\t\t\t\tpoints.push({ offset: visibleRange.left, column: column + 1 });\n\t\t\t}\n\t\t}\n\n\t\tpoints.sort((a, b) => a.offset - b.offset);\n\n\t\tconst mouseCoordinates = request.pos.toClientCoordinates(dom.getWindow(ctx.viewDomNode));\n\t\tconst spanNodeClientRect = spanNode.getBoundingClientRect();\n\t\tconst mouseIsOverSpanNode = (spanNodeClientRect.left <= mouseCoordinates.clientX && mouseCoordinates.clientX <= spanNodeClientRect.right);\n\n\t\tlet rng: EditorRange | null = null;\n\n\t\tfor (let i = 1; i < points.length; i++) {\n\t\t\tconst prev = points[i - 1];\n\t\t\tconst curr = points[i];\n\t\t\tif (prev.offset <= request.mouseContentHorizontalOffset && request.mouseContentHorizontalOffset <= curr.offset) {\n\t\t\t\trng = new EditorRange(lineNumber, prev.column, lineNumber, curr.column);\n\n\t\t\t\t// See https://github.com/microsoft/vscode/issues/152819\n\t\t\t\t// Due to the use of zwj, the browser's hit test result is skewed towards the left\n\t\t\t\t// Here we try to correct that if the mouse horizontal offset is closer to the right than the left\n\n\t\t\t\tconst prevDelta = Math.abs(prev.offset - request.mouseContentHorizontalOffset);\n\t\t\t\tconst nextDelta = Math.abs(curr.offset - request.mouseContentHorizontalOffset);\n\n\t\t\t\tpos = (\n\t\t\t\t\tprevDelta < nextDelta\n\t\t\t\t\t\t? new Position(lineNumber, prev.column)\n\t\t\t\t\t\t: new Position(lineNumber, curr.column)\n\t\t\t\t);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn request.fulfillContentText(pos, rng, { mightBeForeignElement: !mouseIsOverSpanNode || !!injectedText, injectedText });\n\t}\n\n\t/**\n\t * Most probably WebKit browsers and Edge\n\t */\n\tprivate static _doHitTestWithCaretRangeFromPoint(ctx: HitTestContext, request: BareHitTestRequest): HitTestResult {\n\n\t\t// In Chrome, especially on Linux it is possible to click between lines,\n\t\t// so try to adjust the `hity` below so that it lands in the center of a line\n\t\tconst lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\tconst lineStartVerticalOffset = ctx.getVerticalOffsetForLineNumber(lineNumber);\n\t\tconst lineEndVerticalOffset = lineStartVerticalOffset + ctx.lineHeight;\n\n\t\tconst isBelowLastLine = (\n\t\t\tlineNumber === ctx.viewModel.getLineCount()\n\t\t\t&& request.mouseVerticalOffset > lineEndVerticalOffset\n\t\t);\n\n\t\tif (!isBelowLastLine) {\n\t\t\tconst lineCenteredVerticalOffset = Math.floor((lineStartVerticalOffset + lineEndVerticalOffset) / 2);\n\t\t\tlet adjustedPageY = request.pos.y + (lineCenteredVerticalOffset - request.mouseVerticalOffset);\n\n\t\t\tif (adjustedPageY <= request.editorPos.y) {\n\t\t\t\tadjustedPageY = request.editorPos.y + 1;\n\t\t\t}\n\t\t\tif (adjustedPageY >= request.editorPos.y + request.editorPos.height) {\n\t\t\t\tadjustedPageY = request.editorPos.y + request.editorPos.height - 1;\n\t\t\t}\n\n\t\t\tconst adjustedPage = new PageCoordinates(request.pos.x, adjustedPageY);\n\n\t\t\tconst r = this._actualDoHitTestWithCaretRangeFromPoint(ctx, adjustedPage.toClientCoordinates(dom.getWindow(ctx.viewDomNode)));\n\t\t\tif (r.type === HitTestResultType.Content) {\n\t\t\t\treturn r;\n\t\t\t}\n\t\t}\n\n\t\t// Also try to hit test without the adjustment (for the edge cases that we are near the top or bottom)\n\t\treturn this._actualDoHitTestWithCaretRangeFromPoint(ctx, request.pos.toClientCoordinates(dom.getWindow(ctx.viewDomNode)));\n\t}\n\n\tprivate static _actualDoHitTestWithCaretRangeFromPoint(ctx: HitTestContext, coords: ClientCoordinates): HitTestResult {\n\t\tconst shadowRoot = dom.getShadowRoot(ctx.viewDomNode);\n\t\tlet range: Range;\n\t\tif (shadowRoot) {\n\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t\tif (typeof (<any>shadowRoot).caretRangeFromPoint === 'undefined') {\n\t\t\t\trange = shadowCaretRangeFromPoint(shadowRoot, coords.clientX, coords.clientY);\n\t\t\t} else {\n\t\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t\t\trange = (<any>shadowRoot).caretRangeFromPoint(coords.clientX, coords.clientY);\n\t\t\t}\n\t\t} else {\n\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t\trange = (<any>ctx.viewDomNode.ownerDocument).caretRangeFromPoint(coords.clientX, coords.clientY);\n\t\t}\n\n\t\tif (!range || !range.startContainer) {\n\t\t\treturn new UnknownHitTestResult();\n\t\t}\n\n\t\t// Chrome always hits a TEXT_NODE, while Edge sometimes hits a token span\n\t\tconst startContainer = range.startContainer;\n\n\t\tif (startContainer.nodeType === startContainer.TEXT_NODE) {\n\t\t\t// startContainer is expected to be the token text\n\t\t\tconst parent1 = startContainer.parentNode; // expected to be the token span\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null; // expected to be the view line container span\n\t\t\tconst parent3 = parent2 ? parent2.parentNode : null; // expected to be the view line div\n\t\t\tconst parent3ClassName = parent3 && parent3.nodeType === parent3.ELEMENT_NODE ? (<HTMLElement>parent3).className : null;\n\n\t\t\tif (parent3ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>parent1, range.startOffset);\n\t\t\t} else {\n\t\t\t\treturn new UnknownHitTestResult(<HTMLElement>startContainer.parentNode);\n\t\t\t}\n\t\t} else if (startContainer.nodeType === startContainer.ELEMENT_NODE) {\n\t\t\t// startContainer is expected to be the token span\n\t\t\tconst parent1 = startContainer.parentNode; // expected to be the view line container span\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null; // expected to be the view line div\n\t\t\tconst parent2ClassName = parent2 && parent2.nodeType === parent2.ELEMENT_NODE ? (<HTMLElement>parent2).className : null;\n\n\t\t\tif (parent2ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>startContainer, (<HTMLElement>startContainer).textContent!.length);\n\t\t\t} else {\n\t\t\t\treturn new UnknownHitTestResult(<HTMLElement>startContainer);\n\t\t\t}\n\t\t}\n\n\t\treturn new UnknownHitTestResult();\n\t}\n\n\t/**\n\t * Most probably Gecko\n\t */\n\tprivate static _doHitTestWithCaretPositionFromPoint(ctx: HitTestContext, coords: ClientCoordinates): HitTestResult {\n\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\tconst hitResult: { offsetNode: Node; offset: number } = (<any>ctx.viewDomNode.ownerDocument).caretPositionFromPoint(coords.clientX, coords.clientY);\n\n\t\tif (hitResult.offsetNode.nodeType === hitResult.offsetNode.TEXT_NODE) {\n\t\t\t// offsetNode is expected to be the token text\n\t\t\tconst parent1 = hitResult.offsetNode.parentNode; // expected to be the token span\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null; // expected to be the view line container span\n\t\t\tconst parent3 = parent2 ? parent2.parentNode : null; // expected to be the view line div\n\t\t\tconst parent3ClassName = parent3 && parent3.nodeType === parent3.ELEMENT_NODE ? (<HTMLElement>parent3).className : null;\n\n\t\t\tif (parent3ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>hitResult.offsetNode.parentNode, hitResult.offset);\n\t\t\t} else {\n\t\t\t\treturn new UnknownHitTestResult(<HTMLElement>hitResult.offsetNode.parentNode);\n\t\t\t}\n\t\t}\n\n\t\t// For inline decorations, Gecko sometimes returns the `<span>` of the line and the offset is the `<span>` with the inline decoration\n\t\t// Some other times, it returns the `<span>` with the inline decoration\n\t\tif (hitResult.offsetNode.nodeType === hitResult.offsetNode.ELEMENT_NODE) {\n\t\t\tconst parent1 = hitResult.offsetNode.parentNode;\n\t\t\tconst parent1ClassName = parent1 && parent1.nodeType === parent1.ELEMENT_NODE ? (<HTMLElement>parent1).className : null;\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null;\n\t\t\tconst parent2ClassName = parent2 && parent2.nodeType === parent2.ELEMENT_NODE ? (<HTMLElement>parent2).className : null;\n\n\t\t\tif (parent1ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\t// it returned the `<span>` of the line and the offset is the `<span>` with the inline decoration\n\t\t\t\tconst tokenSpan = hitResult.offsetNode.childNodes[Math.min(hitResult.offset, hitResult.offsetNode.childNodes.length - 1)];\n\t\t\t\tif (tokenSpan) {\n\t\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>tokenSpan, 0);\n\t\t\t\t}\n\t\t\t} else if (parent2ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\t// it returned the `<span>` with the inline decoration\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>hitResult.offsetNode, 0);\n\t\t\t}\n\t\t}\n\n\t\treturn new UnknownHitTestResult(<HTMLElement>hitResult.offsetNode);\n\t}\n\n\tprivate static _snapToSoftTabBoundary(position: Position, viewModel: IViewModel): Position {\n\t\tconst lineContent = viewModel.getLineContent(position.lineNumber);\n\t\tconst { tabSize } = viewModel.model.getOptions();\n\t\tconst newPosition = AtomicTabMoveOperations.atomicPosition(lineContent, position.column - 1, tabSize, Direction.Nearest);\n\t\tif (newPosition !== -1) {\n\t\t\treturn new Position(position.lineNumber, newPosition + 1);\n\t\t}\n\t\treturn position;\n\t}\n\n\tpublic static doHitTest(ctx: HitTestContext, request: BareHitTestRequest): HitTestResult {\n\n\t\tlet result: HitTestResult = new UnknownHitTestResult();\n\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\tif (typeof (<any>ctx.viewDomNode.ownerDocument).caretRangeFromPoint === 'function') {\n\t\t\tresult = this._doHitTestWithCaretRangeFromPoint(ctx, request);\n\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t} else if ((<any>ctx.viewDomNode.ownerDocument).caretPositionFromPoint) {\n\t\t\tresult = this._doHitTestWithCaretPositionFromPoint(ctx, request.pos.toClientCoordinates(dom.getWindow(ctx.viewDomNode)));\n\t\t}\n\t\tif (result.type === HitTestResultType.Content) {\n\t\t\tconst injectedText = ctx.viewModel.getInjectedTextAt(result.position);\n\n\t\t\tconst normalizedPosition = ctx.viewModel.normalizePosition(result.position, PositionAffinity.None);\n\t\t\tif (injectedText || !normalizedPosition.equals(result.position)) {\n\t\t\t\tresult = new ContentHitTestResult(normalizedPosition, result.spanNode, injectedText);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n}\n\nfunction shadowCaretRangeFromPoint(shadowRoot: ShadowRoot, x: number, y: number): Range {\n\tconst range = document.createRange();\n\n\t// Get the element under the point\n\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\tlet el: HTMLElement | null = (<any>shadowRoot).elementFromPoint(x, y);\n\t// When el is not null, it may be div.monaco-mouse-cursor-text Element, which has not childNodes, we don't need to handle it.\n\tif (el?.hasChildNodes()) {\n\t\t// Get the last child of the element until its firstChild is a text node\n\t\t// This assumes that the pointer is on the right of the line, out of the tokens\n\t\t// and that we want to get the offset of the last token of the line\n\t\twhile (el && el.firstChild && el.firstChild.nodeType !== el.firstChild.TEXT_NODE && el.lastChild && el.lastChild.firstChild) {\n\t\t\tel = <HTMLElement>el.lastChild;\n\t\t}\n\n\t\t// Grab its rect\n\t\tconst rect = el.getBoundingClientRect();\n\n\t\t// And its font (the computed shorthand font property might be empty, see #3217)\n\t\tconst elWindow = dom.getWindow(el);\n\t\tconst fontStyle = elWindow.getComputedStyle(el, null).getPropertyValue('font-style');\n\t\tconst fontVariant = elWindow.getComputedStyle(el, null).getPropertyValue('font-variant');\n\t\tconst fontWeight = elWindow.getComputedStyle(el, null).getPropertyValue('font-weight');\n\t\tconst fontSize = elWindow.getComputedStyle(el, null).getPropertyValue('font-size');\n\t\tconst lineHeight = elWindow.getComputedStyle(el, null).getPropertyValue('line-height');\n\t\tconst fontFamily = elWindow.getComputedStyle(el, null).getPropertyValue('font-family');\n\t\tconst font = `${fontStyle} ${fontVariant} ${fontWeight} ${fontSize}/${lineHeight} ${fontFamily}`;\n\n\t\t// And also its txt content\n\t\tconst text = el.innerText;\n\n\t\t// Position the pixel cursor at the left of the element\n\t\tlet pixelCursor = rect.left;\n\t\tlet offset = 0;\n\t\tlet step: number;\n\n\t\t// If the point is on the right of the box put the cursor after the last character\n\t\tif (x > rect.left + rect.width) {\n\t\t\toffset = text.length;\n\t\t} else {\n\t\t\tconst charWidthReader = CharWidthReader.getInstance();\n\t\t\t// Goes through all the characters of the innerText, and checks if the x of the point\n\t\t\t// belongs to the character.\n\t\t\tfor (let i = 0; i < text.length + 1; i++) {\n\t\t\t\t// The step is half the width of the character\n\t\t\t\tstep = charWidthReader.getCharWidth(text.charAt(i), font) / 2;\n\t\t\t\t// Move to the center of the character\n\t\t\t\tpixelCursor += step;\n\t\t\t\t// If the x of the point is smaller that the position of the cursor, the point is over that character\n\t\t\t\tif (x < pixelCursor) {\n\t\t\t\t\toffset = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// Move between the current character and the next\n\t\t\t\tpixelCursor += step;\n\t\t\t}\n\t\t}\n\n\t\t// Creates a range with the text node of the element and set the offset found\n\t\trange.setStart(el.firstChild!, offset);\n\t\trange.setEnd(el.firstChild!, offset);\n\t}\n\n\treturn range;\n}\n\nclass CharWidthReader {\n\tprivate static _INSTANCE: CharWidthReader | null = null;\n\n\tpublic static getInstance(): CharWidthReader {\n\t\tif (!CharWidthReader._INSTANCE) {\n\t\t\tCharWidthReader._INSTANCE = new CharWidthReader();\n\t\t}\n\t\treturn CharWidthReader._INSTANCE;\n\t}\n\n\tprivate readonly _cache: { [cacheKey: string]: number };\n\tprivate readonly _canvas: HTMLCanvasElement;\n\n\tprivate constructor() {\n\t\tthis._cache = {};\n\t\tthis._canvas = document.createElement('canvas');\n\t}\n\n\tpublic getCharWidth(char: string, font: string): number {\n\t\tconst cacheKey = char + font;\n\t\tif (this._cache[cacheKey]) {\n\t\t\treturn this._cache[cacheKey];\n\t\t}\n\n\t\tconst context = this._canvas.getContext('2d')!;\n\t\tcontext.font = font;\n\t\tconst metrics = context.measureText(char);\n\t\tconst width = metrics.width;\n\t\tthis._cache[cacheKey] = width;\n\t\treturn width;\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 { IPointerHandlerHelper } from './mouseHandler.js';\nimport { IMouseTargetContentEmptyData, IMouseTargetMarginData, IMouseTarget, IMouseTargetContentEmpty, IMouseTargetContentText, IMouseTargetContentWidget, IMouseTargetMargin, IMouseTargetOutsideEditor, IMouseTargetOverlayWidget, IMouseTargetScrollbar, IMouseTargetTextarea, IMouseTargetUnknown, IMouseTargetViewZone, IMouseTargetContentTextData, IMouseTargetViewZoneData, MouseTargetType } from '../editorBrowser.js';\nimport { ClientCoordinates, EditorMouseEvent, EditorPagePosition, PageCoordinates, CoordinatesRelativeToEditor } from '../editorDom.js';\nimport { PartFingerprint, PartFingerprints } from '../view/viewPart.js';\nimport { ViewLine } from '../viewParts/viewLines/viewLine.js';\nimport { IViewCursorRenderData } from '../viewParts/viewCursors/viewCursor.js';\nimport { EditorLayoutInfo, EditorOption } from '../../common/config/editorOptions.js';\nimport { Position } from '../../common/core/position.js';\nimport { Range as EditorRange } from '../../common/core/range.js';\nimport { HorizontalPosition } from '../view/renderingContext.js';\nimport { ViewContext } from '../../common/viewModel/viewContext.js';\nimport { IViewModel } from '../../common/viewModel.js';\nimport { CursorColumns } from '../../common/core/cursorColumns.js';\nimport * as dom from '../../../base/browser/dom.js';\nimport { AtomicTabMoveOperations, Direction } from '../../common/cursor/cursorAtomicMoveOperations.js';\nimport { PositionAffinity, TextDirection } from '../../common/model.js';\nimport { InjectedText } from '../../common/modelLineProjectionData.js';\nimport { Mutable } from '../../../base/common/types.js';\nimport { Lazy } from '../../../base/common/lazy.js';\nimport { ViewLinesGpu } from '../viewParts/viewLinesGpu/viewLinesGpu.js';\n\nconst enum HitTestResultType {\n\tUnknown,\n\tContent,\n}\n\nclass UnknownHitTestResult {\n\treadonly type = HitTestResultType.Unknown;\n\tconstructor(\n\t\treadonly hitTarget: HTMLElement | null = null\n\t) { }\n}\n\nclass ContentHitTestResult {\n\treadonly type = HitTestResultType.Content;\n\n\tget hitTarget(): HTMLElement { return this.spanNode; }\n\n\tconstructor(\n\t\treadonly position: Position,\n\t\treadonly spanNode: HTMLElement,\n\t\treadonly injectedText: InjectedText | null,\n\t) { }\n}\n\ntype HitTestResult = UnknownHitTestResult | ContentHitTestResult;\n\nnamespace HitTestResult {\n\texport function createFromDOMInfo(ctx: HitTestContext, spanNode: HTMLElement, offset: number): HitTestResult {\n\t\tconst position = ctx.getPositionFromDOMInfo(spanNode, offset);\n\t\tif (position) {\n\t\t\treturn new ContentHitTestResult(position, spanNode, null);\n\t\t}\n\t\treturn new UnknownHitTestResult(spanNode);\n\t}\n}\n\nexport class PointerHandlerLastRenderData {\n\tconstructor(\n\t\tpublic readonly lastViewCursorsRenderData: IViewCursorRenderData[],\n\t\tpublic readonly lastTextareaPosition: Position | null\n\t) { }\n}\n\nexport class MouseTarget {\n\n\tprivate static _deduceRage(position: Position): EditorRange;\n\tprivate static _deduceRage(position: Position, range: EditorRange | null): EditorRange;\n\tprivate static _deduceRage(position: Position | null): EditorRange | null;\n\tprivate static _deduceRage(position: Position | null, range: EditorRange | null = null): EditorRange | null {\n\t\tif (!range && position) {\n\t\t\treturn new EditorRange(position.lineNumber, position.column, position.lineNumber, position.column);\n\t\t}\n\t\treturn range ?? null;\n\t}\n\tpublic static createUnknown(element: HTMLElement | null, mouseColumn: number, position: Position | null): IMouseTargetUnknown {\n\t\treturn { type: MouseTargetType.UNKNOWN, element, mouseColumn, position, range: this._deduceRage(position) };\n\t}\n\tpublic static createTextarea(element: HTMLElement | null, mouseColumn: number): IMouseTargetTextarea {\n\t\treturn { type: MouseTargetType.TEXTAREA, element, mouseColumn, position: null, range: null };\n\t}\n\tpublic static createMargin(type: MouseTargetType.GUTTER_GLYPH_MARGIN | MouseTargetType.GUTTER_LINE_NUMBERS | MouseTargetType.GUTTER_LINE_DECORATIONS, element: HTMLElement | null, mouseColumn: number, position: Position, range: EditorRange, detail: IMouseTargetMarginData): IMouseTargetMargin {\n\t\treturn { type, element, mouseColumn, position, range, detail };\n\t}\n\tpublic static createViewZone(type: MouseTargetType.GUTTER_VIEW_ZONE | MouseTargetType.CONTENT_VIEW_ZONE, element: HTMLElement | null, mouseColumn: number, position: Position, detail: IMouseTargetViewZoneData): IMouseTargetViewZone {\n\t\treturn { type, element, mouseColumn, position, range: this._deduceRage(position), detail };\n\t}\n\tpublic static createContentText(element: HTMLElement | null, mouseColumn: number, position: Position, range: EditorRange | null, detail: IMouseTargetContentTextData): IMouseTargetContentText {\n\t\treturn { type: MouseTargetType.CONTENT_TEXT, element, mouseColumn, position, range: this._deduceRage(position, range), detail };\n\t}\n\tpublic static createContentEmpty(element: HTMLElement | null, mouseColumn: number, position: Position, detail: IMouseTargetContentEmptyData): IMouseTargetContentEmpty {\n\t\treturn { type: MouseTargetType.CONTENT_EMPTY, element, mouseColumn, position, range: this._deduceRage(position), detail };\n\t}\n\tpublic static createContentWidget(element: HTMLElement | null, mouseColumn: number, detail: string): IMouseTargetContentWidget {\n\t\treturn { type: MouseTargetType.CONTENT_WIDGET, element, mouseColumn, position: null, range: null, detail };\n\t}\n\tpublic static createScrollbar(element: HTMLElement | null, mouseColumn: number, position: Position): IMouseTargetScrollbar {\n\t\treturn { type: MouseTargetType.SCROLLBAR, element, mouseColumn, position, range: this._deduceRage(position) };\n\t}\n\tpublic static createOverlayWidget(element: HTMLElement | null, mouseColumn: number, detail: string): IMouseTargetOverlayWidget {\n\t\treturn { type: MouseTargetType.OVERLAY_WIDGET, element, mouseColumn, position: null, range: null, detail };\n\t}\n\tpublic static createOutsideEditor(mouseColumn: number, position: Position, outsidePosition: 'above' | 'below' | 'left' | 'right', outsideDistance: number): IMouseTargetOutsideEditor {\n\t\treturn { type: MouseTargetType.OUTSIDE_EDITOR, element: null, mouseColumn, position, range: this._deduceRage(position), outsidePosition, outsideDistance };\n\t}\n\n\tprivate static _typeToString(type: MouseTargetType): string {\n\t\tif (type === MouseTargetType.TEXTAREA) {\n\t\t\treturn 'TEXTAREA';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_GLYPH_MARGIN) {\n\t\t\treturn 'GUTTER_GLYPH_MARGIN';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_LINE_NUMBERS) {\n\t\t\treturn 'GUTTER_LINE_NUMBERS';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_LINE_DECORATIONS) {\n\t\t\treturn 'GUTTER_LINE_DECORATIONS';\n\t\t}\n\t\tif (type === MouseTargetType.GUTTER_VIEW_ZONE) {\n\t\t\treturn 'GUTTER_VIEW_ZONE';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_TEXT) {\n\t\t\treturn 'CONTENT_TEXT';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_EMPTY) {\n\t\t\treturn 'CONTENT_EMPTY';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_VIEW_ZONE) {\n\t\t\treturn 'CONTENT_VIEW_ZONE';\n\t\t}\n\t\tif (type === MouseTargetType.CONTENT_WIDGET) {\n\t\t\treturn 'CONTENT_WIDGET';\n\t\t}\n\t\tif (type === MouseTargetType.OVERVIEW_RULER) {\n\t\t\treturn 'OVERVIEW_RULER';\n\t\t}\n\t\tif (type === MouseTargetType.SCROLLBAR) {\n\t\t\treturn 'SCROLLBAR';\n\t\t}\n\t\tif (type === MouseTargetType.OVERLAY_WIDGET) {\n\t\t\treturn 'OVERLAY_WIDGET';\n\t\t}\n\t\treturn 'UNKNOWN';\n\t}\n\n\tpublic static toString(target: IMouseTarget): string {\n\t\treturn this._typeToString(target.type) + ': ' + target.position + ' - ' + target.range + ' - ' + JSON.stringify((target as unknown as Record<string, unknown>).detail);\n\t}\n}\n\nclass ElementPath {\n\n\tpublic static isTextArea(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length === 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.TextArea\n\t\t);\n\t}\n\n\tpublic static isChildOfViewLines(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 4\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[3] === PartFingerprint.ViewLines\n\t\t);\n\t}\n\n\tpublic static isStrictChildOfViewLines(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length > 4\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[3] === PartFingerprint.ViewLines\n\t\t);\n\t}\n\n\tpublic static isChildOfScrollableElement(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.ScrollableElement\n\t\t);\n\t}\n\n\tpublic static isChildOfMinimap(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.Minimap\n\t\t);\n\t}\n\n\tpublic static isChildOfContentWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 4\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[3] === PartFingerprint.ContentWidgets\n\t\t);\n\t}\n\n\tpublic static isChildOfOverflowGuard(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 1\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t);\n\t}\n\n\tpublic static isChildOfOverflowingContentWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 1\n\t\t\t&& path[0] === PartFingerprint.OverflowingContentWidgets\n\t\t);\n\t}\n\n\tpublic static isChildOfOverlayWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 2\n\t\t\t&& path[0] === PartFingerprint.OverflowGuard\n\t\t\t&& path[1] === PartFingerprint.OverlayWidgets\n\t\t);\n\t}\n\n\tpublic static isChildOfOverflowingOverlayWidgets(path: Uint8Array): boolean {\n\t\treturn (\n\t\t\tpath.length >= 1\n\t\t\t&& path[0] === PartFingerprint.OverflowingOverlayWidgets\n\t\t);\n\t}\n}\n\nexport class HitTestContext {\n\n\tpublic readonly viewModel: IViewModel;\n\tpublic readonly layoutInfo: EditorLayoutInfo;\n\tpublic readonly viewDomNode: HTMLElement;\n\tpublic readonly viewLinesGpu: ViewLinesGpu | undefined;\n\tpublic readonly lineHeight: number;\n\tpublic readonly stickyTabStops: boolean;\n\tpublic readonly typicalHalfwidthCharacterWidth: number;\n\tpublic readonly lastRenderData: PointerHandlerLastRenderData;\n\n\tprivate readonly _context: ViewContext;\n\tprivate readonly _viewHelper: IPointerHandlerHelper;\n\n\tconstructor(context: ViewContext, viewHelper: IPointerHandlerHelper, lastRenderData: PointerHandlerLastRenderData) {\n\t\tthis.viewModel = context.viewModel;\n\t\tconst options = context.configuration.options;\n\t\tthis.layoutInfo = options.get(EditorOption.layoutInfo);\n\t\tthis.viewDomNode = viewHelper.viewDomNode;\n\t\tthis.viewLinesGpu = viewHelper.viewLinesGpu;\n\t\tthis.lineHeight = options.get(EditorOption.lineHeight);\n\t\tthis.stickyTabStops = options.get(EditorOption.stickyTabStops);\n\t\tthis.typicalHalfwidthCharacterWidth = options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth;\n\t\tthis.lastRenderData = lastRenderData;\n\t\tthis._context = context;\n\t\tthis._viewHelper = viewHelper;\n\t}\n\n\tpublic getZoneAtCoord(mouseVerticalOffset: number): IMouseTargetViewZoneData | null {\n\t\treturn HitTestContext.getZoneAtCoord(this._context, mouseVerticalOffset);\n\t}\n\n\tpublic static getZoneAtCoord(context: ViewContext, mouseVerticalOffset: number): IMouseTargetViewZoneData | null {\n\t\t// The target is either a view zone or the empty space after the last view-line\n\t\tconst viewZoneWhitespace = context.viewLayout.getWhitespaceAtVerticalOffset(mouseVerticalOffset);\n\n\t\tif (viewZoneWhitespace) {\n\t\t\tconst viewZoneMiddle = viewZoneWhitespace.verticalOffset + viewZoneWhitespace.height / 2;\n\t\t\tconst lineCount = context.viewModel.getLineCount();\n\t\t\tlet positionBefore: Position | null = null;\n\t\t\tlet position: Position | null;\n\t\t\tlet positionAfter: Position | null = null;\n\n\t\t\tif (viewZoneWhitespace.afterLineNumber !== lineCount) {\n\t\t\t\t// There are more lines after this view zone\n\t\t\t\tpositionAfter = new Position(viewZoneWhitespace.afterLineNumber + 1, 1);\n\t\t\t}\n\t\t\tif (viewZoneWhitespace.afterLineNumber > 0) {\n\t\t\t\t// There are more lines above this view zone\n\t\t\t\tpositionBefore = new Position(viewZoneWhitespace.afterLineNumber, context.viewModel.getLineMaxColumn(viewZoneWhitespace.afterLineNumber));\n\t\t\t}\n\n\t\t\tif (positionAfter === null) {\n\t\t\t\tposition = positionBefore;\n\t\t\t} else if (positionBefore === null) {\n\t\t\t\tposition = positionAfter;\n\t\t\t} else if (mouseVerticalOffset < viewZoneMiddle) {\n\t\t\t\tposition = positionBefore;\n\t\t\t} else {\n\t\t\t\tposition = positionAfter;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tviewZoneId: viewZoneWhitespace.id,\n\t\t\t\tafterLineNumber: viewZoneWhitespace.afterLineNumber,\n\t\t\t\tpositionBefore: positionBefore,\n\t\t\t\tpositionAfter: positionAfter,\n\t\t\t\tposition: position!\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic getFullLineRangeAtCoord(mouseVerticalOffset: number): { range: EditorRange; isAfterLines: boolean } {\n\t\tif (this._context.viewLayout.isAfterLines(mouseVerticalOffset)) {\n\t\t\t// Below the last line\n\t\t\tconst lineNumber = this._context.viewModel.getLineCount();\n\t\t\tconst maxLineColumn = this._context.viewModel.getLineMaxColumn(lineNumber);\n\t\t\treturn {\n\t\t\t\trange: new EditorRange(lineNumber, maxLineColumn, lineNumber, maxLineColumn),\n\t\t\t\tisAfterLines: true\n\t\t\t};\n\t\t}\n\n\t\tconst lineNumber = this._context.viewLayout.getLineNumberAtVerticalOffset(mouseVerticalOffset);\n\t\tconst maxLineColumn = this._context.viewModel.getLineMaxColumn(lineNumber);\n\t\treturn {\n\t\t\trange: new EditorRange(lineNumber, 1, lineNumber, maxLineColumn),\n\t\t\tisAfterLines: false\n\t\t};\n\t}\n\n\tpublic getLineNumberAtVerticalOffset(mouseVerticalOffset: number): number {\n\t\treturn this._context.viewLayout.getLineNumberAtVerticalOffset(mouseVerticalOffset);\n\t}\n\n\tpublic isAfterLines(mouseVerticalOffset: number): boolean {\n\t\treturn this._context.viewLayout.isAfterLines(mouseVerticalOffset);\n\t}\n\n\tpublic isInTopPadding(mouseVerticalOffset: number): boolean {\n\t\treturn this._context.viewLayout.isInTopPadding(mouseVerticalOffset);\n\t}\n\n\tpublic isInBottomPadding(mouseVerticalOffset: number): boolean {\n\t\treturn this._context.viewLayout.isInBottomPadding(mouseVerticalOffset);\n\t}\n\n\tpublic getVerticalOffsetForLineNumber(lineNumber: number): number {\n\t\treturn this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber);\n\t}\n\n\tpublic findAttribute(element: Element, attr: string): string | null {\n\t\treturn HitTestContext._findAttribute(element, attr, this._viewHelper.viewDomNode);\n\t}\n\n\tprivate static _findAttribute(element: Element, attr: string, stopAt: Element): string | null {\n\t\twhile (element && element !== element.ownerDocument.body) {\n\t\t\tif (element.hasAttribute && element.hasAttribute(attr)) {\n\t\t\t\treturn element.getAttribute(attr);\n\t\t\t}\n\t\t\tif (element === stopAt) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\telement = <Element>element.parentNode;\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic getLineWidth(lineNumber: number): number {\n\t\treturn this._viewHelper.getLineWidth(lineNumber);\n\t}\n\n\tpublic isRtl(lineNumber: number): boolean {\n\t\treturn this.viewModel.getTextDirection(lineNumber) === TextDirection.RTL;\n\n\t}\n\n\tpublic visibleRangeForPosition(lineNumber: number, column: number): HorizontalPosition | null {\n\t\treturn this._viewHelper.visibleRangeForPosition(lineNumber, column);\n\t}\n\n\tpublic getPositionFromDOMInfo(spanNode: HTMLElement, offset: number): Position | null {\n\t\treturn this._viewHelper.getPositionFromDOMInfo(spanNode, offset);\n\t}\n\n\tpublic getCurrentScrollTop(): number {\n\t\treturn this._context.viewLayout.getCurrentScrollTop();\n\t}\n\n\tpublic getCurrentScrollLeft(): number {\n\t\treturn this._context.viewLayout.getCurrentScrollLeft();\n\t}\n}\n\nabstract class BareHitTestRequest {\n\n\tpublic readonly editorPos: EditorPagePosition;\n\tpublic readonly pos: PageCoordinates;\n\tpublic readonly relativePos: CoordinatesRelativeToEditor;\n\tpublic readonly mouseVerticalOffset: number;\n\tpublic readonly isInMarginArea: boolean;\n\tpublic readonly isInContentArea: boolean;\n\tpublic readonly mouseContentHorizontalOffset: number;\n\n\tprotected readonly mouseColumn: number;\n\n\tconstructor(ctx: HitTestContext, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor) {\n\t\tthis.editorPos = editorPos;\n\t\tthis.pos = pos;\n\t\tthis.relativePos = relativePos;\n\n\t\tthis.mouseVerticalOffset = Math.max(0, ctx.getCurrentScrollTop() + this.relativePos.y);\n\t\tthis.mouseContentHorizontalOffset = ctx.getCurrentScrollLeft() + this.relativePos.x - ctx.layoutInfo.contentLeft;\n\t\tthis.isInMarginArea = (this.relativePos.x < ctx.layoutInfo.contentLeft && this.relativePos.x >= ctx.layoutInfo.glyphMarginLeft);\n\t\tthis.isInContentArea = !this.isInMarginArea;\n\t\tthis.mouseColumn = Math.max(0, MouseTargetFactory._getMouseColumn(this.mouseContentHorizontalOffset, ctx.typicalHalfwidthCharacterWidth));\n\t}\n}\n\nclass HitTestRequest extends BareHitTestRequest {\n\tprivate readonly _ctx: HitTestContext;\n\tprivate readonly _eventTarget: HTMLElement | null;\n\tpublic readonly hitTestResult = new Lazy(() => MouseTargetFactory.doHitTest(this._ctx, this));\n\tprivate _useHitTestTarget: boolean;\n\tprivate _targetPathCacheElement: HTMLElement | null = null;\n\tprivate _targetPathCacheValue: Uint8Array = new Uint8Array(0);\n\n\tpublic get target(): HTMLElement | null {\n\t\tif (this._useHitTestTarget) {\n\t\t\treturn this.hitTestResult.value.hitTarget;\n\t\t}\n\t\treturn this._eventTarget;\n\t}\n\n\tpublic get targetPath(): Uint8Array {\n\t\tif (this._targetPathCacheElement !== this.target) {\n\t\t\tthis._targetPathCacheElement = this.target;\n\t\t\tthis._targetPathCacheValue = PartFingerprints.collect(this.target, this._ctx.viewDomNode);\n\t\t}\n\t\treturn this._targetPathCacheValue;\n\t}\n\n\tconstructor(ctx: HitTestContext, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor, eventTarget: HTMLElement | null) {\n\t\tsuper(ctx, editorPos, pos, relativePos);\n\t\tthis._ctx = ctx;\n\t\tthis._eventTarget = eventTarget;\n\n\t\t// If no event target is passed in, we will use the hit test target\n\t\tconst hasEventTarget = Boolean(this._eventTarget);\n\t\tthis._useHitTestTarget = !hasEventTarget;\n\t}\n\n\tpublic override toString(): string {\n\t\treturn `pos(${this.pos.x},${this.pos.y}), editorPos(${this.editorPos.x},${this.editorPos.y}), relativePos(${this.relativePos.x},${this.relativePos.y}), mouseVerticalOffset: ${this.mouseVerticalOffset}, mouseContentHorizontalOffset: ${this.mouseContentHorizontalOffset}\\n\\ttarget: ${this.target ? (<HTMLElement>this.target).outerHTML : null}`;\n\t}\n\n\tpublic get wouldBenefitFromHitTestTargetSwitch(): boolean {\n\t\treturn (\n\t\t\t!this._useHitTestTarget\n\t\t\t&& this.hitTestResult.value.hitTarget !== null\n\t\t\t&& this.target !== this.hitTestResult.value.hitTarget\n\t\t);\n\t}\n\n\tpublic switchToHitTestTarget(): void {\n\t\tthis._useHitTestTarget = true;\n\t}\n\n\tprivate _getMouseColumn(position: Position | null = null): number {\n\t\tif (position && position.column < this._ctx.viewModel.getLineMaxColumn(position.lineNumber)) {\n\t\t\t// Most likely, the line contains foreign decorations...\n\t\t\treturn CursorColumns.visibleColumnFromColumn(this._ctx.viewModel.getLineContent(position.lineNumber), position.column, this._ctx.viewModel.model.getOptions().tabSize) + 1;\n\t\t}\n\t\treturn this.mouseColumn;\n\t}\n\n\tpublic fulfillUnknown(position: Position | null = null): IMouseTargetUnknown {\n\t\treturn MouseTarget.createUnknown(this.target, this._getMouseColumn(position), position);\n\t}\n\tpublic fulfillTextarea(): IMouseTargetTextarea {\n\t\treturn MouseTarget.createTextarea(this.target, this._getMouseColumn());\n\t}\n\tpublic fulfillMargin(type: MouseTargetType.GUTTER_GLYPH_MARGIN | MouseTargetType.GUTTER_LINE_NUMBERS | MouseTargetType.GUTTER_LINE_DECORATIONS, position: Position, range: EditorRange, detail: IMouseTargetMarginData): IMouseTargetMargin {\n\t\treturn MouseTarget.createMargin(type, this.target, this._getMouseColumn(position), position, range, detail);\n\t}\n\tpublic fulfillViewZone(type: MouseTargetType.GUTTER_VIEW_ZONE | MouseTargetType.CONTENT_VIEW_ZONE, position: Position, detail: IMouseTargetViewZoneData): IMouseTargetViewZone {\n\t\t// Always return the usual mouse column for a view zone.\n\t\treturn MouseTarget.createViewZone(type, this.target, this._getMouseColumn(), position, detail);\n\t}\n\tpublic fulfillContentText(position: Position, range: EditorRange | null, detail: IMouseTargetContentTextData): IMouseTargetContentText {\n\t\treturn MouseTarget.createContentText(this.target, this._getMouseColumn(position), position, range, detail);\n\t}\n\tpublic fulfillContentEmpty(position: Position, detail: IMouseTargetContentEmptyData): IMouseTargetContentEmpty {\n\t\treturn MouseTarget.createContentEmpty(this.target, this._getMouseColumn(position), position, detail);\n\t}\n\tpublic fulfillContentWidget(detail: string): IMouseTargetContentWidget {\n\t\treturn MouseTarget.createContentWidget(this.target, this._getMouseColumn(), detail);\n\t}\n\tpublic fulfillScrollbar(position: Position): IMouseTargetScrollbar {\n\t\treturn MouseTarget.createScrollbar(this.target, this._getMouseColumn(position), position);\n\t}\n\tpublic fulfillOverlayWidget(detail: string): IMouseTargetOverlayWidget {\n\t\treturn MouseTarget.createOverlayWidget(this.target, this._getMouseColumn(), detail);\n\t}\n}\n\ninterface ResolvedHitTestRequest extends HitTestRequest {\n\treadonly target: HTMLElement;\n}\n\nconst EMPTY_CONTENT_AFTER_LINES: IMouseTargetContentEmptyData = { isAfterLines: true };\n\nfunction createEmptyContentDataInLines(horizontalDistanceToText: number): IMouseTargetContentEmptyData {\n\treturn {\n\t\tisAfterLines: false,\n\t\thorizontalDistanceToText: horizontalDistanceToText\n\t};\n}\n\nexport class MouseTargetFactory {\n\n\tprivate readonly _context: ViewContext;\n\tprivate readonly _viewHelper: IPointerHandlerHelper;\n\n\tconstructor(context: ViewContext, viewHelper: IPointerHandlerHelper) {\n\t\tthis._context = context;\n\t\tthis._viewHelper = viewHelper;\n\t}\n\n\tpublic mouseTargetIsWidget(e: EditorMouseEvent): boolean {\n\t\tconst t = <Element>e.target;\n\t\tconst path = PartFingerprints.collect(t, this._viewHelper.viewDomNode);\n\n\t\t// Is it a content widget?\n\t\tif (ElementPath.isChildOfContentWidgets(path) || ElementPath.isChildOfOverflowingContentWidgets(path)) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Is it an overlay widget?\n\t\tif (ElementPath.isChildOfOverlayWidgets(path) || ElementPath.isChildOfOverflowingOverlayWidgets(path)) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpublic createMouseTarget(lastRenderData: PointerHandlerLastRenderData, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor, target: HTMLElement | null): IMouseTarget {\n\t\tconst ctx = new HitTestContext(this._context, this._viewHelper, lastRenderData);\n\t\tconst request = new HitTestRequest(ctx, editorPos, pos, relativePos, target);\n\t\ttry {\n\t\t\tconst r = MouseTargetFactory._createMouseTarget(ctx, request);\n\n\t\t\tif (r.type === MouseTargetType.CONTENT_TEXT) {\n\t\t\t\t// Snap to the nearest soft tab boundary if atomic soft tabs are enabled.\n\t\t\t\tif (ctx.stickyTabStops && r.position !== null) {\n\t\t\t\t\tconst position = MouseTargetFactory._snapToSoftTabBoundary(r.position, ctx.viewModel);\n\t\t\t\t\tconst range = EditorRange.fromPositions(position, position).plusRange(r.range);\n\t\t\t\t\treturn request.fulfillContentText(position, range, r.detail);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// console.log(MouseTarget.toString(r));\n\t\t\treturn r;\n\t\t} catch (err) {\n\t\t\t// console.log(err);\n\t\t\treturn request.fulfillUnknown();\n\t\t}\n\t}\n\n\tprivate static _createMouseTarget(ctx: HitTestContext, request: HitTestRequest): IMouseTarget {\n\n\t\t// console.log(`${domHitTestExecuted ? '=>' : ''}CAME IN REQUEST: ${request}`);\n\n\t\tif (request.target === null) {\n\t\t\t// No target\n\t\t\treturn request.fulfillUnknown();\n\t\t}\n\n\t\t// we know for a fact that request.target is not null\n\t\tconst resolvedRequest = <ResolvedHitTestRequest>request;\n\n\t\tlet result: IMouseTarget | null = null;\n\n\t\tif (!ElementPath.isChildOfOverflowGuard(request.targetPath) && !ElementPath.isChildOfOverflowingContentWidgets(request.targetPath) && !ElementPath.isChildOfOverflowingOverlayWidgets(request.targetPath)) {\n\t\t\t// We only render dom nodes inside the overflow guard or in the overflowing content widgets\n\t\t\tresult = result || request.fulfillUnknown();\n\t\t}\n\n\t\tresult = result || MouseTargetFactory._hitTestContentWidget(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestOverlayWidget(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestMinimap(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestScrollbarSlider(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestViewZone(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestMargin(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestViewCursor(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestTextArea(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestViewLines(ctx, resolvedRequest);\n\t\tresult = result || MouseTargetFactory._hitTestScrollbar(ctx, resolvedRequest);\n\n\t\treturn (result || request.fulfillUnknown());\n\t}\n\n\tprivate static _hitTestContentWidget(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it a content widget?\n\t\tif (ElementPath.isChildOfContentWidgets(request.targetPath) || ElementPath.isChildOfOverflowingContentWidgets(request.targetPath)) {\n\t\t\tconst widgetId = ctx.findAttribute(request.target, 'widgetId');\n\t\t\tif (widgetId) {\n\t\t\t\treturn request.fulfillContentWidget(widgetId);\n\t\t\t} else {\n\t\t\t\treturn request.fulfillUnknown();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestOverlayWidget(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it an overlay widget?\n\t\tif (ElementPath.isChildOfOverlayWidgets(request.targetPath) || ElementPath.isChildOfOverflowingOverlayWidgets(request.targetPath)) {\n\t\t\tconst widgetId = ctx.findAttribute(request.target, 'widgetId');\n\t\t\tif (widgetId) {\n\t\t\t\treturn request.fulfillOverlayWidget(widgetId);\n\t\t\t} else {\n\t\t\t\treturn request.fulfillUnknown();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestViewCursor(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\n\t\tif (request.target) {\n\t\t\t// Check if we've hit a painted cursor\n\t\t\tconst lastViewCursorsRenderData = ctx.lastRenderData.lastViewCursorsRenderData;\n\n\t\t\tfor (const d of lastViewCursorsRenderData) {\n\n\t\t\t\tif (request.target === d.domNode) {\n\t\t\t\t\treturn request.fulfillContentText(d.position, null, { mightBeForeignElement: false, injectedText: null });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (request.isInContentArea) {\n\t\t\t// Edge has a bug when hit-testing the exact position of a cursor,\n\t\t\t// instead of returning the correct dom node, it returns the\n\t\t\t// first or last rendered view line dom node, therefore help it out\n\t\t\t// and first check if we are on top of a cursor\n\n\t\t\tconst lastViewCursorsRenderData = ctx.lastRenderData.lastViewCursorsRenderData;\n\t\t\tconst mouseContentHorizontalOffset = request.mouseContentHorizontalOffset;\n\t\t\tconst mouseVerticalOffset = request.mouseVerticalOffset;\n\n\t\t\tfor (const d of lastViewCursorsRenderData) {\n\n\t\t\t\tif (mouseContentHorizontalOffset < d.contentLeft) {\n\t\t\t\t\t// mouse position is to the left of the cursor\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (mouseContentHorizontalOffset > d.contentLeft + d.width) {\n\t\t\t\t\t// mouse position is to the right of the cursor\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst cursorVerticalOffset = ctx.getVerticalOffsetForLineNumber(d.position.lineNumber);\n\n\t\t\t\tif (\n\t\t\t\t\tcursorVerticalOffset <= mouseVerticalOffset\n\t\t\t\t\t&& mouseVerticalOffset <= cursorVerticalOffset + d.height\n\t\t\t\t) {\n\t\t\t\t\treturn request.fulfillContentText(d.position, null, { mightBeForeignElement: false, injectedText: null });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestViewZone(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tconst viewZoneData = ctx.getZoneAtCoord(request.mouseVerticalOffset);\n\t\tif (viewZoneData) {\n\t\t\tconst mouseTargetType = (request.isInContentArea ? MouseTargetType.CONTENT_VIEW_ZONE : MouseTargetType.GUTTER_VIEW_ZONE);\n\t\t\treturn request.fulfillViewZone(mouseTargetType, viewZoneData.position, viewZoneData);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestTextArea(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it the textarea?\n\t\tif (ElementPath.isTextArea(request.targetPath)) {\n\t\t\tif (ctx.lastRenderData.lastTextareaPosition) {\n\t\t\t\treturn request.fulfillContentText(ctx.lastRenderData.lastTextareaPosition, null, { mightBeForeignElement: false, injectedText: null });\n\t\t\t}\n\t\t\treturn request.fulfillTextarea();\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestMargin(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (request.isInMarginArea) {\n\t\t\tconst res = ctx.getFullLineRangeAtCoord(request.mouseVerticalOffset);\n\t\t\tconst pos = res.range.getStartPosition();\n\t\t\tlet offset = Math.abs(request.relativePos.x);\n\t\t\tconst detail: Mutable<IMouseTargetMarginData> = {\n\t\t\t\tisAfterLines: res.isAfterLines,\n\t\t\t\tglyphMarginLeft: ctx.layoutInfo.glyphMarginLeft,\n\t\t\t\tglyphMarginWidth: ctx.layoutInfo.glyphMarginWidth,\n\t\t\t\tlineNumbersWidth: ctx.layoutInfo.lineNumbersWidth,\n\t\t\t\toffsetX: offset\n\t\t\t};\n\n\t\t\toffset -= ctx.layoutInfo.glyphMarginLeft;\n\n\t\t\tif (offset <= ctx.layoutInfo.glyphMarginWidth) {\n\t\t\t\t// On the glyph margin\n\t\t\t\tconst modelCoordinate = ctx.viewModel.coordinatesConverter.convertViewPositionToModelPosition(res.range.getStartPosition());\n\t\t\t\tconst lanes = ctx.viewModel.glyphLanes.getLanesAtLine(modelCoordinate.lineNumber);\n\t\t\t\tdetail.glyphMarginLane = lanes[Math.floor(offset / ctx.lineHeight)];\n\t\t\t\treturn request.fulfillMargin(MouseTargetType.GUTTER_GLYPH_MARGIN, pos, res.range, detail);\n\t\t\t}\n\t\t\toffset -= ctx.layoutInfo.glyphMarginWidth;\n\n\t\t\tif (offset <= ctx.layoutInfo.lineNumbersWidth) {\n\t\t\t\t// On the line numbers\n\t\t\t\treturn request.fulfillMargin(MouseTargetType.GUTTER_LINE_NUMBERS, pos, res.range, detail);\n\t\t\t}\n\t\t\toffset -= ctx.layoutInfo.lineNumbersWidth;\n\n\t\t\t// On the line decorations\n\t\t\treturn request.fulfillMargin(MouseTargetType.GUTTER_LINE_DECORATIONS, pos, res.range, detail);\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestViewLines(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (!ElementPath.isChildOfViewLines(request.targetPath)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (ctx.isInTopPadding(request.mouseVerticalOffset)) {\n\t\t\treturn request.fulfillContentEmpty(new Position(1, 1), EMPTY_CONTENT_AFTER_LINES);\n\t\t}\n\n\t\t// Check if it is below any lines and any view zones\n\t\tif (ctx.isAfterLines(request.mouseVerticalOffset) || ctx.isInBottomPadding(request.mouseVerticalOffset)) {\n\t\t\t// This most likely indicates it happened after the last view-line\n\t\t\tconst lineCount = ctx.viewModel.getLineCount();\n\t\t\tconst maxLineColumn = ctx.viewModel.getLineMaxColumn(lineCount);\n\t\t\treturn request.fulfillContentEmpty(new Position(lineCount, maxLineColumn), EMPTY_CONTENT_AFTER_LINES);\n\t\t}\n\n\t\t// Check if we are hitting a view-line (can happen in the case of inline decorations on empty lines)\n\t\t// See https://github.com/microsoft/vscode/issues/46942\n\t\tif (ElementPath.isStrictChildOfViewLines(request.targetPath)) {\n\t\t\tconst lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\tconst lineLength = ctx.viewModel.getLineLength(lineNumber);\n\t\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\t\t\tif (lineLength === 0) {\n\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\treturn request.fulfillContentEmpty(new Position(lineNumber, 1), detail);\n\t\t\t}\n\n\t\t\tconst isRtl = ctx.isRtl(lineNumber);\n\t\t\tif (isRtl) {\n\t\t\t\tif (request.mouseContentHorizontalOffset + lineWidth <= ctx.layoutInfo.contentWidth - ctx.layoutInfo.verticalScrollbarWidth) {\n\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t\t}\n\t\t\t} else if (request.mouseContentHorizontalOffset >= lineWidth) {\n\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t}\n\t\t} else {\n\t\t\tif (ctx.viewLinesGpu) {\n\t\t\t\tconst lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\t\tif (ctx.viewModel.getLineLength(lineNumber) === 0) {\n\t\t\t\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\treturn request.fulfillContentEmpty(new Position(lineNumber, 1), detail);\n\t\t\t\t}\n\n\t\t\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\t\t\t\tconst isRtl = ctx.isRtl(lineNumber);\n\t\t\t\tif (isRtl) {\n\t\t\t\t\tif (request.mouseContentHorizontalOffset + lineWidth <= ctx.layoutInfo.contentWidth - ctx.layoutInfo.verticalScrollbarWidth) {\n\t\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t\t\t}\n\t\t\t\t} else if (request.mouseContentHorizontalOffset >= lineWidth) {\n\t\t\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\t\t\tconst pos = new Position(lineNumber, ctx.viewModel.getLineMaxColumn(lineNumber));\n\t\t\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t\t\t}\n\n\t\t\t\tconst position = ctx.viewLinesGpu.getPositionAtCoordinate(lineNumber, request.mouseContentHorizontalOffset);\n\t\t\t\tif (position) {\n\t\t\t\t\tconst detail: IMouseTargetContentTextData = {\n\t\t\t\t\t\tinjectedText: null,\n\t\t\t\t\t\tmightBeForeignElement: false\n\t\t\t\t\t};\n\t\t\t\t\treturn request.fulfillContentText(position, EditorRange.fromPositions(position, position), detail);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Do the hit test (if not already done)\n\t\tconst hitTestResult = request.hitTestResult.value;\n\n\t\tif (hitTestResult.type === HitTestResultType.Content) {\n\t\t\treturn MouseTargetFactory.createMouseTargetFromHitTestPosition(ctx, request, hitTestResult.spanNode, hitTestResult.position, hitTestResult.injectedText);\n\t\t}\n\n\t\t// We didn't hit content...\n\t\tif (request.wouldBenefitFromHitTestTargetSwitch) {\n\t\t\t// We actually hit something different... Give it one last change by trying again with this new target\n\t\t\trequest.switchToHitTestTarget();\n\t\t\treturn this._createMouseTarget(ctx, request);\n\t\t}\n\n\t\t// We have tried everything...\n\t\treturn request.fulfillUnknown();\n\t}\n\n\tprivate static _hitTestMinimap(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (ElementPath.isChildOfMinimap(request.targetPath)) {\n\t\t\tconst possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\tconst maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber);\n\t\t\treturn request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn));\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestScrollbarSlider(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\tif (ElementPath.isChildOfScrollableElement(request.targetPath)) {\n\t\t\tif (request.target && request.target.nodeType === 1) {\n\t\t\t\tconst className = request.target.className;\n\t\t\t\tif (className && /\\b(slider|scrollbar)\\b/.test(className)) {\n\t\t\t\t\tconst possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\t\t\tconst maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber);\n\t\t\t\t\treturn request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate static _hitTestScrollbar(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {\n\t\t// Is it the overview ruler?\n\t\t// Is it a child of the scrollable element?\n\t\tif (ElementPath.isChildOfScrollableElement(request.targetPath)) {\n\t\t\tconst possibleLineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\t\tconst maxColumn = ctx.viewModel.getLineMaxColumn(possibleLineNumber);\n\t\t\treturn request.fulfillScrollbar(new Position(possibleLineNumber, maxColumn));\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic getMouseColumn(relativePos: CoordinatesRelativeToEditor): number {\n\t\tconst options = this._context.configuration.options;\n\t\tconst layoutInfo = options.get(EditorOption.layoutInfo);\n\t\tconst mouseContentHorizontalOffset = this._context.viewLayout.getCurrentScrollLeft() + relativePos.x - layoutInfo.contentLeft;\n\t\treturn MouseTargetFactory._getMouseColumn(mouseContentHorizontalOffset, options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth);\n\t}\n\n\tpublic static _getMouseColumn(mouseContentHorizontalOffset: number, typicalHalfwidthCharacterWidth: number): number {\n\t\tif (mouseContentHorizontalOffset < 0) {\n\t\t\treturn 1;\n\t\t}\n\t\tconst chars = Math.round(mouseContentHorizontalOffset / typicalHalfwidthCharacterWidth);\n\t\treturn (chars + 1);\n\t}\n\n\tprivate static createMouseTargetFromHitTestPosition(ctx: HitTestContext, request: HitTestRequest, spanNode: HTMLElement, pos: Position, injectedText: InjectedText | null): IMouseTarget {\n\t\tconst lineNumber = pos.lineNumber;\n\t\tconst column = pos.column;\n\n\t\tconst lineWidth = ctx.getLineWidth(lineNumber);\n\n\t\tif (request.mouseContentHorizontalOffset > lineWidth) {\n\t\t\tconst detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth);\n\t\t\treturn request.fulfillContentEmpty(pos, detail);\n\t\t}\n\n\t\tconst visibleRange = ctx.visibleRangeForPosition(lineNumber, column);\n\n\t\tif (!visibleRange) {\n\t\t\treturn request.fulfillUnknown(pos);\n\t\t}\n\n\t\tconst columnHorizontalOffset = visibleRange.left;\n\n\t\tif (Math.abs(request.mouseContentHorizontalOffset - columnHorizontalOffset) < 1) {\n\t\t\treturn request.fulfillContentText(pos, null, { mightBeForeignElement: !!injectedText, injectedText });\n\t\t}\n\n\t\t// Let's define a, b, c and check if the offset is in between them...\n\t\tinterface OffsetColumn { offset: number; column: number }\n\n\t\tconst points: OffsetColumn[] = [];\n\t\tpoints.push({ offset: visibleRange.left, column: column });\n\t\tif (column > 1) {\n\t\t\tconst visibleRange = ctx.visibleRangeForPosition(lineNumber, column - 1);\n\t\t\tif (visibleRange) {\n\t\t\t\tpoints.push({ offset: visibleRange.left, column: column - 1 });\n\t\t\t}\n\t\t}\n\t\tconst lineMaxColumn = ctx.viewModel.getLineMaxColumn(lineNumber);\n\t\tif (column < lineMaxColumn) {\n\t\t\tconst visibleRange = ctx.visibleRangeForPosition(lineNumber, column + 1);\n\t\t\tif (visibleRange) {\n\t\t\t\tpoints.push({ offset: visibleRange.left, column: column + 1 });\n\t\t\t}\n\t\t}\n\n\t\tpoints.sort((a, b) => a.offset - b.offset);\n\n\t\tconst mouseCoordinates = request.pos.toClientCoordinates(dom.getWindow(ctx.viewDomNode));\n\t\tconst spanNodeClientRect = spanNode.getBoundingClientRect();\n\t\tconst mouseIsOverSpanNode = (spanNodeClientRect.left <= mouseCoordinates.clientX && mouseCoordinates.clientX <= spanNodeClientRect.right);\n\n\t\tlet rng: EditorRange | null = null;\n\n\t\tfor (let i = 1; i < points.length; i++) {\n\t\t\tconst prev = points[i - 1];\n\t\t\tconst curr = points[i];\n\t\t\tif (prev.offset <= request.mouseContentHorizontalOffset && request.mouseContentHorizontalOffset <= curr.offset) {\n\t\t\t\trng = new EditorRange(lineNumber, prev.column, lineNumber, curr.column);\n\n\t\t\t\t// See https://github.com/microsoft/vscode/issues/152819\n\t\t\t\t// Due to the use of zwj, the browser's hit test result is skewed towards the left\n\t\t\t\t// Here we try to correct that if the mouse horizontal offset is closer to the right than the left\n\n\t\t\t\tconst prevDelta = Math.abs(prev.offset - request.mouseContentHorizontalOffset);\n\t\t\t\tconst nextDelta = Math.abs(curr.offset - request.mouseContentHorizontalOffset);\n\n\t\t\t\tpos = (\n\t\t\t\t\tprevDelta < nextDelta\n\t\t\t\t\t\t? new Position(lineNumber, prev.column)\n\t\t\t\t\t\t: new Position(lineNumber, curr.column)\n\t\t\t\t);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn request.fulfillContentText(pos, rng, { mightBeForeignElement: !mouseIsOverSpanNode || !!injectedText, injectedText });\n\t}\n\n\t/**\n\t * Most probably WebKit browsers and Edge\n\t */\n\tprivate static _doHitTestWithCaretRangeFromPoint(ctx: HitTestContext, request: BareHitTestRequest): HitTestResult {\n\n\t\t// In Chrome, especially on Linux it is possible to click between lines,\n\t\t// so try to adjust the `hity` below so that it lands in the center of a line\n\t\tconst lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset);\n\t\tconst lineStartVerticalOffset = ctx.getVerticalOffsetForLineNumber(lineNumber);\n\t\tconst lineEndVerticalOffset = lineStartVerticalOffset + ctx.lineHeight;\n\n\t\tconst isBelowLastLine = (\n\t\t\tlineNumber === ctx.viewModel.getLineCount()\n\t\t\t&& request.mouseVerticalOffset > lineEndVerticalOffset\n\t\t);\n\n\t\tif (!isBelowLastLine) {\n\t\t\tconst lineCenteredVerticalOffset = Math.floor((lineStartVerticalOffset + lineEndVerticalOffset) / 2);\n\t\t\tlet adjustedPageY = request.pos.y + (lineCenteredVerticalOffset - request.mouseVerticalOffset);\n\n\t\t\tif (adjustedPageY <= request.editorPos.y) {\n\t\t\t\tadjustedPageY = request.editorPos.y + 1;\n\t\t\t}\n\t\t\tif (adjustedPageY >= request.editorPos.y + request.editorPos.height) {\n\t\t\t\tadjustedPageY = request.editorPos.y + request.editorPos.height - 1;\n\t\t\t}\n\n\t\t\tconst adjustedPage = new PageCoordinates(request.pos.x, adjustedPageY);\n\n\t\t\tconst r = this._actualDoHitTestWithCaretRangeFromPoint(ctx, adjustedPage.toClientCoordinates(dom.getWindow(ctx.viewDomNode)));\n\t\t\tif (r.type === HitTestResultType.Content) {\n\t\t\t\treturn r;\n\t\t\t}\n\t\t}\n\n\t\t// Also try to hit test without the adjustment (for the edge cases that we are near the top or bottom)\n\t\treturn this._actualDoHitTestWithCaretRangeFromPoint(ctx, request.pos.toClientCoordinates(dom.getWindow(ctx.viewDomNode)));\n\t}\n\n\tprivate static _actualDoHitTestWithCaretRangeFromPoint(ctx: HitTestContext, coords: ClientCoordinates): HitTestResult {\n\t\tconst shadowRoot = dom.getShadowRoot(ctx.viewDomNode);\n\t\tlet range: Range;\n\t\tif (shadowRoot) {\n\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t\tif (typeof (<any>shadowRoot).caretRangeFromPoint === 'undefined') {\n\t\t\t\trange = shadowCaretRangeFromPoint(shadowRoot, coords.clientX, coords.clientY);\n\t\t\t} else {\n\t\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t\t\trange = (<any>shadowRoot).caretRangeFromPoint(coords.clientX, coords.clientY);\n\t\t\t}\n\t\t} else {\n\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t\trange = (<any>ctx.viewDomNode.ownerDocument).caretRangeFromPoint(coords.clientX, coords.clientY);\n\t\t}\n\n\t\tif (!range || !range.startContainer) {\n\t\t\treturn new UnknownHitTestResult();\n\t\t}\n\n\t\t// Chrome always hits a TEXT_NODE, while Edge sometimes hits a token span\n\t\tconst startContainer = range.startContainer;\n\n\t\tif (startContainer.nodeType === startContainer.TEXT_NODE) {\n\t\t\t// startContainer is expected to be the token text\n\t\t\tconst parent1 = startContainer.parentNode; // expected to be the token span\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null; // expected to be the view line container span\n\t\t\tconst parent3 = parent2 ? parent2.parentNode : null; // expected to be the view line div\n\t\t\tconst parent3ClassName = parent3 && parent3.nodeType === parent3.ELEMENT_NODE ? (<HTMLElement>parent3).className : null;\n\n\t\t\tif (parent3ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>parent1, range.startOffset);\n\t\t\t} else {\n\t\t\t\treturn new UnknownHitTestResult(<HTMLElement>startContainer.parentNode);\n\t\t\t}\n\t\t} else if (startContainer.nodeType === startContainer.ELEMENT_NODE) {\n\t\t\t// startContainer is expected to be the token span\n\t\t\tconst parent1 = startContainer.parentNode; // expected to be the view line container span\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null; // expected to be the view line div\n\t\t\tconst parent2ClassName = parent2 && parent2.nodeType === parent2.ELEMENT_NODE ? (<HTMLElement>parent2).className : null;\n\n\t\t\tif (parent2ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>startContainer, (<HTMLElement>startContainer).textContent!.length);\n\t\t\t} else {\n\t\t\t\treturn new UnknownHitTestResult(<HTMLElement>startContainer);\n\t\t\t}\n\t\t}\n\n\t\treturn new UnknownHitTestResult();\n\t}\n\n\t/**\n\t * Most probably Gecko\n\t */\n\tprivate static _doHitTestWithCaretPositionFromPoint(ctx: HitTestContext, coords: ClientCoordinates): HitTestResult {\n\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\tconst hitResult: { offsetNode: Node; offset: number } = (<any>ctx.viewDomNode.ownerDocument).caretPositionFromPoint(coords.clientX, coords.clientY);\n\n\t\tif (hitResult.offsetNode.nodeType === hitResult.offsetNode.TEXT_NODE) {\n\t\t\t// offsetNode is expected to be the token text\n\t\t\tconst parent1 = hitResult.offsetNode.parentNode; // expected to be the token span\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null; // expected to be the view line container span\n\t\t\tconst parent3 = parent2 ? parent2.parentNode : null; // expected to be the view line div\n\t\t\tconst parent3ClassName = parent3 && parent3.nodeType === parent3.ELEMENT_NODE ? (<HTMLElement>parent3).className : null;\n\n\t\t\tif (parent3ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>hitResult.offsetNode.parentNode, hitResult.offset);\n\t\t\t} else {\n\t\t\t\treturn new UnknownHitTestResult(<HTMLElement>hitResult.offsetNode.parentNode);\n\t\t\t}\n\t\t}\n\n\t\t// For inline decorations, Gecko sometimes returns the `<span>` of the line and the offset is the `<span>` with the inline decoration\n\t\t// Some other times, it returns the `<span>` with the inline decoration\n\t\tif (hitResult.offsetNode.nodeType === hitResult.offsetNode.ELEMENT_NODE) {\n\t\t\tconst parent1 = hitResult.offsetNode.parentNode;\n\t\t\tconst parent1ClassName = parent1 && parent1.nodeType === parent1.ELEMENT_NODE ? (<HTMLElement>parent1).className : null;\n\t\t\tconst parent2 = parent1 ? parent1.parentNode : null;\n\t\t\tconst parent2ClassName = parent2 && parent2.nodeType === parent2.ELEMENT_NODE ? (<HTMLElement>parent2).className : null;\n\n\t\t\tif (parent1ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\t// it returned the `<span>` of the line and the offset is the `<span>` with the inline decoration\n\t\t\t\tconst tokenSpan = hitResult.offsetNode.childNodes[Math.min(hitResult.offset, hitResult.offsetNode.childNodes.length - 1)];\n\t\t\t\tif (tokenSpan) {\n\t\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>tokenSpan, 0);\n\t\t\t\t}\n\t\t\t} else if (parent2ClassName === ViewLine.CLASS_NAME) {\n\t\t\t\t// it returned the `<span>` with the inline decoration\n\t\t\t\treturn HitTestResult.createFromDOMInfo(ctx, <HTMLElement>hitResult.offsetNode, 0);\n\t\t\t}\n\t\t}\n\n\t\treturn new UnknownHitTestResult(<HTMLElement>hitResult.offsetNode);\n\t}\n\n\tprivate static _snapToSoftTabBoundary(position: Position, viewModel: IViewModel): Position {\n\t\tconst lineContent = viewModel.getLineContent(position.lineNumber);\n\t\tconst { tabSize } = viewModel.model.getOptions();\n\t\tconst newPosition = AtomicTabMoveOperations.atomicPosition(lineContent, position.column - 1, tabSize, Direction.Nearest);\n\t\tif (newPosition !== -1) {\n\t\t\treturn new Position(position.lineNumber, newPosition + 1);\n\t\t}\n\t\treturn position;\n\t}\n\n\tpublic static doHitTest(ctx: HitTestContext, request: BareHitTestRequest): HitTestResult {\n\n\t\tlet result: HitTestResult = new UnknownHitTestResult();\n\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\tif (typeof (<any>ctx.viewDomNode.ownerDocument).caretRangeFromPoint === 'function') {\n\t\t\tresult = this._doHitTestWithCaretRangeFromPoint(ctx, request);\n\t\t\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\t\t} else if ((<any>ctx.viewDomNode.ownerDocument).caretPositionFromPoint) {\n\t\t\tresult = this._doHitTestWithCaretPositionFromPoint(ctx, request.pos.toClientCoordinates(dom.getWindow(ctx.viewDomNode)));\n\t\t}\n\t\tif (result.type === HitTestResultType.Content) {\n\t\t\tconst injectedText = ctx.viewModel.getInjectedTextAt(result.position);\n\n\t\t\tconst normalizedPosition = ctx.viewModel.normalizePosition(result.position, PositionAffinity.None);\n\t\t\tif (injectedText || !normalizedPosition.equals(result.position)) {\n\t\t\t\tresult = new ContentHitTestResult(normalizedPosition, result.spanNode, injectedText);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n}\n\nfunction shadowCaretRangeFromPoint(shadowRoot: ShadowRoot, x: number, y: number): Range {\n\tconst range = document.createRange();\n\n\t// Get the element under the point\n\t// eslint-disable-next-line local/code-no-any-casts, @typescript-eslint/no-explicit-any\n\tlet el: HTMLElement | null = (<any>shadowRoot).elementFromPoint(x, y);\n\t// When el is not null, it may be div.monaco-mouse-cursor-text Element, which has not childNodes, we don't need to handle it.\n\tif (el?.hasChildNodes()) {\n\t\t// Get the last child of the element until its firstChild is a text node\n\t\t// This assumes that the pointer is on the right of the line, out of the tokens\n\t\t// and that we want to get the offset of the last token of the line\n\t\twhile (el && el.firstChild && el.firstChild.nodeType !== el.firstChild.TEXT_NODE && el.lastChild && el.lastChild.firstChild) {\n\t\t\tel = <HTMLElement>el.lastChild;\n\t\t}\n\n\t\t// Grab its rect\n\t\tconst rect = el.getBoundingClientRect();\n\n\t\t// And its font (the computed shorthand font property might be empty, see #3217)\n\t\tconst elWindow = dom.getWindow(el);\n\t\tconst fontStyle = elWindow.getComputedStyle(el, null).getPropertyValue('font-style');\n\t\tconst fontVariant = elWindow.getComputedStyle(el, null).getPropertyValue('font-variant');\n\t\tconst fontWeight = elWindow.getComputedStyle(el, null).getPropertyValue('font-weight');\n\t\tconst fontSize = elWindow.getComputedStyle(el, null).getPropertyValue('font-size');\n\t\tconst lineHeight = elWindow.getComputedStyle(el, null).getPropertyValue('line-height');\n\t\tconst fontFamily = elWindow.getComputedStyle(el, null).getPropertyValue('font-family');\n\t\tconst font = `${fontStyle} ${fontVariant} ${fontWeight} ${fontSize}/${lineHeight} ${fontFamily}`;\n\n\t\t// And also its txt content\n\t\tconst text = el.innerText;\n\n\t\t// Position the pixel cursor at the left of the element\n\t\tlet pixelCursor = rect.left;\n\t\tlet offset = 0;\n\t\tlet step: number;\n\n\t\t// If the point is on the right of the box put the cursor after the last character\n\t\tif (x > rect.left + rect.width) {\n\t\t\toffset = text.length;\n\t\t} else {\n\t\t\tconst charWidthReader = CharWidthReader.getInstance();\n\t\t\t// Goes through all the characters of the innerText, and checks if the x of the point\n\t\t\t// belongs to the character.\n\t\t\tfor (let i = 0; i < text.length + 1; i++) {\n\t\t\t\t// The step is half the width of the character\n\t\t\t\tstep = charWidthReader.getCharWidth(text.charAt(i), font) / 2;\n\t\t\t\t// Move to the center of the character\n\t\t\t\tpixelCursor += step;\n\t\t\t\t// If the x of the point is smaller that the position of the cursor, the point is over that character\n\t\t\t\tif (x < pixelCursor) {\n\t\t\t\t\toffset = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// Move between the current character and the next\n\t\t\t\tpixelCursor += step;\n\t\t\t}\n\t\t}\n\n\t\t// Creates a range with the text node of the element and set the offset found\n\t\trange.setStart(el.firstChild!, offset);\n\t\trange.setEnd(el.firstChild!, offset);\n\t}\n\n\treturn range;\n}\n\nclass CharWidthReader {\n\tprivate static _INSTANCE: CharWidthReader | null = null;\n\n\tpublic static getInstance(): CharWidthReader {\n\t\tif (!CharWidthReader._INSTANCE) {\n\t\t\tCharWidthReader._INSTANCE = new CharWidthReader();\n\t\t}\n\t\treturn CharWidthReader._INSTANCE;\n\t}\n\n\tprivate readonly _cache: { [cacheKey: string]: number };\n\tprivate readonly _canvas: HTMLCanvasElement;\n\n\tprivate constructor() {\n\t\tthis._cache = {};\n\t\tthis._canvas = document.createElement('canvas');\n\t}\n\n\tpublic getCharWidth(char: string, font: string): number {\n\t\tconst cacheKey = char + font;\n\t\tif (this._cache[cacheKey]) {\n\t\t\treturn this._cache[cacheKey];\n\t\t}\n\n\t\tconst context = this._canvas.getContext('2d')!;\n\t\tcontext.font = font;\n\t\tconst metrics = context.measureText(char);\n\t\tconst width = metrics.width;\n\t\tthis._cache[cacheKey] = width;\n\t\treturn width;\n\t}\n}\n"]}
|