Fix OOP <webview> resize and autosize.
[chromium-blink-merge.git] / third_party / polymer / v1_0 / components-chromium / iron-test-helpers / mock-interactions.js
blob324390e858b3c3e718872dc200f69a63cd9a09c8
1 /**
2  * @license
3  * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
4  * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5  * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6  * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7  * Code distributed by Google as part of the polymer project is also
8  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9  */
11 (function(global) {
12   'use strict';
14   var HAS_NEW_MOUSE = (function() {
15     var has = false;
16     try {
17       has = Boolean(new MouseEvent('x'));
18     } catch (_) {}
19     return has;
20   })();
22   function middleOfNode(node) {
23     var bcr = node.getBoundingClientRect();
24     return {
25       y: bcr.top + (bcr.height / 2),
26       x: bcr.left + (bcr.width / 2)
27     };
28   }
30   function topLeftOfNode(node) {
31     var bcr = node.getBoundingClientRect();
32     return {
33       y: bcr.top,
34       x: bcr.left
35     };
36   }
38   function makeEvent(type, xy, node) {
39     var props = {
40       bubbles: true,
41       cancelable: true,
42       clientX: xy.x,
43       clientY: xy.y
44     };
45     var e;
46     var mousetype = type === 'tap' ? 'click' : 'mouse' + type;
47     if (HAS_NEW_MOUSE) {
48       e = new MouseEvent(mousetype, props);
49     } else {
50       e = document.createEvent('MouseEvent');
51       e.initMouseEvent(mousetype, props.bubbles, props.cancelable, null, null, 0, 0,
52         props.clientX, props.clientY, false, false, false, false, 0, null);
53     }
54     node.dispatchEvent(e);
55   }
57   function down(node, xy) {
58     xy = xy || middleOfNode(node);
59     makeEvent('down', xy, node);
60   }
62   function move(node, fromXY, toXY, steps) {
63     steps = steps || 5;
64     var dx = Math.round((fromXY.x - toXY.x) / steps);
65     var dy = Math.round((fromXY.y - toXY.y) / steps);
66     var xy = {
67       x: fromXY.x,
68       y: fromXY.y
69     };
70     for (var i = steps; i > 0; i--) {
71       makeEvent('move', xy, node);
72       xy.x += dx;
73       xy.y += dy;
74     }
75     makeEvent('move', {
76       x: toXY.x,
77       y: toXY.y
78     }, node);
79   }
81   function up(node, xy) {
82     xy = xy || middleOfNode(node);
83     makeEvent('up', xy, node);
84   }
86   function tap(node) {
87     // Respect nodes that are disabled in the UI.
88     if (window.getComputedStyle(node)['pointer-events'] === 'none')
89       return;
90     var xy = middleOfNode(node);
91     down(node, xy);
92     up(node, xy);
93     makeEvent('tap', xy, node);
94   }
96   function focus(target) {
97     Polymer.Base.fire.call(target, 'focus', {}, {
98       bubbles: false
99     });
100   }
102   function blur(target) {
103     Polymer.Base.fire.call(target, 'blur', {}, {
104       bubbles: false
105     });
106   }
108   function downAndUp(target, callback) {
109     down(target);
110     Polymer.Base.async(function() {
111       up(target);
112       tap(target);
114       callback && callback();
115     });
116   }
118   function track(target, dx, dy, steps) {
119     dx = dx | 0;
120     dy = dy | 0;
121     steps = steps || 5;
122     down(target);
123     var xy = middleOfNode(target);
124     var xy2 = {
125       x: xy.x + dx,
126       y: xy.y + dy
127     };
128     move(target, xy, xy2, steps);
129     up(target, xy2);
130   }
132   function keyboardEventFor(type, keyCode) {
133     var event = new CustomEvent(type);
135     event.keyCode = keyCode;
136     event.code = keyCode;
138     return event;
139   }
141   function keyEventOn(target, type, keyCode) {
142     target.dispatchEvent(keyboardEventFor(type, keyCode));
143   }
145   function keyDownOn(target, keyCode) {
146     keyEventOn(target, 'keydown', keyCode);
147   }
149   function keyUpOn(target, keyCode) {
150     keyEventOn(target, 'keyup', keyCode);
151   }
153   function pressAndReleaseKeyOn(target, keyCode) {
154     keyDownOn(target, keyCode);
155     Polymer.Base.async(function() {
156       keyUpOn(target, keyCode);
157     }, 1);
158   }
160   function pressEnter(target) {
161     pressAndReleaseKeyOn(target, 13);
162   }
164   function pressSpace(target) {
165     pressAndReleaseKeyOn(target, 32);
166   }
168   global.MockInteractions = {
169     focus: focus,
170     blur: blur,
171     down: down,
172     up: up,
173     downAndUp: downAndUp,
174     tap: tap,
175     track: track,
176     pressAndReleaseKeyOn: pressAndReleaseKeyOn,
177     pressEnter: pressEnter,
178     pressSpace: pressSpace,
179     keyDownOn: keyDownOn,
180     keyUpOn: keyUpOn,
181     middleOfNode: middleOfNode,
182     topLeftOfNode: topLeftOfNode
183   };
184 })(this);