spiegel-keyman/web/unit_tests/cases/events.js

166 lines
No EOL
4.5 KiB
JavaScript

var assert = chai.assert;
describe('Event Management', function() {
this.timeout(kmwconfig.timeouts.standard);
before(function(done) {
this.timeout(kmwconfig.timeouts.scriptLoad * 2);
fixture.setBase('unit_tests/fixtures');
fixture.load("eventTestConfig.html");
setupKMW(null, function() {
// We use this keyboard since we only need minimal input functionality for these tests.
// Smaller is better when dealing with net latency.
loadKeyboardFromJSON("/keyboards/test_simple_deadkeys.json", function() {
// Interestingly, when auto-testing there's a Safari bug that prevents
// this from being preserved after the first forced blur command below.
done();
}, kmwconfig.timeouts.scriptLoad);
}, kmwconfig.timeouts.scriptLoad);
});
after(function() {
teardownKMW();
});
it('Keystroke-based onChange event generation', function(done) {
var simple_A = {"type":"key","key":"a","code":"KeyA","keyCode":65,"modifierSet":0,"location":0};
var event = new KMWRecorder.PhysicalInputEvent(simple_A);
var ele = document.getElementById("input");
var aliasing = false;
ele.onchange = function() {
ele.onchange = null;
done();
}
if(ele['kmw_ip']) {
ele = ele['kmw_ip'];
aliasing = true;
}
// A bit of a force-hack to ensure the element is seen as active for the tests.
com.keyman['DOMEventHandlers'].states.lastActiveElement = ele;
com.keyman['DOMEventHandlers'].states.activeElement = ele;
event.simulateEventOn(ele);
var focusEvent;
if(typeof FocusEvent == 'function') {
focusEvent = new FocusEvent('blur', {relatedTarget: ele});
} else {
focusEvent = document.createEvent("FocusEvent");
focusEvent.initFocusEvent("blur", true, false, ele.ownerDocument.defaultView, 0, ele);
}
if(focusEvent)
ele.dispatchEvent(focusEvent);
});
it('OSK-based onChange event generation', function(done) {
var simple_A = {"type":"osk","keyID":"default-K_A"};
var event = new KMWRecorder.OSKInputEvent(simple_A);
var ele = document.getElementById("input");
var aliasing = false;
ele.onchange = function() {
ele.onchange = null;
done();
}
if(ele['kmw_ip']) {
ele = ele['kmw_ip'];
aliasing = true;
}
// A bit of a force-hack to ensure the element is seen as active for the tests.
com.keyman['DOMEventHandlers'].states.lastActiveElement = ele;
com.keyman['DOMEventHandlers'].states.activeElement = ele;
event.simulateEventOn(ele);
var focusEvent;
if(typeof FocusEvent == 'function') {
focusEvent = new FocusEvent('blur', {relatedTarget: ele});
} else {
focusEvent = document.createEvent("FocusEvent");
focusEvent.initFocusEvent("blur", true, false, ele.ownerDocument.defaultView, 0, ele);
}
if(focusEvent)
ele.dispatchEvent(focusEvent);
});
it('Keystroke-based onInput event generation', function(done) {
// Not all browsers support InputEvent. Bypass the test for these.
if(typeof InputEvent != 'function') {
console.log("InputEvent not supported.");
done();
return;
}
var simple_A = {"type":"key","key":"a","code":"KeyA","keyCode":65,"modifierSet":0,"location":0};
var event = new KMWRecorder.PhysicalInputEvent(simple_A);
var ele = document.getElementById("input");
var aliasing = false;
var counterObj = {i:0};
var fin = 3;
ele.addEventListener("input", function() {
counterObj.i++;
if(counterObj.i == fin) {
done();
}
});
if(ele['kmw_ip']) {
ele = ele['kmw_ip'];
aliasing = true;
}
event.simulateEventOn(ele);
event.simulateEventOn(ele);
event.simulateEventOn(ele);
});
it('OSK-based onInput event generation', function(done) {
// Not all browsers support InputEvent. Bypass the test for these.
if(typeof InputEvent != 'function') {
console.log("InputEvent not supported.");
done();
return;
}
var simple_A = {"type":"osk","keyID":"default-K_A"};
var event = new KMWRecorder.OSKInputEvent(simple_A);
var ele = document.getElementById("input");
var aliasing = false;
var counterObj = {i:0};
var fin = 3;
ele.addEventListener("input", function() {
counterObj.i++;
if(counterObj.i == fin) {
done();
}
});
if(ele['kmw_ip']) {
ele = ele['kmw_ip'];
aliasing = true;
}
event.simulateEventOn(ele);
event.simulateEventOn(ele);
event.simulateEventOn(ele);
});
});