Skip to content

Commit

Permalink
Add touch hook/validator
Browse files Browse the repository at this point in the history
  • Loading branch information
sveisvei committed Mar 20, 2014
1 parent f268219 commit 2112895
Show file tree
Hide file tree
Showing 5 changed files with 683 additions and 1 deletion.
95 changes: 95 additions & 0 deletions lib/rule/hook/touch.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
var KEY = '__tests';

function onHalfTime(api) {
api.set('actionTime', +new Date());
api.switchToIframe();
api.injectLocalJs('./../../node_modules/mock-phantom-touch-events/lib/index.js');
api.evaluate(function (key) {

function collectEvents(subKey) {
return function (synteticEvent) {
window[key] = window[key] || {};
window[key][subKey] = window[key][subKey] || {};
window[key][subKey][synteticEvent.type] = window[key][subKey][synteticEvent.type] || [];
var o = {
't': +new Date(),
'x': synteticEvent.pageX,
'y': synteticEvent.pageY,
// we keep the event so we can collect/instrument before closing down page
'__event': synteticEvent
};
window[key][subKey][synteticEvent.type].push(o);
};
}

try {
// window.touchActionSequence(
// document.getElementById('GARDR').getElementsByTagName('div')[0],
// [85, 80],
// [400, 45],
// 750,
// 50,
// collectEvents('testSwipe')
// );

var gardrElem = document.getElementById('GARDR');
if (gardrElem !== null) {
var elem = gardrElem.querySelector('div[onclick],div');

window.swipeTop(
elem,
250,
20,
collectEvents('swipeTop')
);
setTimeout(function () {
window.swipeRight(
elem,
250,
20,
collectEvents('swipeRight')
);
setTimeout(function () {
window.swipeLeft(
elem,
250,
20,
collectEvents('swipeLeft')
);
}, 1500);
}, 1500);
}

} catch (e) {
console.log('Failed swiping', e, e.message, e.stack);
}
}, KEY);
}

function onBeforeExit(api) {
var probed = api.evaluate(function (key) {
if (!window[key]) {
return {
noTouchEventsFound: true
};
}
Object.keys(window[key]).forEach(function (_key) {
Object.keys(window[key][_key]).forEach(function (_method) {
window[key][_key][_method].forEach(function (e) {
e.returnValue = e.__event.returnValue;
e.defaultPrevented = e.__event.defaultPrevented;
delete e.__event;
});
});
});
return {
tests: window[key]
};
}, KEY);
api.set('touchEventData', (probed && probed.tests || {}));
}

module.exports = {
'onHalfTime': onHalfTime,
'onBeforeExit': onBeforeExit
};
52 changes: 52 additions & 0 deletions lib/rule/validator/touch.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
var allowedToPreventKeys = ['swipeLeft', 'swipeRight'];
var notAllowedToSwipe = ['swipeTop', 'swipeBottom'];

function verify(touchEvents, mapper){
return Object.keys(touchEvents).some(function(touchEventType){
var events = touchEvents[touchEventType];
return events && events.some(mapper);
});
}

function validate(harvested, report, next/*, globalOptions*/) {

if (!(harvested.touch)) {
return next();
}

var data = harvested.touch.touchEventData;
var detectedLegalUsage = false;
var detectedWrongUsage = false;
Object.keys(data).forEach(function(swipeKey){
var result;
if (allowedToPreventKeys.indexOf(swipeKey) > -1){
result = verify(data[swipeKey], function(entry){
return (entry.defaultPrevented === true);
});
if (result === true){
detectedLegalUsage = true;
}
} else if (notAllowedToSwipe.indexOf(swipeKey) > -1){
result = verify(data[swipeKey], function(entry){
return (entry.defaultPrevented === true || entry.returnValue === false);
});
if (result === true){
detectedWrongUsage = true;
report.error('Detected illegal swipe usage. Please only use horizontal touch events +/- 30%');
}
}

});

if (detectedLegalUsage && detectedWrongUsage !== true){
report.info('Detected swipe events inside code');
}


next();
}

module.exports = {
dependencies: ['touch'],
validate: validate
};
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"estraverse": "^1.5.0",
"css-parse": "^1.7.0",
"gardr": "~0.5.17-SNAPSHOT",
"browserify": "^3.32.1"
"browserify": "^3.33.0",
"mock-phantom-touch-events": "0.0.2"
},
"devDependencies": {
"mocha": "~1.17.0",
Expand Down
Loading

0 comments on commit 2112895

Please sign in to comment.