Skip to content

Commit 31084f6

Browse files
committed
Tests are passing on IE
1 parent 7e22780 commit 31084f6

File tree

6 files changed

+118
-37
lines changed

6 files changed

+118
-37
lines changed

lib/elementMatches.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
function matchesPolyfill (s) {
2+
var matches = (this.document || this.ownerDocument).querySelectorAll(s)
3+
4+
var i = matches.length
5+
while (--i >= 0 && matches.item(i) !== this) {}
6+
return i > -1
7+
}
8+
19
module.exports = function elementMatches (element, selector) {
2-
return element.matches(selector)
10+
if (element.matches) {
11+
return element.matches(selector)
12+
} else {
13+
return matchesPolyfill.call(element, selector)
14+
}
315
}

lib/elementTriggerEvent.js

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,16 @@
1-
/* global Event KeyboardEvent MouseEvent */
2-
3-
module.exports = function (element, eventType, value) {
4-
var creator = eventCreatorsByType[eventType]
5-
6-
if (!creator) {
7-
throw new Error('event type ' + JSON.stringify(eventType) + ' not recognised')
8-
}
9-
10-
var event = creator(value)
11-
12-
element.dispatchEvent(event)
13-
}
1+
var MouseEvent = require('./polyfills').MouseEvent
2+
var KeyboardEvent = require('./polyfills').KeyboardEvent
143

154
function createMouseEvent (type) {
165
return new MouseEvent(type, { bubbles: true, cancelable: true })
176
}
187

