@xterm/xterm 6.1.0-beta.286 → 6.1.0-beta.288

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@xterm/xterm",
3
3
  "description": "Full xterm terminal, in your browser",
4
- "version": "6.1.0-beta.286",
4
+ "version": "6.1.0-beta.288",
5
5
  "main": "lib/xterm.js",
6
6
  "module": "lib/xterm.mjs",
7
7
  "style": "css/xterm.css",
@@ -119,5 +119,5 @@
119
119
  "ws": "^8.20.0",
120
120
  "xterm-benchmark": "^0.3.2"
121
121
  },
122
- "commit": "b69ae4b3c9b5b06582c94e1146e4d3b5d3a627fe"
122
+ "commit": "8aab310366549d8d865bd8fc4bd509051f2bb2a1"
123
123
  }
@@ -7,7 +7,7 @@ import { addDisposableListener } from '../Dom';
7
7
  import { IBufferService, IMouseStateService, ICoreService, ILogService, IOptionsService } from '../../common/services/Services';
8
8
  import { CoreMouseAction, CoreMouseButton, CoreMouseEventType, ICoreMouseEvent, IDisposable } from '../../common/Types';
9
9
  import { C0 } from '../../common/data/EscapeSequences';
10
- import { DisposableStore, MutableDisposable, toDisposable } from '../../common/Lifecycle';
10
+ import { DisposableStore, MutableDisposable } from '../../common/Lifecycle';
11
11
  import { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services';
12
12
  import { Gesture, EventType as GestureEventType, IGestureEvent } from '../scrollable/touch';
13
13
 
@@ -21,6 +21,8 @@ interface IMouseBindContext {
21
21
  readonly target: IMouseServiceTarget;
22
22
  readonly focus: () => void;
23
23
  readonly requestedEvents: RequestedMouseEvents;
24
+ readonly mouseupListener: MutableDisposable<IDisposable>;
25
+ readonly mousedragListener: MutableDisposable<IDisposable>;
24
26
  }
25
27
 
26
28
  export class MouseService implements IMouseService {
@@ -61,7 +63,11 @@ export class MouseService implements IMouseService {
61
63
  mousedrag: null,
62
64
  mousemove: null
63
65
  };
64
- const ctx: IMouseBindContext = { target, focus, requestedEvents };
66
+ const mouseupListener = new MutableDisposable<IDisposable>();
67
+ const mousedragListener = new MutableDisposable<IDisposable>();
68
+ register(mouseupListener);
69
+ register(mousedragListener);
70
+ const ctx: IMouseBindContext = { target, focus, requestedEvents, mouseupListener, mousedragListener };
65
71
  const eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener> = {
66
72
  mouseup: (ev: Event) => this._handleMouseUp(ctx, ev as MouseEvent),
67
73
  wheel: (ev: Event) => this._handleWheel(ctx, ev as WheelEvent),
@@ -85,16 +91,6 @@ export class MouseService implements IMouseService {
85
91
  // force initial onProtocolChange so we dont miss early mouse requests
86
92
  this._mouseStateService.activeProtocol = this._mouseStateService.activeProtocol;
87
93
 
88
- // Ensure document-level listeners are removed on dispose
89
- register(toDisposable(() => {
90
- if (requestedEvents.mouseup) {
91
- document.removeEventListener('mouseup', requestedEvents.mouseup);
92
- }
93
- if (requestedEvents.mousedrag) {
94
- document.removeEventListener('mousemove', requestedEvents.mousedrag);
95
- }
96
- }));
97
-
98
94
  /**
99
95
  * "Always on" event listeners.
100
96
  */
@@ -199,12 +195,8 @@ export class MouseService implements IMouseService {
199
195
  this._sendEvent(ctx, ev);
200
196
  if (!ev.buttons) {
201
197
  // if no other button is held remove global handlers
202
- if (ctx.requestedEvents.mouseup) {
203
- ctx.target.document.removeEventListener('mouseup', ctx.requestedEvents.mouseup);
204
- }
205
- if (ctx.requestedEvents.mousedrag) {
206
- ctx.target.document.removeEventListener('mousemove', ctx.requestedEvents.mousedrag);
207
- }
198
+ ctx.mouseupListener.clear();
199
+ ctx.mousedragListener.clear();
208
200
  }
209
201
  }
210
202
 
@@ -246,11 +238,14 @@ export class MouseService implements IMouseService {
246
238
  // of the terminal element.
247
239
  // Note: Other emulators also do this for 'mousedown' while a button
248
240
  // is held, we currently limit 'mousedown' to the terminal only.
241
+ // Use the element's current document in case it moved to another window after open.
242
+ const { element, document: targetDocument } = ctx.target;
243
+ const listenerDocument = element.ownerDocument ?? targetDocument;
249
244
  if (ctx.requestedEvents.mouseup) {
250
- ctx.target.document.addEventListener('mouseup', ctx.requestedEvents.mouseup);
245
+ ctx.mouseupListener.value = addDisposableListener(listenerDocument, 'mouseup', ctx.requestedEvents.mouseup);
251
246
  }
252
247
  if (ctx.requestedEvents.mousedrag) {
253
- ctx.target.document.addEventListener('mousemove', ctx.requestedEvents.mousedrag);
248
+ ctx.mousedragListener.value = addDisposableListener(listenerDocument, 'mousemove', ctx.requestedEvents.mousedrag);
254
249
  }
255
250
  }
256
251
 
@@ -398,7 +393,7 @@ export class MouseService implements IMouseService {
398
393
  }
399
394
 
400
395
  private _handleProtocolChange(ctx: IMouseBindContext, eventListeners: Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener>, events: CoreMouseEventType): void {
401
- const { element, document } = ctx.target;
396
+ const { element } = ctx.target;
402
397
  const { requestedEvents } = ctx;
403
398
  // apply global changes on events
404
399
  if (events) {
@@ -433,18 +428,14 @@ export class MouseService implements IMouseService {
433
428
  }
434
429
 
435
430
  if (!(events & CoreMouseEventType.UP)) {
436
- if (requestedEvents.mouseup) {
437
- document.removeEventListener('mouseup', requestedEvents.mouseup);
438
- }
431
+ ctx.mouseupListener.clear();
439
432
  requestedEvents.mouseup = null;
440
433
  } else {
441
434
  requestedEvents.mouseup ??= eventListeners.mouseup;
442
435
  }
443
436
 
444
437
  if (!(events & CoreMouseEventType.DRAG)) {
445
- if (requestedEvents.mousedrag) {
446
- document.removeEventListener('mousemove', requestedEvents.mousedrag);
447
- }
438
+ ctx.mousedragListener.clear();
448
439
  requestedEvents.mousedrag = null;
449
440
  } else {
450
441
  requestedEvents.mousedrag ??= eventListeners.mousedrag;
@@ -6,4 +6,4 @@
6
6
  /**
7
7
  * The xterm.js version. This is updated by the publish script from package.json.
8
8
  */
9
- export const XTERM_VERSION = '6.1.0-beta.286';
9
+ export const XTERM_VERSION = '6.1.0-beta.288';