Index: third_party/WebKit/Source/devtools/front_end/screencast/InputModel.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/screencast/InputModel.js b/third_party/WebKit/Source/devtools/front_end/screencast/InputModel.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fc96e7e094e5d67bac4581ca9d127cdfb1037932 |
--- /dev/null |
+++ b/third_party/WebKit/Source/devtools/front_end/screencast/InputModel.js |
@@ -0,0 +1,116 @@ |
+// 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. |
+ |
+Screencast.InputModel = class 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) { |
+ var type; |
+ switch (event.type) { |
+ case 'keydown': |
+ type = 'keyDown'; |
+ break; |
+ case 'keyup': |
+ type = 'keyUp'; |
+ break; |
+ case 'keypress': |
+ type = 'char'; |
+ break; |
+ default: |
+ return; |
+ } |
+ |
+ var text = event.type === 'keypress' ? String.fromCharCode(event.charCode) : undefined; |
+ this._inputAgent.invoke_dispatchKeyEvent({ |
+ type: type, |
+ modifiers: this._modifiersForEvent(event), |
+ timestamp: event.timeStamp / 1000, |
+ 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) { |
+ var buttons = {0: 'none', 1: 'left', 2: 'middle', 3: 'right'}; |
+ var 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; |
+ |
+ var x = Math.round(event.offsetX / zoom); |
+ var y = Math.round(event.offsetY / zoom); |
+ y = Math.round(y - this._activeTouchOffsetTop); |
+ var params = { |
+ type: types[event.type], |
+ x: x, |
+ y: y, |
+ modifiers: this._modifiersForEvent(event), |
+ timestamp: event.timeStamp / 1000, |
+ 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._activeTouchOffsetTop !== null) { |
+ var 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(Screencast.InputModel, SDK.Target.Capability.Input, false); |