Skip to content
This repository was archived by the owner on Feb 11, 2021. It is now read-only.

Commit 04ae42f

Browse files
committed
Mouse: Mouse is always active pointer
Fixes gh-275 Closes gh-282 Ref gh-258 Ref gh-279
1 parent b1d4253 commit 04ae42f

7 files changed

+88
-20
lines changed

src/capture.js

+18-8
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,37 @@ import dispatcher from './dispatcher';
22

33
var n = window.navigator;
44
var s, r;
5-
function assertDown(id) {
5+
function assertActive(id) {
66
if (!dispatcher.pointermap.has(id)) {
7-
throw new Error('InvalidPointerId');
7+
var error = new Error('InvalidPointerId');
8+
error.name = 'InvalidPointerId';
9+
throw error;
810
}
911
}
12+
function inActiveButtonState(id) {
13+
var p = dispatcher.pointermap.get(id);
14+
return p.buttons !== 0;
15+
}
1016
if (n.msPointerEnabled) {
1117
s = function(pointerId) {
12-
assertDown(pointerId);
13-
this.msSetPointerCapture(pointerId);
18+
assertActive(pointerId);
19+
if (inActiveButtonState(pointerId)) {
20+
this.msSetPointerCapture(pointerId);
21+
}
1422
};
1523
r = function(pointerId) {
16-
assertDown(pointerId);
24+
assertActive(pointerId);
1725
this.msReleasePointerCapture(pointerId);
1826
};
1927
} else {
2028
s = function setPointerCapture(pointerId) {
21-
assertDown(pointerId);
22-
dispatcher.setCapture(pointerId, this);
29+
assertActive(pointerId);
30+
if (inActiveButtonState(pointerId)) {
31+
dispatcher.setCapture(pointerId, this);
32+
}
2333
};
2434
r = function releasePointerCapture(pointerId) {
25-
assertDown(pointerId);
35+
assertActive(pointerId);
2636
dispatcher.releaseCapture(pointerId, this);
2737
};
2838
}

src/mouse.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ var mouseEvents = {
7676
inEvent.buttons = e.buttons;
7777
}
7878
pointermap.set(this.POINTER_ID, inEvent);
79-
if (!p) {
79+
if (!p || p.buttons === 0) {
8080
dispatcher.down(e);
8181
} else {
8282
dispatcher.move(e);
@@ -88,6 +88,7 @@ var mouseEvents = {
8888
var e = this.prepareEvent(inEvent);
8989
if (!HAS_BUTTONS) { this.prepareButtonsForMove(e, inEvent); }
9090
e.button = -1;
91+
pointermap.set(this.POINTER_ID, inEvent);
9192
dispatcher.move(e);
9293
}
9394
},
@@ -112,7 +113,6 @@ var mouseEvents = {
112113
// https://bugzilla.mozilla.org/show_bug.cgi?id=1223366
113114
e.buttons &= ~BUTTON_TO_BUTTONS[e.button];
114115
if (e.buttons === 0) {
115-
this.cleanupMouse();
116116
dispatcher.up(e);
117117
} else {
118118
dispatcher.move(e);
@@ -124,6 +124,7 @@ var mouseEvents = {
124124
var e = this.prepareEvent(inEvent);
125125
if (!HAS_BUTTONS) { this.prepareButtonsForMove(e, inEvent); }
126126
e.button = -1;
127+
pointermap.set(this.POINTER_ID, inEvent);
127128
dispatcher.enterOver(e);
128129
}
129130
},
@@ -138,9 +139,9 @@ var mouseEvents = {
138139
cancel: function(inEvent) {
139140
var e = this.prepareEvent(inEvent);
140141
dispatcher.cancel(e);
141-
this.cleanupMouse();
142+
this.deactivateMouse();
142143
},
143-
cleanupMouse: function() {
144+
deactivateMouse: function() {
144145
pointermap.delete(this.POINTER_ID);
145146
}
146147
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
define(function(require) {
2+
var registerSuite = require('intern!object');
3+
var w3cTest = require('../support/w3cTest');
4+
var name = 'pointerevent_releasepointercapture_invalid_pointerid-manual';
5+
6+
registerSuite({
7+
name: name,
8+
9+
main: function() {
10+
return w3cTest(this.remote, name + '.html')
11+
.findById('target0')
12+
.moveMouseTo(50, 25)
13+
.pressMouseButton(0)
14+
.moveMouseTo(60, 25)
15+
.releaseMouseButton(0)
16+
.end()
17+
.checkResults();
18+
}
19+
});
20+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
define(function(require) {
2+
var registerSuite = require('intern!object');
3+
var w3cTest = require('../support/w3cTest');
4+
var name = 'pointerevent_setpointercapture_inactive_button_mouse-manual';
5+
6+
registerSuite({
7+
name: name,
8+
9+
main: function() {
10+
return w3cTest(this.remote, name + '.html')
11+
.findById('target0')
12+
.moveMouseTo(50, 25)
13+
.moveMouseTo(60, -25)
14+
.end()
15+
.checkResults();
16+
}
17+
});
18+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
define(function(require) {
2+
var registerSuite = require('intern!object');
3+
var w3cTest = require('../support/w3cTest');
4+
var name = 'pointerevent_setpointercapture_invalid_pointerid-manual';
5+
6+
registerSuite({
7+
name: name,
8+
9+
main: function() {
10+
return w3cTest(this.remote, name + '.html')
11+
.findById('target0')
12+
.moveMouseTo(50, 25)
13+
.clickMouseButton(0)
14+
.end()
15+
.checkResults();
16+
}
17+
});
18+
});

tests/intern.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,14 @@ define({
8181
'tests/functional/pointerevent_pointerup_pointertype-manual.js',
8282

8383
'tests/functional/pointerevent_releasepointercapture_events_to_original_target-manual.js',
84+
'tests/functional/pointerevent_releasepointercapture_invalid_pointerid-manual.js',
8485

85-
// 'tests/functional/pointerevent_releasepointercapture_invalid_pointerid-manual.js',
8686
// 'tests/functional/pointerevent_releasepointercapture_onpointercancel_touch-manual.js',
8787
'tests/functional/pointerevent_releasepointercapture_onpointerup_mouse-manual',
8888

8989
// 'tests/functional/pointerevent_setpointercapture_disconnected-manual.js',
90-
// 'tests/functional/pointerevent_setpointercapture_inactive_button_mouse-manual.js',
91-
// 'tests/functional/pointerevent_setpointercapture_invalid_pointerid-manual.js',
90+
'tests/functional/pointerevent_setpointercapture_inactive_button_mouse-manual.js',
91+
'tests/functional/pointerevent_setpointercapture_invalid_pointerid-manual.js',
9292
'tests/functional/pointerevent_setpointercapture_relatedtarget-manual.js'
9393

9494
// 'tests/functional/pointerevent_touch-action-auto-css_touch-manual.js',

tests/support/setup.js

+6-5
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ define([
2020
prep('pointer' + shortType, target, callback);
2121
}
2222
var e, type;
23+
var buttons = shortType === 'down' ? 1 : 0;
2324
if (HAS_MS) {
2425
var cap = shortType.slice(0, 1).toUpperCase() + shortType.slice(1);
2526
type = 'MSPointer' + cap;
@@ -30,11 +31,11 @@ define([
3031
);
3132
} else {
3233
type = 'mouse' + shortType;
33-
e = document.createEvent('MouseEvent');
34-
e.initMouseEvent(
35-
type, true, true, null, null, 0, 0, 0, 0, false, false,
36-
false, false, 0, null
37-
);
34+
e = new MouseEvent(type, {
35+
bubbles: true,
36+
cancelable: true,
37+
buttons: buttons
38+
});
3839
}
3940
target.dispatchEvent(e);
4041
}

0 commit comments

Comments
 (0)