diff --git a/addons/xterm-addon-web-links/src/WebLinkProvider.ts b/addons/xterm-addon-web-links/src/WebLinkProvider.ts index a5875e9f5..ea14538f6 100644 --- a/addons/xterm-addon-web-links/src/WebLinkProvider.ts +++ b/addons/xterm-addon-web-links/src/WebLinkProvider.ts @@ -1,6 +1,6 @@ import { ILinkProvider, IBufferCellPosition, ILink, Terminal, IBuffer } from 'xterm'; -export default class WebLinkProvider implements ILinkProvider { +export class WebLinkProvider implements ILinkProvider { constructor( private readonly _terminal: Terminal, diff --git a/addons/xterm-addon-web-links/src/WebLinksAddon.ts b/addons/xterm-addon-web-links/src/WebLinksAddon.ts index 4dbcc3366..c5e625740 100644 --- a/addons/xterm-addon-web-links/src/WebLinksAddon.ts +++ b/addons/xterm-addon-web-links/src/WebLinksAddon.ts @@ -3,8 +3,8 @@ * @license MIT */ -import { Terminal, ILinkMatcherOptions, ITerminalAddon, ILinkProvider } from 'xterm'; -import WebLinkProvider from './WebLinkProvider'; +import { Terminal, ILinkMatcherOptions, ITerminalAddon, ILinkProvider, IDisposable } from 'xterm'; +import { WebLinkProvider } from './WebLinkProvider'; const protocolClause = '(https?:\\/\\/)'; const domainCharacterSet = '[\\da-z\\.-]+'; @@ -33,7 +33,7 @@ function handleLink(event: MouseEvent, uri: string): void { export class WebLinksAddon implements ITerminalAddon { private _linkMatcherId: number | undefined; private _terminal: Terminal | undefined; - private _linkProvider: ILinkProvider | undefined; + private _linkProvider: IDisposable | undefined; constructor( private _handler: (event: MouseEvent, uri: string) => void = handleLink, @@ -46,8 +46,7 @@ export class WebLinksAddon implements ITerminalAddon { this._terminal = terminal; if ('registerLinkProvider' in this._terminal as any) { - this._linkProvider = new WebLinkProvider(this._terminal, strictUrlRegex, this._handler); - this._terminal.registerLinkProvider(this._linkProvider); + this._linkProvider = this._terminal.registerLinkProvider(new WebLinkProvider(this._terminal, strictUrlRegex, this._handler)); } else { this._linkMatcherId = this._terminal.registerLinkMatcher(strictUrlRegex, this._handler, this._options); } @@ -57,5 +56,9 @@ export class WebLinksAddon implements ITerminalAddon { if (this._linkMatcherId !== undefined && this._terminal !== undefined) { this._terminal.deregisterLinkMatcher(this._linkMatcherId); } + + if (this._linkProvider) { + this._linkProvider.dispose(); + } } } diff --git a/src/Terminal.ts b/src/Terminal.ts index 82f9ef9ff..30144a62b 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -1171,9 +1171,6 @@ export class Terminal extends Disposable implements ITerminal, IDisposable, IInp } public registerLinkProvider(linkProvider: ILinkProvider): IDisposable { - if (!this.linkifier2) { - return; - } return this.linkifier2.registerLinkProvider(linkProvider); } diff --git a/src/browser/Linkifier2.ts b/src/browser/Linkifier2.ts index 8d76dd06e..d133db8de 100644 --- a/src/browser/Linkifier2.ts +++ b/src/browser/Linkifier2.ts @@ -1,17 +1,14 @@ +/** + * Copyright (c) 2019 The xterm.js authors. All rights reserved. + * @license MIT + */ + import { ILinkifier2, ILinkProvider, IBufferCellPosition, ILink, ILinkifierEvent, IBufferRange } from './Types'; import { IDisposable } from 'common/Types'; import { IMouseService } from './services/Services'; import { IBufferService, ICoreService } from 'common/services/Services'; import { EventEmitter, IEvent } from 'common/EventEmitter'; -/** - * Copyright (c) 2017 The xterm.js authors. All rights reserved. - * @license MIT - */ - - -/** - */ export class Linkifier2 implements ILinkifier2 { private _element: HTMLElement | undefined; private _viewportElement: HTMLElement | undefined; @@ -69,21 +66,13 @@ export class Linkifier2 implements ILinkifier2 { } // Check the cache for a link and determine if we need to show or hide tooltip - let foundLink = false; let mouseOver = false; for (let i = 0; i < this._linkCache.length; i++) { const cachedLink = this._linkCache[i].link; const isInPosition = this._linkAtPosition(cachedLink, position); - // Check if the mouse position contains a link - // Also check if it isn't the current line - if (isInPosition && !this._linkCache[i].mouseOver && position.y < this._bufferService.buffer.y) { - // Show the tooltip - this._showTooltip(this._element, this._linkCache[i].link, event); - this._linkCache[i].mouseOver = true; - foundLink = true; - this._mouseOverLink = true; - } else if (!isInPosition && this._linkCache[i].mouseOver) { + // Check if we need to hide the tooltip + if (!isInPosition && this._linkCache[i].mouseOver) { // Hide the tooltip this._hideTooltip(this._element, this._linkCache[i].link, event); this._linkCache[i].mouseOver = false; @@ -94,12 +83,9 @@ export class Linkifier2 implements ILinkifier2 { } } - if (foundLink) { - return; - } - if (!mouseOver) { this._mouseOverLink = false; + this._linkCache = []; } // The is no link in the cache, so ask for one