From cd00ab063586021ad83cc0d64b16270182892f07 Mon Sep 17 00:00:00 2001 From: "Stuart P. Bentley" Date: Mon, 18 May 2015 21:57:09 +0000 Subject: [PATCH] Replace PointerMap with polyfill for regular Map --- pointerevents.js | 4 +- src/dispatcher.js | 4 +- src/{pointermap.js => map.js} | 17 ++++---- src/touch.js | 6 +-- tests/intern.js | 2 +- tests/unit/loader.js | 4 +- tests/unit/map.js | 73 +++++++++++++++++++++++++++++++++ tests/unit/pointermap.js | 77 ----------------------------------- 8 files changed, 90 insertions(+), 97 deletions(-) rename src/{pointermap.js => map.js} (76%) create mode 100644 tests/unit/map.js delete mode 100644 tests/unit/pointermap.js diff --git a/pointerevents.js b/pointerevents.js index 31967898..66a0165f 100644 --- a/pointerevents.js +++ b/pointerevents.js @@ -1,5 +1,5 @@ import dispatcher from 'dispatcher'; -import PointerMap from 'pointermap'; +import Map from 'map'; import Installer from 'installer'; import targeting from 'targeting'; import PointerEvent from 'PointerEvent'; @@ -15,6 +15,6 @@ export default { dispatcher: dispatcher, Installer: Installer, PointerEvent: PointerEvent, - PointerMap: PointerMap, + Map: Map, targetFinding: targeting }; diff --git a/src/dispatcher.js b/src/dispatcher.js index efb8c447..e6794396 100644 --- a/src/dispatcher.js +++ b/src/dispatcher.js @@ -1,4 +1,4 @@ -import PointerMap from 'pointermap'; +import Map from 'map'; var CLONE_PROPS = [ @@ -99,7 +99,7 @@ var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined'); * - pointercancel: a pointer will no longer generate events */ var dispatcher = { - pointermap: new PointerMap(), + pointermap: new Map(), eventMap: Object.create(null), captureInfo: Object.create(null), diff --git a/src/pointermap.js b/src/map.js similarity index 76% rename from src/pointermap.js rename to src/map.js index f4211479..b3cc385e 100644 --- a/src/pointermap.js +++ b/src/map.js @@ -1,20 +1,17 @@ /** * This module implements an map of pointer states */ -var USE_MAP = window.Map && window.Map.prototype.forEach; -var POINTERS_FN = function() { return this.size; }; -function PointerMap() { - if (USE_MAP) { - var m = new Map(); - m.pointers = POINTERS_FN; - return m; +var USE_EXISTING_MAP = window.Map && window.Map.prototype.forEach; +function Map() { + if (USE_EXISTING_MAP) { + return new window.Map(); } else { this.keys = []; this.values = []; } } -PointerMap.prototype = { +Map.prototype = { set: function(inId, inEvent) { var i = this.keys.indexOf(inId); if (i > -1) { @@ -49,9 +46,9 @@ PointerMap.prototype = { callback.call(thisArg, v, this.keys[i], this); }, this); }, - pointers: function() { + get size() { return this.keys.length; } }; -export default PointerMap; +export default Map; diff --git a/src/touch.js b/src/touch.js index c6fb8933..ae925a74 100644 --- a/src/touch.js +++ b/src/touch.js @@ -112,7 +112,7 @@ var touchEvents = { setPrimaryTouch: function(inTouch) { // set primary touch if there no pointers, or the only pointer is the mouse - if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) { + if (pointermap.size === 0 || (pointermap.size === 1 && pointermap.has(1))) { this.firstTouch = inTouch.identifier; this.firstXY = { X: inTouch.clientX, Y: inTouch.clientY }; this.scrolling = false; @@ -233,9 +233,9 @@ var touchEvents = { vacuumTouches: function(inEvent) { var tl = inEvent.touches; - // pointermap.pointers() should be < tl.length here, as the touchstart has not + // pointermap.size should be < tl.length here, as the touchstart has not // been processed yet. - if (pointermap.pointers() >= tl.length) { + if (pointermap.size >= tl.length) { var d = []; pointermap.forEach(function(value, key) { diff --git a/tests/intern.js b/tests/intern.js index 31228eba..f457b301 100644 --- a/tests/intern.js +++ b/tests/intern.js @@ -23,7 +23,7 @@ define({ 'tests/unit/constructor', 'tests/unit/dispatcher', 'tests/unit/loader', - 'tests/unit/pointermap' + 'tests/unit/map' ], functionalSuites: [ diff --git a/tests/unit/loader.js b/tests/unit/loader.js index b7114968..19eb6f82 100644 --- a/tests/unit/loader.js +++ b/tests/unit/loader.js @@ -16,8 +16,8 @@ define([ test('PointerEventsPolyfill', function() { expect(pep).to.be.ok; }); - test('PointerMap', function() { - expect(pep.PointerMap).to.be.ok; + test('Map', function() { + expect(pep.Map).to.be.ok; }); test('Dispatcher', function() { expect(pep.dispatcher).to.be.ok; diff --git a/tests/unit/map.js b/tests/unit/map.js new file mode 100644 index 00000000..04fe1f41 --- /dev/null +++ b/tests/unit/map.js @@ -0,0 +1,73 @@ +define([ + '../support/tdd', + 'intern/chai!expect', + 'pep' +], function(tdd, expect, pep) { + var suite = tdd.suite; + var test = tdd.test; + + suite('Map', function() { + var Map = pep.Map; + test('PEP Map has Map API', function() { + var keys = [ + 'set', + 'get', + 'has', + 'delete', + 'size', + 'clear', + 'forEach' + ]; + var e = expect(Map.prototype); + keys.forEach(function(k) { + e.to.have.ownProperty(k); + }); + }); + test('Map .set', function() { + var p = new Map(); + p.set(1, true); + expect(p.size).to.equal(1); + }); + test('Map .size', function() { + var p = new Map(); + expect(p.size).to.be.a('number'); + expect(p.size).to.equal(0); + p.set(1, true); + expect(p.size).to.equal(1); + p.set(1, false); + expect(p.size).to.equal(1); + }); + test('Map .has', function() { + var p = new Map(); + p.set(1, true); + expect(p.has(1)).to.equal(true); + expect(p.has(0)).to.equal(false); + }); + test('Map .delete', function() { + var p = new Map(); + p.set(1, true); + p.set(2, false); + expect(p.size).to.equal(2); + p.delete(1); + expect(p.size).to.equal(1); + expect(p.get(2)).to.equal(false); + }); + test('Map .clear', function() { + var p = new Map(); + p.set(1, true); + p.clear(); + expect(p.size).to.equal(0); + }); + test('Map .forEach', function() { + var p = new Map(); + p.set(1, true); + p.set(2, false); + p.set(3, {}); + p.forEach(function(v, k, m) { + expect(k).to.be.ok; + expect(v).to.equal(p.get(k)); + expect(m).to.equal(p); + }); + }); + }); +}); diff --git a/tests/unit/pointermap.js b/tests/unit/pointermap.js deleted file mode 100644 index a6ce6e18..00000000 --- a/tests/unit/pointermap.js +++ /dev/null @@ -1,77 +0,0 @@ -define([ - '../support/tdd', - 'intern/chai!expect', - 'pep' -], function(tdd, expect, pep) { - var suite = tdd.suite; - var test = tdd.test; - - suite('PointerMap', function() { - var PointerMap = pep.PointerMap; - test('PointerMap has Map API', function() { - var keys = [ - 'set', - 'get', - 'has', - 'delete', - 'pointers', - 'clear', - 'forEach' - ]; - var e = expect(PointerMap.prototype); - keys.forEach(function(k) { - e.to.have.ownProperty(k); - }); - }); - test('PointerMap .set', function() { - var p = new PointerMap(); - p.set(1, true); - if (!window.Map || !(p instanceof Map)) { - expect(p.keys).to.have.length(1); - expect(p.values).to.have.length(1); - } - expect(p.pointers()).to.equal(1); - }); - test('PointerMap .pointers', function() { - var p = new PointerMap(); - expect(p.pointers).to.be.a('function'); - expect(p.pointers()).to.equal(0); - p.set(1, true); - expect(p.pointers()).to.equal(1); - p.set(1, false); - expect(p.pointers()).to.equal(1); - }); - test('PointerMap .has', function() { - var p = new PointerMap(); - p.set(1, true); - expect(p.has(1)).to.equal(true); - expect(p.has(0)).to.equal(false); - }); - test('PointerMap .delete', function() { - var p = new PointerMap(); - p.set(1, true); - p.set(2, false); - expect(p.pointers()).to.equal(2); - p.delete(1); - expect(p.pointers()).to.equal(1); - expect(p.get(2)).to.equal(false); - }); - test('PointerMap .clear', function() { - var p = new PointerMap(); - p.set(1, true); - p.clear(); - expect(p.pointers()).to.equal(0); - }); - test('PointerMap .forEach', function() { - var p = new PointerMap(); - p.set(1, true); - p.set(2, false); - p.set(3, {}); - p.forEach(function(v, k, m) { - expect(k).to.be.ok; - expect(v).to.equal(p.get(k)); - expect(m).to.equal(p); - }); - }); - }); -});