From 901adb38ae67d7c52172a5cb15f82c94d6540e21 Mon Sep 17 00:00:00 2001 From: Jon Bockhorst Date: Mon, 10 Feb 2020 12:39:16 -0600 Subject: [PATCH 1/2] Fix linkProvider end positions --- addons/xterm-addon-web-links/src/WebLinkProvider.ts | 2 +- src/browser/Linkifier2.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/xterm-addon-web-links/src/WebLinkProvider.ts b/addons/xterm-addon-web-links/src/WebLinkProvider.ts index d32a8166..ea43aae6 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.ts b/src/browser/Linkifier2.ts index 2eeec1df..fbbc0c88 100644 --- a/src/browser/Linkifier2.ts +++ b/src/browser/Linkifier2.ts @@ -184,7 +184,7 @@ export class Linkifier2 implements ILinkifier2 { 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) { @@ -196,7 +196,7 @@ export class Linkifier2 implements ILinkifier2 { 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) { From e817a7b6c60486ae63ac1e816ed13d95678cfc2e Mon Sep 17 00:00:00 2001 From: Jon Bockhorst Date: Thu, 13 Feb 2020 00:43:24 -0600 Subject: [PATCH 2/2] Add Linkifier2 tests --- src/browser/Linkifier2.test.ts | 76 ++++++++++++++++++++++++++++++++++ src/browser/Linkifier2.ts | 6 +-- 2 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 src/browser/Linkifier2.test.ts diff --git a/src/browser/Linkifier2.test.ts b/src/browser/Linkifier2.test.ts new file mode 100644 index 00000000..bcf068a8 --- /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 fbbc0c88..89367718 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,7 +180,7 @@ 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; @@ -192,7 +192,7 @@ 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;