19-
function createEvent (type) {
20-
return new Event(type, { bubbles: true, cancelable: false })
8+
function createEvent (type, params) {
9+
params = params || { bubbles: true, cancelable: false }
10+
// IE compatible old school way of creating events.
11+
var event = document.createEvent('Event')
12+
event.initEvent(type, params.bubbles, params.cancelable)
13+
return event
2114
}
2215

2316
function createKeyboardEvent (type, key) {
@@ -47,6 +40,18 @@ var eventCreatorsByType = {
4740
return createKeyboardEvent('keypress', key)
4841
},
4942
submit: function () {
50-
return new Event('submit', { bubbles: true, cancelable: true })
43+
return createEvent('submit', { bubbles: true, cancelable: true })
5144
}
5245
}
46+
47+
module.exports = function (element, eventType, value) {
48+
var creator = eventCreatorsByType[eventType]
49+
50+
if (!creator) {
51+
throw new Error('event type ' + JSON.stringify(eventType) + ' not recognised')
52+
}
53+
54+
var event = creator(value)
55+
56+
element.dispatchEvent(event)
57+
}

lib/polyfills.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
module.exports.MouseEvent = (function () {
2+
try {
3+
new MouseEvent('click') // eslint-disable-line
4+
return MouseEvent // eslint-disable-line
5+
} catch (e) {
6+
// Need to polyfill - fall through
7+
}
8+
9+
var MouseEvent = function (eventType, params) {
10+
params = params || { bubbles: false, cancelable: false }
11+
var mouseEvent = document.createEvent('MouseEvent')
12+
mouseEvent.initMouseEvent(eventType, params.bubbles, params.cancelable, window, 0, params.screenX || 0, params.screenY || 0, params.clientX || 0, params.clientY || 0, false, false, false, false, 0, null)
13+
14+
return mouseEvent
15+
}
16+
17+
MouseEvent.prototype = Event.prototype
18+
19+
return MouseEvent
20+
})()
21+
22+
// based on https://github.com/lifaon74/events-polyfill/blob/5ccca4002aa07f16ed1c298145f20c06d3544a29/src/constructors/KeyboardEvent.js
23+
module.exports.KeyboardEvent = (function () {
24+
try {
25+
new KeyboardEvent('keyup') // eslint-disable-line
26+
return KeyboardEvent // eslint-disable-line
27+
} catch (e) {
28+
// Need to polyfill - fall through
29+
}
30+
31+
var KeyboardEvent = function (eventType, params) {
32+
params = params || { bubbles: false, cancelable: false }
33+
34+
var modKeys = [
35+
params.ctrlKey ? 'Control' : '',
36+
params.shiftKey ? 'Shift' : '',
37+
params.altKey ? 'Alt' : '',
38+
params.altGrKey ? 'AltGr' : '',
39+
params.metaKey ? 'Meta' : ''
40+
].join(' ')
41+
42+
var keyEvent = document.createEvent('KeyboardEvent')
43+
keyEvent.initKeyboardEvent(
44+
eventType,
45+
!!params.bubbles,
46+
!!params.cancelable,
47+
window,
48+
'',
49+
params.key,
50+
0,
51+
modKeys,
52+
!!params.repeat
53+
)
54+
55+
return keyEvent
56+
}
57+
58+
KeyboardEvent.prototype = Event.prototype
59+
60+
return KeyboardEvent
61+
})()

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
"dependencies": {
5454
"array.prototype.find": "^2.0.4",
5555
"chai": "4.2.0",
56-
"debug": "https://github.com/artemave/debug",
56+
"debug-es5": "^4.1.0",
5757
"deep-equal": "1.0.1",
5858
"error-stack-parser": "2.0.2",
5959
"global": "^4.3.2",
@@ -65,7 +65,8 @@
6565
},
6666
"standard": {
6767
"env": [
68-
"mocha"
68+
"mocha",
69+
"browser"
6970
],
7071
"ignore": [
7172
"docs/codesandbox/**/*"

test/eventsSpec.js

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
var describeAssemblies = require('./describeAssemblies')
22
const DomAssembly = require('./assemblies/DomAssembly')
33
var demand = require('must')
4+
var retry = require('trytryagain')
45

56
describe('events', function () {
67
describeAssemblies([DomAssembly], function (Assembly) {
@@ -49,7 +50,7 @@ describe('events', function () {
4950
demand(document.hasFocus(), 'the browser must be in focus for this test!').to.equal(true)
5051
}
5152

52-
it('typeIn element should fire change and then blur event on input', function () {
53+
it('typeIn element should fire change and then blur event on input', async function () {
5354
var firedEvents = []
5455

5556
assertBrowserHasFocus()
@@ -64,17 +65,17 @@ describe('events', function () {
6465
firedEvents.push('change')
6566
})
6667

67-
return browser.find('.input').typeIn('first').then(function () {
68-
return browser.find('.change').typeIn('second')
69-
}).then(function () {
68+
await browser.find('.input').typeIn('first')
69+
await browser.find('.change').typeIn('second')
70+
await retry(() => {
7071
demand(firedEvents).to.eql([
7172
'change',
7273
'blur'
7374
])
7475
})
7576
})
7677

77-
it('click element should fire blur event on input', function () {
78+
it('click element should fire blur event on input', async function () {
7879
var blurred = false
7980

8081
assertBrowserHasFocus()
@@ -86,14 +87,14 @@ describe('events', function () {
8687
blurred = true
8788
})
8889

89-
return browser.find('.input').typeIn('first').then(function () {
90-
return browser.find('button').click()
91-
}).then(function () {
90+
await browser.find('.input').typeIn('first')
91+
await browser.find('button').click()
92+
await retry(function () {
9293
demand(blurred).to.eql(true)
9394
})
9495
})
9596

96-
it('select element should fire blur event on input', function () {
97+
it('select element should fire blur event on input', async function () {
9798
var blurred = false
9899

99100
assertBrowserHasFocus()
@@ -104,9 +105,9 @@ describe('events', function () {
104105
blurred = true
105106
})
106107

107-
return browser.find('.input').typeIn('first').then(function () {
108-
return browser.find('select').select({ text: 'one' })
109-
}).then(function () {
108+
await browser.find('.input').typeIn('first')
109+
await browser.find('select').select({ text: 'one' })
110+
await retry(function () {
110111
demand(blurred).to.eql(true)
111112
})
112113
})

yarn.lock

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2110,6 +2110,13 @@ date-now@^0.1.4:
21102110
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
21112111
integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=
21122112

2113+
debug-es5@^4.1.0:
2114+
version "4.1.0"
2115+
resolved "https://registry.yarnpkg.com/debug-es5/-/debug-es5-4.1.0.tgz#4725be9293b570a8893279a5c15de4c85b95be6c"
2116+
integrity sha512-oHIsjV5nHcnukI9N+w8zS+GpYZ2TaEXml8LUND8F5uDNqUoDqxQZBr05EPlFhSkerH/Irvp3nHAjwobWFPJDEg==
2117+
dependencies:
2118+
ms "^2.1.1"
2119+
21132120
debug-log@^1.0.0:
21142121
version "1.0.1"
21152122
resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f"
@@ -2143,12 +2150,6 @@ debug@^4.1.0:
21432150
dependencies:
21442151
ms "^2.1.1"
21452152

2146-
"debug@https://github.com/artemave/debug":
2147-
version "4.1.0"
2148-
resolved "https://github.com/artemave/debug#26920e6d13e5e77183c33c65c17e5040639b0daf"
2149-
dependencies:
2150-
ms "^2.1.1"
2151-
21522153
debug@~0.7.2:
21532154
version "0.7.4"
21542155
resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39"

0 commit comments

Comments
 (0)