Remove link caching

This commit is contained in:
Jon Bockhorst
2019-11-05 13:01:53 -06:00
parent fdfadfefbc
commit 28c43ac2bf
4 changed files with 17 additions and 31 deletions
@@ -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,
@@ -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();
}
}
}
-3
View File
@@ -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);
}
+8 -22
View File
@@ -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