blob: f838d5ebc6f77a016f2545a2070346d9d804a1d5 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
export class InputModel extends SDK.SDKModel {
/**
* @param {!SDK.Target} target
*/
constructor(target) {
super(target);
this._inputAgent = target.inputAgent();
/** @type {?number} */
this._activeTouchOffsetTop = null;
this._activeTouchParams = null;
}
/**
* @param {!Event} event
*/
emitKeyEvent(event) {
let type;
switch (event.type) {
case 'keydown':
type = 'keyDown';
break;
case 'keyup':
type = 'keyUp';
break;
case 'keypress':
type = 'char';
break;
default:
return;
}
const text = event.type === 'keypress' ? String.fromCharCode(event.charCode) : undefined;
this._inputAgent.invoke_dispatchKeyEvent({
type: type,
modifiers: this._modifiersForEvent(event),
text: text,
unmodifiedText: text ? text.toLowerCase() : undefined,
keyIdentifier: event.keyIdentifier,
code: event.code,
key: event.key,
windowsVirtualKeyCode: event.keyCode,
nativeVirtualKeyCode: event.keyCode,
autoRepeat: false,
isKeypad: false,
isSystemKey: false
});
}
/**
* @param {!Event} event
* @param {number} offsetTop
* @param {number} zoom
*/
emitTouchFromMouseEvent(event, offsetTop, zoom) {
const buttons = {0: 'none', 1: 'left', 2: 'middle', 3: 'right'};
const types = {
'mousedown': 'mousePressed',
'mouseup': 'mouseReleased',
'mousemove': 'mouseMoved',
'mousewheel': 'mouseWheel'
};
if (!(event.type in types) || !(event.which in buttons)) {
return;
}
if (event.type !== 'mousewheel' && buttons[event.which] === 'none') {
return;
}
if (event.type === 'mousedown' || this._activeTouchOffsetTop === null) {
this._activeTouchOffsetTop = offsetTop;
}
const x = Math.round(event.offsetX / zoom);
let y = Math.round(event.offsetY / zoom);
y = Math.round(y - this._activeTouchOffsetTop);
const params = {
type: types[event.type],
x: x,
y: y,
modifiers: this._modifiersForEvent(event),
button: buttons[event.which],
clickCount: 0
};
if (event.type === 'mousewheel') {
params.deltaX = event.wheelDeltaX / zoom;
params.deltaY = event.wheelDeltaY / zoom;
} else {
this._activeTouchParams = params;
}
if (event.type === 'mouseup') {
this._activeTouchOffsetTop = null;
}
this._inputAgent.invoke_emulateTouchFromMouseEvent(params);
}
cancelTouch() {
if (this._activeTouchParams !== null) {
const params = this._activeTouchParams;
this._activeTouchParams = null;
params.type = 'mouseReleased';
this._inputAgent.invoke_emulateTouchFromMouseEvent(params);
}
}
/**
* @param {!Event} event
* @return {number}
*/
_modifiersForEvent(event) {
return (event.altKey ? 1 : 0) | (event.ctrlKey ? 2 : 0) | (event.metaKey ? 4 : 0) | (event.shiftKey ? 8 : 0);
}
}
SDK.SDKModel.register(InputModel, SDK.Target.Capability.Input, false);
/* Legacy exported object */
self.Screencast = self.Screencast || {};
/* Legacy exported object */
Screencast = Screencast || {};
/**
* @constructor
*/
Screencast.InputModel = InputModel;