104 lines
4.7 KiB
JavaScript
104 lines
4.7 KiB
JavaScript
|
/*---------------------------------------------------------------------------------------------
|
||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||
|
*--------------------------------------------------------------------------------------------*/
|
||
|
var __extends = (this && this.__extends) || (function () {
|
||
|
var extendStatics = function (d, b) {
|
||
|
extendStatics = Object.setPrototypeOf ||
|
||
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||
|
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
||
|
return extendStatics(d, b);
|
||
|
};
|
||
|
return function (d, b) {
|
||
|
extendStatics(d, b);
|
||
|
function __() { this.constructor = d; }
|
||
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
|
};
|
||
|
})();
|
||
|
import * as dom from './dom.js';
|
||
|
import { IframeUtils } from './iframe.js';
|
||
|
import { StandardMouseEvent } from './mouseEvent.js';
|
||
|
import { Disposable, dispose } from '../common/lifecycle.js';
|
||
|
export function standardMouseMoveMerger(lastEvent, currentEvent) {
|
||
|
var ev = new StandardMouseEvent(currentEvent);
|
||
|
ev.preventDefault();
|
||
|
return {
|
||
|
leftButton: ev.leftButton,
|
||
|
posx: ev.posx,
|
||
|
posy: ev.posy
|
||
|
};
|
||
|
}
|
||
|
var GlobalMouseMoveMonitor = /** @class */ (function (_super) {
|
||
|
__extends(GlobalMouseMoveMonitor, _super);
|
||
|
function GlobalMouseMoveMonitor() {
|
||
|
var _this = _super.call(this) || this;
|
||
|
_this.hooks = [];
|
||
|
_this.mouseMoveEventMerger = null;
|
||
|
_this.mouseMoveCallback = null;
|
||
|
_this.onStopCallback = null;
|
||
|
return _this;
|
||
|
}
|
||
|
GlobalMouseMoveMonitor.prototype.dispose = function () {
|
||
|
this.stopMonitoring(false);
|
||
|
_super.prototype.dispose.call(this);
|
||
|
};
|
||
|
GlobalMouseMoveMonitor.prototype.stopMonitoring = function (invokeStopCallback) {
|
||
|
if (!this.isMonitoring()) {
|
||
|
// Not monitoring
|
||
|
return;
|
||
|
}
|
||
|
// Unhook
|
||
|
this.hooks = dispose(this.hooks);
|
||
|
this.mouseMoveEventMerger = null;
|
||
|
this.mouseMoveCallback = null;
|
||
|
var onStopCallback = this.onStopCallback;
|
||
|
this.onStopCallback = null;
|
||
|
if (invokeStopCallback && onStopCallback) {
|
||
|
onStopCallback();
|
||
|
}
|
||
|
};
|
||
|
GlobalMouseMoveMonitor.prototype.isMonitoring = function () {
|
||
|
return this.hooks.length > 0;
|
||
|
};
|
||
|
GlobalMouseMoveMonitor.prototype.startMonitoring = function (mouseMoveEventMerger, mouseMoveCallback, onStopCallback) {
|
||
|
var _this = this;
|
||
|
if (this.isMonitoring()) {
|
||
|
// I am already hooked
|
||
|
return;
|
||
|
}
|
||
|
this.mouseMoveEventMerger = mouseMoveEventMerger;
|
||
|
this.mouseMoveCallback = mouseMoveCallback;
|
||
|
this.onStopCallback = onStopCallback;
|
||
|
var windowChain = IframeUtils.getSameOriginWindowChain();
|
||
|
for (var _i = 0, windowChain_1 = windowChain; _i < windowChain_1.length; _i++) {
|
||
|
var element = windowChain_1[_i];
|
||
|
this.hooks.push(dom.addDisposableThrottledListener(element.window.document, 'mousemove', function (data) { return _this.mouseMoveCallback(data); }, function (lastEvent, currentEvent) { return _this.mouseMoveEventMerger(lastEvent, currentEvent); }));
|
||
|
this.hooks.push(dom.addDisposableListener(element.window.document, 'mouseup', function (e) { return _this.stopMonitoring(true); }));
|
||
|
}
|
||
|
if (IframeUtils.hasDifferentOriginAncestor()) {
|
||
|
var lastSameOriginAncestor = windowChain[windowChain.length - 1];
|
||
|
// We might miss a mouse up if it happens outside the iframe
|
||
|
// This one is for Chrome
|
||
|
this.hooks.push(dom.addDisposableListener(lastSameOriginAncestor.window.document, 'mouseout', function (browserEvent) {
|
||
|
var e = new StandardMouseEvent(browserEvent);
|
||
|
if (e.target.tagName.toLowerCase() === 'html') {
|
||
|
_this.stopMonitoring(true);
|
||
|
}
|
||
|
}));
|
||
|
// This one is for FF
|
||
|
this.hooks.push(dom.addDisposableListener(lastSameOriginAncestor.window.document, 'mouseover', function (browserEvent) {
|
||
|
var e = new StandardMouseEvent(browserEvent);
|
||
|
if (e.target.tagName.toLowerCase() === 'html') {
|
||
|
_this.stopMonitoring(true);
|
||
|
}
|
||
|
}));
|
||
|
// This one is for IE
|
||
|
this.hooks.push(dom.addDisposableListener(lastSameOriginAncestor.window.document.body, 'mouseleave', function (browserEvent) {
|
||
|
_this.stopMonitoring(true);
|
||
|
}));
|
||
|
}
|
||
|
};
|
||
|
return GlobalMouseMoveMonitor;
|
||
|
}(Disposable));
|
||
|
export { GlobalMouseMoveMonitor };
|