123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613 |
- // Copyright 2008 The Closure Library Authors. All Rights Reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS-IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- goog.provide('goog.testing.eventsTest');
- goog.setTestOnly('goog.testing.eventsTest');
- goog.require('goog.array');
- goog.require('goog.dom');
- goog.require('goog.dom.InputType');
- goog.require('goog.dom.TagName');
- goog.require('goog.events');
- goog.require('goog.events.EventType');
- goog.require('goog.events.KeyCodes');
- goog.require('goog.math.Coordinate');
- goog.require('goog.string');
- goog.require('goog.style');
- goog.require('goog.testing.PropertyReplacer');
- goog.require('goog.testing.events');
- goog.require('goog.testing.jsunit');
- goog.require('goog.testing.recordFunction');
- goog.require('goog.userAgent');
- var firedEventTypes;
- var firedEventCoordinates;
- var firedScreenCoordinates;
- var firedShiftKeys;
- var firedKeyCodes;
- var root;
- var log;
- var input;
- var testButton;
- var parentEl;
- var childEl;
- var coordinate = new goog.math.Coordinate(123, 456);
- var stubs = new goog.testing.PropertyReplacer();
- var eventCount;
- function setUpPage() {
- root = goog.dom.getElement('root');
- log = goog.dom.getElement('log');
- input = goog.dom.getElement('input');
- testButton = goog.dom.getElement('testButton');
- parentEl = goog.dom.getElement('parentEl');
- childEl = goog.dom.getElement('childEl');
- }
- function setUp() {
- stubs.reset();
- goog.events.removeAll(root);
- goog.events.removeAll(log);
- goog.events.removeAll(input);
- goog.events.removeAll(testButton);
- goog.events.removeAll(parentEl);
- goog.events.removeAll(childEl);
- goog.dom.removeChildren(root);
- firedEventTypes = [];
- firedEventCoordinates = [];
- firedScreenCoordinates = [];
- firedShiftKeys = [];
- firedKeyCodes = [];
- for (var key in goog.events.EventType) {
- goog.events.listen(root, goog.events.EventType[key], function(e) {
- firedEventTypes.push(e.type);
- var coord = new goog.math.Coordinate(e.clientX, e.clientY);
- firedEventCoordinates.push(coord);
- firedScreenCoordinates.push(
- new goog.math.Coordinate(e.screenX, e.screenY));
- firedShiftKeys.push(!!e.shiftKey);
- firedKeyCodes.push(e.keyCode);
- });
- }
- eventCount =
- {parentBubble: 0, parentCapture: 0, childCapture: 0, childBubble: 0};
- // Event listeners for the capture/bubble test.
- goog.events.listen(parentEl, goog.events.EventType.CLICK, function(e) {
- eventCount.parentCapture++;
- assertEquals(parentEl, e.currentTarget);
- assertEquals(childEl, e.target);
- }, true);
- goog.events.listen(childEl, goog.events.EventType.CLICK, function(e) {
- eventCount.childCapture++;
- assertEquals(childEl, e.currentTarget);
- assertEquals(childEl, e.target);
- }, true);
- goog.events.listen(childEl, goog.events.EventType.CLICK, function(e) {
- eventCount.childBubble++;
- assertEquals(childEl, e.currentTarget);
- assertEquals(childEl, e.target);
- });
- goog.events.listen(parentEl, goog.events.EventType.CLICK, function(e) {
- eventCount.parentBubble++;
- assertEquals(parentEl, e.currentTarget);
- assertEquals(childEl, e.target);
- });
- }
- function tearDownPage() {
- for (var key in goog.events.EventType) {
- var type = goog.events.EventType[key];
- if (type == 'mousemove' || type == 'mouseout' || type == 'mouseover') {
- continue;
- }
- goog.dom.appendChild(
- input, goog.dom.createDom(
- goog.dom.TagName.LABEL, null,
- goog.dom.createDom(
- goog.dom.TagName.INPUT,
- {'id': type, 'type': goog.dom.InputType.CHECKBOX}),
- type, goog.dom.createDom(goog.dom.TagName.BR)));
- goog.events.listen(testButton, type, function(e) {
- if (goog.dom.getElement(e.type).checked) {
- e.preventDefault();
- }
- log.innerHTML +=
- goog.string.subs('<br />%s (%s, %s)', e.type, e.clientX, e.clientY);
- });
- }
- }
- function testMouseEnter() {
- goog.testing.events.fireMouseEnterEvent(root, null);
- goog.testing.events.fireMouseEnterEvent(root, null, coordinate);
- assertEventTypes(['mouseenter', 'mouseenter']);
- assertCoordinates([goog.style.getClientPosition(root), coordinate]);
- }
- function testMouseLeave() {
- goog.testing.events.fireMouseLeaveEvent(root, null);
- goog.testing.events.fireMouseLeaveEvent(root, null, coordinate);
- assertEventTypes(['mouseleave', 'mouseleave']);
- assertCoordinates([goog.style.getClientPosition(root), coordinate]);
- }
- function testMouseOver() {
- goog.testing.events.fireMouseOverEvent(root, null);
- goog.testing.events.fireMouseOverEvent(root, null, coordinate);
- assertEventTypes(['mouseover', 'mouseover']);
- assertCoordinates([goog.style.getClientPosition(root), coordinate]);
- }
- function testMouseOut() {
- goog.testing.events.fireMouseOutEvent(root, null);
- goog.testing.events.fireMouseOutEvent(root, null, coordinate);
- assertEventTypes(['mouseout', 'mouseout']);
- assertCoordinates([goog.style.getClientPosition(root), coordinate]);
- }
- function testFocus() {
- goog.testing.events.fireFocusEvent(root);
- assertEventTypes(['focus']);
- }
- function testFocusIn() {
- goog.testing.events.fireFocusInEvent(root);
- assertEventTypes([goog.events.EventType.FOCUSIN]);
- }
- function testBlur() {
- goog.testing.events.fireBlurEvent(root);
- assertEventTypes(['blur']);
- }
- function testClickSequence() {
- assertTrue(goog.testing.events.fireClickSequence(root));
- assertEventTypes(['mousedown', 'mouseup', 'click']);
- var rootPosition = goog.style.getClientPosition(root);
- assertCoordinates([rootPosition, rootPosition, rootPosition]);
- }
- function testClickSequenceWithCoordinate() {
- assertTrue(goog.testing.events.fireClickSequence(root, null, coordinate));
- assertCoordinates([coordinate, coordinate, coordinate]);
- assertArrayEquals([false, false, false], firedShiftKeys);
- }
- function testTouchStart() {
- goog.testing.events.fireTouchStartEvent(root);
- goog.testing.events.fireTouchStartEvent(root, coordinate);
- assertEventTypes(['touchstart', 'touchstart']);
- assertCoordinates([goog.style.getClientPosition(root), coordinate]);
- }
- function testTouchMove() {
- goog.testing.events.fireTouchMoveEvent(root);
- goog.testing.events.fireTouchMoveEvent(root, coordinate, {touches: []});
- assertEventTypes(['touchmove', 'touchmove']);
- assertCoordinates([goog.style.getClientPosition(root), coordinate]);
- }
- function testTouchEnd() {
- goog.testing.events.fireTouchEndEvent(root);
- goog.testing.events.fireTouchEndEvent(root, coordinate);
- assertEventTypes(['touchend', 'touchend']);
- assertCoordinates([goog.style.getClientPosition(root), coordinate]);
- }
- function testTouchSequence() {
- assertTrue(goog.testing.events.fireTouchSequence(root));
- assertEventTypes(['touchstart', 'touchend']);
- var rootPosition = goog.style.getClientPosition(root);
- assertCoordinates([rootPosition, rootPosition]);
- }
- function testTouchSequenceWithCoordinate() {
- assertTrue(goog.testing.events.fireTouchSequence(root, coordinate));
- assertCoordinates([coordinate, coordinate]);
- }
- function testClickSequenceWithEventProperty() {
- assertTrue(
- goog.testing.events.fireClickSequence(
- root, null, undefined, {shiftKey: true}));
- assertArrayEquals([true, true, true], firedShiftKeys);
- }
- function testClickSequenceCancellingMousedown() {
- preventDefaultEventType('mousedown');
- assertFalse(goog.testing.events.fireClickSequence(root));
- assertEventTypes(['mousedown', 'mouseup', 'click']);
- }
- function testClickSequenceCancellingMousedownWithCoordinate() {
- preventDefaultEventType('mousedown');
- assertFalse(goog.testing.events.fireClickSequence(root, null, coordinate));
- assertCoordinates([coordinate, coordinate, coordinate]);
- }
- function testClickSequenceCancellingMouseup() {
- preventDefaultEventType('mouseup');
- assertFalse(goog.testing.events.fireClickSequence(root));
- assertEventTypes(['mousedown', 'mouseup', 'click']);
- }
- function testClickSequenceCancellingMouseupWithCoordinate() {
- preventDefaultEventType('mouseup');
- assertFalse(goog.testing.events.fireClickSequence(root, null, coordinate));
- assertCoordinates([coordinate, coordinate, coordinate]);
- }
- function testClickSequenceCancellingClick() {
- preventDefaultEventType('click');
- assertFalse(goog.testing.events.fireClickSequence(root));
- assertEventTypes(['mousedown', 'mouseup', 'click']);
- }
- function testClickSequenceCancellingClickWithCoordinate() {
- preventDefaultEventType('click');
- assertFalse(goog.testing.events.fireClickSequence(root, null, coordinate));
- assertCoordinates([coordinate, coordinate, coordinate]);
- }
- // For a double click, IE fires selectstart instead of the second mousedown,
- // but we don't simulate selectstart. Also, IE doesn't fire the second click.
- var DBLCLICK_SEQ =
- (goog.userAgent.IE ?
- ['mousedown', 'mouseup', 'click', 'mouseup', 'dblclick'] :
- [
- 'mousedown', 'mouseup', 'click', 'mousedown', 'mouseup', 'click',
- 'dblclick'
- ]);
- var DBLCLICK_SEQ_COORDS = goog.array.repeat(coordinate, DBLCLICK_SEQ.length);
- function testDoubleClickSequence() {
- assertTrue(goog.testing.events.fireDoubleClickSequence(root));
- assertEventTypes(DBLCLICK_SEQ);
- }
- function testDoubleClickSequenceWithCoordinate() {
- assertTrue(goog.testing.events.fireDoubleClickSequence(root, coordinate));
- assertCoordinates(DBLCLICK_SEQ_COORDS);
- }
- function testDoubleClickSequenceCancellingMousedown() {
- preventDefaultEventType('mousedown');
- assertFalse(goog.testing.events.fireDoubleClickSequence(root));
- assertEventTypes(DBLCLICK_SEQ);
- }
- function testDoubleClickSequenceCancellingMousedownWithCoordinate() {
- preventDefaultEventType('mousedown');
- assertFalse(goog.testing.events.fireDoubleClickSequence(root, coordinate));
- assertCoordinates(DBLCLICK_SEQ_COORDS);
- }
- function testDoubleClickSequenceCancellingMouseup() {
- preventDefaultEventType('mouseup');
- assertFalse(goog.testing.events.fireDoubleClickSequence(root));
- assertEventTypes(DBLCLICK_SEQ);
- }
- function testDoubleClickSequenceCancellingMouseupWithCoordinate() {
- preventDefaultEventType('mouseup');
- assertFalse(goog.testing.events.fireDoubleClickSequence(root, coordinate));
- assertCoordinates(DBLCLICK_SEQ_COORDS);
- }
- function testDoubleClickSequenceCancellingClick() {
- preventDefaultEventType('click');
- assertFalse(goog.testing.events.fireDoubleClickSequence(root));
- assertEventTypes(DBLCLICK_SEQ);
- }
- function testDoubleClickSequenceCancellingClickWithCoordinate() {
- preventDefaultEventType('click');
- assertFalse(goog.testing.events.fireDoubleClickSequence(root, coordinate));
- assertCoordinates(DBLCLICK_SEQ_COORDS);
- }
- function testDoubleClickSequenceCancellingDoubleClick() {
- preventDefaultEventType('dblclick');
- assertFalse(goog.testing.events.fireDoubleClickSequence(root));
- assertEventTypes(DBLCLICK_SEQ);
- }
- function testDoubleClickSequenceCancellingDoubleClickWithCoordinate() {
- preventDefaultEventType('dblclick');
- assertFalse(goog.testing.events.fireDoubleClickSequence(root, coordinate));
- assertCoordinates(DBLCLICK_SEQ_COORDS);
- }
- function testKeySequence() {
- assertTrue(
- goog.testing.events.fireKeySequence(root, goog.events.KeyCodes.ZERO));
- assertEventTypes(['keydown', 'keypress', 'keyup']);
- }
- function testKeySequenceCancellingKeydown() {
- preventDefaultEventType('keydown');
- assertFalse(
- goog.testing.events.fireKeySequence(root, goog.events.KeyCodes.ZERO));
- assertEventTypes(['keydown', 'keyup']);
- }
- function testKeySequenceCancellingKeypress() {
- preventDefaultEventType('keypress');
- assertFalse(
- goog.testing.events.fireKeySequence(root, goog.events.KeyCodes.ZERO));
- assertEventTypes(['keydown', 'keypress', 'keyup']);
- }
- function testKeySequenceCancellingKeyup() {
- preventDefaultEventType('keyup');
- assertFalse(
- goog.testing.events.fireKeySequence(root, goog.events.KeyCodes.ZERO));
- assertEventTypes(['keydown', 'keypress', 'keyup']);
- }
- function testKeySequenceWithEscapeKey() {
- assertTrue(
- goog.testing.events.fireKeySequence(root, goog.events.KeyCodes.ESC));
- if (goog.userAgent.EDGE ||
- (goog.userAgent.WEBKIT && goog.userAgent.isVersionOrHigher('525'))) {
- assertEventTypes(['keydown', 'keyup']);
- } else {
- assertEventTypes(['keydown', 'keypress', 'keyup']);
- }
- }
- function testKeySequenceForMacActionKeysNegative() {
- stubs.set(goog.userAgent, 'GECKO', false);
- goog.testing.events.fireKeySequence(
- root, goog.events.KeyCodes.C, {'metaKey': true});
- assertEventTypes(['keydown', 'keypress', 'keyup']);
- }
- function testKeySequenceForMacActionKeysPositive() {
- stubs.set(goog.userAgent, 'GECKO', true);
- stubs.set(goog.userAgent, 'MAC', true);
- goog.testing.events.fireKeySequence(
- root, goog.events.KeyCodes.C, {'metaKey': true});
- assertEventTypes(['keypress', 'keyup']);
- }
- function testKeySequenceForOptionKeysOnMac() {
- // Mac uses an option (or alt) key to type non-ASCII characters. This test
- // verifies we can emulate key events sent when typing such non-ASCII
- // characters.
- stubs.set(goog.userAgent, 'WEBKIT', true);
- stubs.set(goog.userAgent, 'MAC', true);
- var optionKeyCodes = [
- [0xc0, 0x00e6], // option+'
- [0xbc, 0x2264], // option+,
- [0xbd, 0x2013], // option+-
- [0xbe, 0x2265], // option+.
- [0xbf, 0x00f7], // option+/
- [0x30, 0x00ba], // option+0
- [0x31, 0x00a1], // option+1
- [0x32, 0x2122], // option+2
- [0x33, 0x00a3], // option+3
- [0x34, 0x00a2], // option+4
- [0x35, 0x221e], // option+5
- [0x36, 0x00a7], // option+6
- [0x37, 0x00b6], // option+7
- [0x38, 0x2022], // option+8
- [0x39, 0x00aa], // option+9
- [0xba, 0x2026], // option+;
- [0xbb, 0x2260], // option+=
- [0xdb, 0x201c], // option+[
- [
- 0xdc, 0x00ab
- ], // option+\
- [0xdd, 0x2018], // option+]
- [0x41, 0x00e5], // option+a
- [0x42, 0x222b], // option+b
- [0x43, 0x00e7], // option+c
- [0x44, 0x2202], // option+d
- [0x45, 0x00b4], // option+e
- [0x46, 0x0192], // option+f
- [0x47, 0x00a9], // option+g
- [0x48, 0x02d9], // option+h
- [0x49, 0x02c6], // option+i
- [0x4a, 0x2206], // option+j
- [0x4b, 0x02da], // option+k
- [0x4c, 0x00ac], // option+l
- [0x4d, 0x00b5], // option+m
- [0x4e, 0x02dc], // option+n
- [0x4f, 0x00f8], // option+o
- [0x50, 0x03c0], // option+p
- [0x51, 0x0153], // option+q
- [0x52, 0x00ae], // option+r
- [0x53, 0x00df], // option+s
- [0x54, 0x2020], // option+t
- [0x56, 0x221a], // option+v
- [0x57, 0x2211], // option+w
- [0x58, 0x2248], // option+x
- [0x59, 0x00a5], // option+y
- [0x5a, 0x03a9] // option+z
- ];
- for (var i = 0; i < optionKeyCodes.length; ++i) {
- firedEventTypes = [];
- firedKeyCodes = [];
- var keyCode = optionKeyCodes[i][0];
- var keyPressKeyCode = optionKeyCodes[i][1];
- goog.testing.events.fireNonAsciiKeySequence(
- root, keyCode, keyPressKeyCode, {'altKey': true});
- assertEventTypes(['keydown', 'keypress', 'keyup']);
- assertArrayEquals([keyCode, keyPressKeyCode, keyCode], firedKeyCodes);
- }
- }
- var CONTEXTMENU_SEQ = goog.userAgent.WINDOWS ?
- ['mousedown', 'mouseup', 'contextmenu'] :
- goog.userAgent.GECKO ? ['mousedown', 'contextmenu', 'mouseup'] :
- goog.userAgent.WEBKIT && goog.userAgent.MAC ?
- ['mousedown', 'contextmenu', 'mouseup', 'click'] :
- ['mousedown', 'contextmenu', 'mouseup'];
- function testContextMenuSequence() {
- assertTrue(goog.testing.events.fireContextMenuSequence(root));
- assertEventTypes(CONTEXTMENU_SEQ);
- }
- function testContextMenuSequenceWithCoordinate() {
- assertTrue(goog.testing.events.fireContextMenuSequence(root, coordinate));
- assertEventTypes(CONTEXTMENU_SEQ);
- assertCoordinates(goog.array.repeat(coordinate, CONTEXTMENU_SEQ.length));
- }
- function testContextMenuSequenceCancellingMousedown() {
- preventDefaultEventType('mousedown');
- assertFalse(goog.testing.events.fireContextMenuSequence(root));
- assertEventTypes(CONTEXTMENU_SEQ);
- }
- function testContextMenuSequenceCancellingMouseup() {
- preventDefaultEventType('mouseup');
- assertFalse(goog.testing.events.fireContextMenuSequence(root));
- assertEventTypes(CONTEXTMENU_SEQ);
- }
- function testContextMenuSequenceCancellingContextMenu() {
- preventDefaultEventType('contextmenu');
- assertFalse(goog.testing.events.fireContextMenuSequence(root));
- assertEventTypes(CONTEXTMENU_SEQ);
- }
- function testContextMenuSequenceFakeMacWebkit() {
- stubs.set(goog.userAgent, 'WINDOWS', false);
- stubs.set(goog.userAgent, 'MAC', true);
- stubs.set(goog.userAgent, 'WEBKIT', true);
- assertTrue(goog.testing.events.fireContextMenuSequence(root));
- assertEventTypes(['mousedown', 'contextmenu', 'mouseup', 'click']);
- }
- function testCaptureBubble_simple() {
- assertTrue(goog.testing.events.fireClickEvent(childEl));
- assertObjectEquals(
- {parentCapture: 1, childCapture: 1, childBubble: 1, parentBubble: 1},
- eventCount);
- }
- function testCaptureBubble_preventDefault() {
- goog.events.listen(childEl, goog.events.EventType.CLICK, function(e) {
- e.preventDefault();
- });
- assertFalse(goog.testing.events.fireClickEvent(childEl));
- assertObjectEquals(
- {parentCapture: 1, childCapture: 1, childBubble: 1, parentBubble: 1},
- eventCount);
- }
- function testCaptureBubble_stopPropagationParentCapture() {
- goog.events.listen(parentEl, goog.events.EventType.CLICK, function(e) {
- e.stopPropagation();
- }, true /* capture */);
- assertTrue(goog.testing.events.fireClickEvent(childEl));
- assertObjectEquals(
- {parentCapture: 1, childCapture: 0, childBubble: 0, parentBubble: 0},
- eventCount);
- }
- function testCaptureBubble_stopPropagationChildCapture() {
- goog.events.listen(childEl, goog.events.EventType.CLICK, function(e) {
- e.stopPropagation();
- }, true /* capture */);
- assertTrue(goog.testing.events.fireClickEvent(childEl));
- assertObjectEquals(
- {parentCapture: 1, childCapture: 1, childBubble: 0, parentBubble: 0},
- eventCount);
- }
- function testCaptureBubble_stopPropagationChildBubble() {
- goog.events.listen(childEl, goog.events.EventType.CLICK, function(e) {
- e.stopPropagation();
- });
- assertTrue(goog.testing.events.fireClickEvent(childEl));
- assertObjectEquals(
- {parentCapture: 1, childCapture: 1, childBubble: 1, parentBubble: 0},
- eventCount);
- }
- function testCaptureBubble_stopPropagationParentBubble() {
- goog.events.listen(parentEl, goog.events.EventType.CLICK, function(e) {
- e.stopPropagation();
- });
- assertTrue(goog.testing.events.fireClickEvent(childEl));
- assertObjectEquals(
- {parentCapture: 1, childCapture: 1, childBubble: 1, parentBubble: 1},
- eventCount);
- }
- function testMixinListenable() {
- var obj = {};
- obj.doFoo = goog.testing.recordFunction();
- goog.testing.events.mixinListenable(obj);
- obj.doFoo();
- assertEquals(1, obj.doFoo.getCallCount());
- var handler = goog.testing.recordFunction();
- goog.events.listen(obj, 'test', handler);
- obj.dispatchEvent('test');
- assertEquals(1, handler.getCallCount());
- assertEquals(obj, handler.getLastCall().getArgument(0).target);
- goog.events.unlisten(obj, 'test', handler);
- obj.dispatchEvent('test');
- assertEquals(1, handler.getCallCount());
- goog.events.listen(obj, 'test', handler);
- obj.dispose();
- obj.dispatchEvent('test');
- assertEquals(1, handler.getCallCount());
- }
- /**
- * Assert that the list of events given was fired, in that order.
- */
- function assertEventTypes(list) {
- assertArrayEquals(list, firedEventTypes);
- }
- /**
- * Assert that the list of event coordinates given was caught, in that order.
- */
- function assertCoordinates(list) {
- assertArrayEquals(list, firedEventCoordinates);
- assertArrayEquals(list, firedScreenCoordinates);
- }
- /** Prevent default the event of the given type on the root element. */
- function preventDefaultEventType(type) {
- goog.events.listen(root, type, preventDefault);
- }
- function preventDefault(e) {
- e.preventDefault();
- }
|