diff --git a/addons/xterm-addon-web-links/src/WebLinkProvider.ts b/addons/xterm-addon-web-links/src/WebLinkProvider.ts index d32a8166b4..ea43aae644 100644 --- a/addons/xterm-addon-web-links/src/WebLinkProvider.ts +++ b/addons/xterm-addon-web-links/src/WebLinkProvider.ts @@ -49,7 +49,7 @@ export class LinkComputer { break; } - let endX = stringIndex + text.length + 1; + let endX = stringIndex + text.length; let endY = startLineIndex + 1; while (endX > terminal.cols) { diff --git a/src/browser/Linkifier2.test.ts b/src/browser/Linkifier2.test.ts new file mode 100644 index 0000000000..bcf068a84f --- /dev/null +++ b/src/browser/Linkifier2.test.ts @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2020 The xterm.js authors. All rights reserved. + * @license MIT + */ + +import { assert } from 'chai'; +import { IBufferService } from 'common/services/Services'; +import { Linkifier2 } from 'browser/Linkifier2'; +import { MockBufferService } from 'common/TestUtils.test'; +import { ILink } from 'browser/Types'; + +class TestLinkifier2 extends Linkifier2 { + constructor(bufferService: IBufferService) { + super(bufferService); + } + + public linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void { + this._linkHover(element, link, event); + } + + public linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void { + this._linkLeave(element, link, event); + } +} + +describe('Linkifier2', () => { + let bufferService: IBufferService; + let linkifier: TestLinkifier2; + + beforeEach(() => { + bufferService = new MockBufferService(100, 10); + linkifier = new TestLinkifier2(bufferService); + }); + + const link: ILink = { + text: 'foo', + range: { + start: { + x: 5, + y: 1 + }, + end: { + x: 7, + y: 1 + } + }, + activate: () => { } + }; + + it('onLinkHover event range is correct', done => { + linkifier.onLinkHover(e => { + assert.equal(link.range.start.x - 1, e.x1); + assert.equal(link.range.start.y - 1, e.y1); + assert.equal(link.range.end.x, e.x2); + assert.equal(link.range.end.y - 1, e.y2); + + done(); + }); + + linkifier.linkHover({ classList: { add: () => { } } } as any, link, {} as any); + }); + + it('onLinkLeave event range is correct', done => { + linkifier.onLinkLeave(e => { + assert.equal(link.range.start.x - 1, e.x1); + assert.equal(link.range.start.y - 1, e.y1); + assert.equal(link.range.end.x, e.x2); + assert.equal(link.range.end.y - 1, e.y2); + + done(); + }); + + linkifier.linkLeave({ classList: { add: () => { } } } as any, link, {} as any); + }); + +}); diff --git a/src/browser/Linkifier2.ts b/src/browser/Linkifier2.ts index 2eeec1dff6..8936771887 100644 --- a/src/browser/Linkifier2.ts +++ b/src/browser/Linkifier2.ts @@ -6,7 +6,7 @@ import { ILinkifier2, ILinkProvider, IBufferCellPosition, ILink, ILinkifierEvent } from './Types'; import { IDisposable } from 'common/Types'; import { IMouseService, IRenderService } from './services/Services'; -import { IBufferService, ICoreService } from 'common/services/Services'; +import { IBufferService } from 'common/services/Services'; import { EventEmitter, IEvent } from 'common/EventEmitter'; export class Linkifier2 implements ILinkifier2 { @@ -180,11 +180,11 @@ export class Linkifier2 implements ILinkifier2 { } } - private _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void { + protected _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void { const range = link.range; const scrollOffset = this._bufferService.buffer.ydisp; - this._onLinkHover.fire(this._createLinkHoverEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x - 1, range.end.y - scrollOffset - 1, undefined)); + this._onLinkHover.fire(this._createLinkHoverEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined)); element.classList.add('xterm-cursor-pointer'); if (link.hover) { @@ -192,11 +192,11 @@ export class Linkifier2 implements ILinkifier2 { } } - private _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void { + protected _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void { const range = link.range; const scrollOffset = this._bufferService.buffer.ydisp; - this._onLinkLeave.fire(this._createLinkHoverEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x - 1, range.end.y - scrollOffset - 1, undefined)); + this._onLinkLeave.fire(this._createLinkHoverEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined)); element.classList.remove('xterm-cursor-pointer'); if (link.leave) {