siesta-lite
Version:
Stress-free JavaScript unit testing and functional testing tool, works in NodeJS and browsers
134 lines (95 loc) • 3.82 kB
JavaScript
/*
Siesta 5.6.1
Copyright(c) 2009-2022 Bryntum AB
https://bryntum.com/contact
https://bryntum.com/products/siesta/license
*/
// Internal class visualizing the cursor position, only used in good browsers (!== IE)
Class('Siesta.Project.Browser.UI.MouseVisualizer', {
has : {
cursorEl : null,
currentContainer : { required : true },
clickEvents : function () {
return {
click : null,
touchend : null,
contextmenu : null
}
},
mouseDownEvents : function () {
return {
touchstart : null,
mousedown : null
}
},
mouseUpEvents : function () {
return {
touchend : null,
mouseup : null
}
}
},
methods : {
initialize : function (config) {
this.onEventSimulated = this.onEventSimulated.bind(this);
},
getCursorEl : function () {
if (this.cursorEl) return this.cursorEl
var currentContainer = this.currentContainer
if (!currentContainer) throw "Need container for cursor"
var el = document.createElement('div');
el.className = 'ghost-cursor fa fa-mouse-pointer';
return this.cursorEl = currentContainer.appendChild(el)
},
destroy : function () {
var cursorEl = this.cursorEl
if (cursorEl) {
cursorEl.parentElement.removeChild(cursorEl);
this.cursorEl = null
}
this.currentContainer = null
},
onEventSimulated : function (event, point) {
if (typeof event.clientX === 'number') {
this.updatePointer(event.type, point)
}
},
updatePointer : function (eventType, point) {
var x = point[ 0 ],
y = point[ 1 ]
this.updateGhostCursor(x, y);
if (eventType in this.clickEvents) {
this.showClickIndicator(eventType, x, y);
} else if (eventType in this.mouseDownEvents) {
this.getCursorEl().classList.add('ghost-cursor-press');
}
if (eventType in this.mouseUpEvents || eventType in this.clickEvents) {
this.getCursorEl().classList.remove('ghost-cursor-press');
}
},
// This method shows a fading growing circle at the xy position
showClickIndicator : function (type, x, y) {
var clickEl = document.createElement('div');
clickEl.className = 'ghost-cursor-click-indicator ';
clickEl.style.setProperty('left', x + 'px');
clickEl.style.setProperty('top', y + 'px');
clickEl.addEventListener("animationend", this.afterAnimation);
clickEl.addEventListener("webkitAnimationEnd", this.afterAnimation);
this.currentContainer.appendChild(clickEl);
},
afterAnimation : function() {
// "this" here is a DOM element instance
this.parentElement && this.parentElement.removeChild(this);
},
// Updates the ghost cursor position and appearance
updateGhostCursor : function (x, y) {
var cursorEl = this.getCursorEl()
var translateStyle = bowser.opera ?
'translate(' + x + 'px,' + y + 'px)'
:
'translate3d(' + x + 'px, ' + y + 'px, 0)'
cursorEl.style.setProperty('-webkit-transform', translateStyle)
cursorEl.style.setProperty('transform', translateStyle)
}
}
});