dojox
Version:
Dojo eXtensions, a rollup of many useful sub-projects and varying states of maturity – from very stable and robust, to alpha and experimental. See individual projects contain README files for details.
530 lines (521 loc) • 17.5 kB
HTML
<html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no"/>
<title>Mobile Slider unit tests</title>
<script type="text/javascript" src="../deviceTheme.js" data-dojo-config="mblThemeFiles: ['base','Slider']"></script>
<script src="../../../dojo/dojo.js" data-dojo-config="parseOnLoad:true, isDebug: true"></script>
<script type="text/javascript">
require([
"doh/runner",
"dojo/sniff",
"dojo/ready",
"dojo/_base/window",
"dojo/dom",
"dojo/dom-style",
"dojo/dom-geometry",
"dijit/registry",
"dojox/mobile",
"dojox/mobile/parser",
"dojox/mobile/compat",
"dojox/mobile/Slider"
], function(doh, has, ready, win, dom, domStyle, domGeometry, registry) {
ready(function(){
var hasTouch = has("touch");
var msPointer = navigator.msPointerEnabled;
var touchstart = msPointer?"MSPointerDown":"touchstart";
var touchmove = msPointer?"MSPointerMove":"touchmove";
var touchend = msPointer?"MSPointerUp":"touchend";
var transitionDuration = has("webkit")?"WebkitTransitionDuration":"transitionDuration";
function getZoom(widget){
var node = widget.domNode;
var bodyZoom = domStyle.get(win.body(), "zoom") || 1;
var nodeZoom = ((has("ie") || has("trident") > 6) ? parseFloat(domStyle.get(node).getPropertyValue("zoom"))/100 : domStyle.get(node, "zoom")) || 1;
return nodeZoom * bodyZoom;
}
function fireTouchEvent(type, widget, x, y, delay){
function doit(){
var node = widget.domNode;
var handle = widget.handle;
var zoom = getZoom(widget);
if(has("ie") || has("trident") > 6){
x *= zoom;
y *= zoom;
zoom = 1;
}
var scroll = domGeometry.docScroll();
var pos = domGeometry.position(node, false);
var handlePos = domGeometry.position(handle, false);
handlePos.l = handlePos.x * zoom + scroll.x;
handlePos.t = handlePos.y * zoom + scroll.y;
handlePos.r = handlePos.l + (handlePos.w - 1) * zoom;
handlePos.b = handlePos.t + (handlePos.h - 1) * zoom;
var touchX = (x + pos.x) * zoom + scroll.x;
var touchY = (y + pos.y) * zoom + scroll.y;
var target = widget.touchBox;
// see if handle is under the touch pos
if(touchX >= handlePos.l && touchX <= handlePos.r && touchY >= handlePos.t && touchY <= handlePos.b){
target = handle;
}
var e = document.createEvent ? document.createEvent('Events') : document.createEventObject();
if(!hasTouch&&!msPointer){
switch(type){
case touchstart: type = 'mousedown'; break;
case touchmove: type = 'mousemove'; break;
case touchend: type = 'mouseup'; break;
}
}
if(document.createEvent){
e.initEvent(type, true, true);
}
e.touches = [ { pageX: touchX, pageY: touchY } ];
e.pageX = touchX;
e.pageY = touchY;
e.changedTouches = e.touches;
if(document.createEvent){
target.dispatchEvent(e);
}else{
target.fireEvent("on"+type, e);
}
}
if(delay){
setTimeout(doit, delay);
}else{
doit();
}
}
var sh = registry.byId('sh');
var sh_width = sh.domNode.offsetWidth;
var sh_height = sh.domNode.offsetHeight;
var sh_handle_width = sh.handle.offsetWidth;
var sh_handle_height = sh.handle.offsetHeight;
var sv = registry.byId('sv');
var sv_width = sv.domNode.offsetWidth;
var sv_height = sv.domNode.offsetHeight;
var sv_handle_width = sv.handle.offsetWidth;
var sv_handle_height = sv.handle.offsetHeight;
var handle;
var speed = 0; // should be 0 unless it's a demo
domStyle.set(sh.handle, transitionDuration, (speed >> 1) + "ms");
domStyle.set(sv.handle, transitionDuration, (speed >> 1) + "ms");
doh.register("tap", [
{
name: "horizontal end",
timeout: 1000+speed,
runTest: function(){
function onChange(v){
d.getTestCallback(function(){
doh.is(v, sh.max);
})();
}
var d = new doh.Deferred();
handle = sh.connect(sh, 'onChange', onChange);
fireTouchEvent(touchstart, sh, sh_width, sh_height >> 1, speed);
return d;
},
tearDown: function(){
fireTouchEvent(touchend, sh, sh_width, sh_height >> 1);
sh.disconnect(handle);
}
},
{
name: "horizontal start",
timeout: 1000+speed,
runTest: function(){
function onChange(v){
d.getTestCallback(function(){
doh.is(v, sh.min);
})();
}
var d = new doh.Deferred();
handle = sh.connect(sh, 'onChange', onChange);
fireTouchEvent(touchstart, sh, 0, sh_height >> 1, speed);
return d;
},
tearDown: function(){
fireTouchEvent(touchend, sh, 0, sh_height >> 1);
sh.disconnect(handle);
}
},
{
name: "horizontal middle",
timeout: 1000+speed,
runTest: function(){
function onChange(v){
d.getTestCallback(function(){
doh.t(Math.abs(v - ((sh.max+sh.min) >> 1)) <= sh.step);
})();
}
var d = new doh.Deferred();
handle = sh.connect(sh, 'onChange', onChange);
fireTouchEvent(touchstart, sh, sh_width >> 1, sh_height >> 1, speed);
return d;
},
tearDown: function(){
fireTouchEvent(touchend, sh, sh_width >> 1, sh_height >> 1);
sh.disconnect(handle);
}
},
{
name: "vertical end",
timeout: 1000+speed,
runTest: function(){
function onChange(v){
d.getTestCallback(function(){
doh.is(v, sv.max);
})();
}
var d = new doh.Deferred();
handle = sv.connect(sv, 'onChange', onChange);
fireTouchEvent(touchstart, sv, sv_width >> 1, 0, speed);
return d;
},
tearDown: function(){
fireTouchEvent(touchend, sv, sv_width >> 1, 0);
sv.disconnect(handle);
}
},
{
name: "vertical start",
timeout: 1000+speed,
runTest: function(){
function onChange(v){
d.getTestCallback(function(){
doh.is(v, sv.min);
})();
}
var d = new doh.Deferred();
handle = sv.connect(sv, 'onChange', onChange);
fireTouchEvent(touchstart, sv, sv_width >> 1, sv_height, speed);
return d;
},
tearDown: function(){
fireTouchEvent(touchend, sv, sv_width >> 1, sv_height);
sv.disconnect(handle);
}
},
{
name: "vertical middle",
timeout: 1000+speed,
runTest: function(){
function onChange(v){
d.getTestCallback(function(){
doh.t(Math.abs(v - ((sv.max+sv.min) >> 1)) <= sv.step);
})();
}
var d = new doh.Deferred();
handle = sv.connect(sv, 'onChange', onChange);
fireTouchEvent(touchstart, sv, sv_width >> 1, sv_height >> 1, speed);
return d;
},
tearDown: function(){
fireTouchEvent(touchend, sv, sv_width >> 1, sv_height >> 1);
sv.disconnect(handle);
}
}
]);
doh.register("move", [
{
name: "horizontal right",
timeout: 1000+speed*2,
runTest: function(){
function onChange(v){
d.getTestCallback(function(){
doh.is(v, sh.max);
})();
}
var d = new doh.Deferred();
handle = sh.connect(sh, 'onChange', onChange);
fireTouchEvent(touchstart, sh, sh_width >> 1, sh_height >> 1);
fireTouchEvent(touchmove, sh, sh_width, sh_height >> 1, speed);
fireTouchEvent(touchend, sh, sh_width, sh_height >> 1, speed*2);
return d;
},
tearDown: function(){
sh.disconnect(handle);
}
},
{
name: "horizontal left",
timeout: 1000+speed*2,
runTest: function(){
function onChange(v){
d.getTestCallback(function(){
doh.is(v, sh.min);
})();
}
var d = new doh.Deferred();
handle = sh.connect(sh, 'onChange', onChange);
fireTouchEvent(touchstart, sh, sh_width, sh_height >> 1);
fireTouchEvent(touchmove, sh, 0, sh_height >> 1, speed);
fireTouchEvent(touchend, sh, 0, sh_height >> 1, speed*2);
return d;
},
tearDown: function(){
sh.disconnect(handle);
}
},
{
name: "vertical up",
timeout: 1000+speed,
runTest: function(){
function onChange(v){
d.getTestCallback(function(){
doh.is(v, sv.max);
})();
}
var d = new doh.Deferred();
handle = sv.connect(sv, 'onChange', onChange);
fireTouchEvent(touchstart, sv, sv_width >> 1, sv_height >> 1);
fireTouchEvent(touchmove, sv, sv_width >> 1, 0, speed);
return d;
},
tearDown: function(){
sv.disconnect(handle);
}
},
{
name: "vertical down",
timeout: 1000+speed,
runTest: function(){
function onChange(v){
d.getTestCallback(function(){
doh.is(v, sv.min);
})();
}
var d = new doh.Deferred();
handle = sv.connect(sv, 'onChange', onChange);
fireTouchEvent(touchmove, sv, sv_width >> 1, sv_height, speed);
return d;
},
tearDown: function(){
fireTouchEvent(touchend, sv, sv_width >> 1, sv_height);
sv.disconnect(handle);
}
}
]);
doh.register("click handle", [
{
name: "horizontal right",
timeout: 1000+speed,
runTest: function(){
var mid = (sh.max + sh.min) >> 1;
sh.set('value', mid, true);
doh.is(mid, sh.get('value'), 'initial value');
var d = new doh.Deferred();
fireTouchEvent(touchstart, sh, (sh_width >> 1) + (sh_handle_width >> 2), sh_height >> 1, speed);
fireTouchEvent(touchend, sh, (sh_width >> 1) + (sh_handle_width >> 2), sh_height >> 1, speed);
setTimeout(d.getTestCallback(function(){
doh.is(mid, sh.get('value'), 'right value');
}), 500+speed);
return d;
}
},
{
name: "horizontal left",
timeout: 1000+speed,
runTest: function(){
var mid = (sh.max + sh.min) >> 1;
sh.set('value', mid, true);
doh.is(mid, sh.get('value'), 'initial value');
var d = new doh.Deferred();
fireTouchEvent(touchstart, sh, (sh_width >> 1) - (sh_handle_width >> 2), sh_height >> 1);
fireTouchEvent(touchend, sh, (sh_width >> 1) - (sh_handle_width >> 2), sh_height >> 1);
setTimeout(d.getTestCallback(function(){
doh.is(mid, sh.get('value'), 'left value');
}), 500+speed);
return d;
}
},
{
name: "horizontal change right",
timeout: 1000+speed,
runTest: function(){
var mid = (sh.max + sh.min) >> 1;
sh.set('value', mid, true);
doh.is(mid, sh.get('value'), 'initial value');
var d = new doh.Deferred();
fireTouchEvent(touchstart, sh, (sh_width >> 1) + (sh_handle_width >> 1) + 2, sh_height >> 1, speed >> 1);
fireTouchEvent(touchend, sh, (sh_width >> 1) + (sh_handle_width >> 1) + 2, sh_height >> 1, speed >> 1);
setTimeout(d.getTestCallback(function(){
doh.t(sh.get('value') > mid, 'right changed value ' + sh.get('value'));
}), 500+speed);
return d;
}
},
{
name: "horizontal change left",
timeout: 1000+speed,
runTest: function(){
var mid = (sh.max + sh.min) >> 1;
sh.set('value', mid, true);
doh.is(mid, sh.get('value'), 'initial value');
var d = new doh.Deferred();
fireTouchEvent(touchstart, sh, (sh_width >> 1) - ((sh_handle_width >> 1) + 2), sh_height >> 1, speed >> 1);
fireTouchEvent(touchend, sh, (sh_width >> 1) - ((sh_handle_width >> 1) + 2), sh_height >> 1, speed >> 1);
setTimeout(d.getTestCallback(function(){
doh.t(sh.get('value') < mid, 'left changed value ' + sh.get('value'));
}), 500+speed);
return d;
}
},
{
name: "vertical bottom",
timeout: 1000+speed,
runTest: function(){
var mid = (sv.max + sv.min) >> 1;
sv.set('value', mid, true);
doh.is(mid, sv.get('value'), 'initial value');
var d = new doh.Deferred();
fireTouchEvent(touchstart, sv, sv_width >> 1, (sv_height >> 1) + (sv_handle_height >> 2), speed);
fireTouchEvent(touchend, sv, sv_width >> 1, (sv_height >> 1) + (sv_handle_height >> 2), speed);
setTimeout(d.getTestCallback(function(){
doh.is(mid, sv.get('value'), 'bottom value');
}), 500+speed);
return d;
}
},
{
name: "vertical top",
timeout: 1000+speed,
runTest: function(){
var mid = (sv.max + sv.min) >> 1;
sv.set('value', mid, true);
doh.is(mid, sv.get('value'), 'initial value');
var d = new doh.Deferred();
fireTouchEvent(touchstart, sv, sv_width >> 1, (sv_height >> 1) - (sv_handle_height >> 2));
fireTouchEvent(touchend, sv, sv_width >> 1, (sv_height >> 1) - (sv_handle_height >> 2));
setTimeout(d.getTestCallback(function(){
doh.is(mid, sv.get('value'), 'top value');
}), 500+speed);
return d;
}
},
{
name: "vertical change bottom",
timeout: 1000+speed,
runTest: function(){
var mid = (sv.max + sv.min) >> 1;
sv.set('value', mid, true);
doh.is(mid, sv.get('value'), 'initial value');
var d = new doh.Deferred();
fireTouchEvent(touchstart, sv, sv_width >> 1, (sv_height >> 1) + (sv_handle_height >> 1) + 2, speed >> 1);
fireTouchEvent(touchend, sv, sv_width >> 1, (sv_height >> 1) + (sv_handle_height >> 1) + 2, speed >> 1);
setTimeout(d.getTestCallback(function(){
doh.t(sv.get('value') < mid, 'bottom changed value ' + sv.get('value'));
}), 500+speed);
return d;
}
},
{
name: "vertical change top",
timeout: 1000+speed,
runTest: function(){
var mid = (sv.max + sv.min) >> 1;
sv.set('value', mid, true);
doh.is(mid, sv.get('value'), 'initial value');
var d = new doh.Deferred();
fireTouchEvent(touchstart, sv, sv_width >> 1, (sv_height >> 1) - ((sv_handle_height >> 1) + 2), speed >> 1);
fireTouchEvent(touchend, sv, sv_width >> 1, (sv_height >> 1) - ((sv_handle_height >> 1) + 2), speed >> 1);
setTimeout(d.getTestCallback(function(){
doh.t(sv.get('value') > mid, 'top changed value ' + sv.get('value'));
}), 500+speed);
return d;
}
}
]);
if(has("webkit") || has("ie") === 10 || (!has("ie") && has("trident") > 6)){
doh.register("animation", {
name: "horizontal 100%",
timeout: 2000,
runTest: function(){
var d = new doh.Deferred();
fireTouchEvent(touchstart, sh, 0, sh_height >> 1, 0);
fireTouchEvent(touchend, sh, 0, sh_height >> 1, 0);
var startX = Math.round(domGeometry.position(sh.handle).x), midX, endX;
domStyle.set(sh.handle, transitionDuration, "1000ms");
fireTouchEvent(touchstart, sh, sh_width, sh_height >> 1, 0);
fireTouchEvent(touchend, sh, sh_width, sh_height >> 1, 0);
sh.set('value', sh.max, true);
setTimeout(function(){
midX = domGeometry.position(sh.handle).x;
}, 400);
setTimeout(d.getTestCallback(function(){
endX = Math.round(domGeometry.position(sh.handle).x);
doh.t(midX > startX, "started sliding");
doh.t(midX < endX, "continued sliding");
var zoom = (has("ie") || has("trident") > 6) ? getZoom(sh) : 1;
doh.t(Math.abs(Math.abs(endX-startX)-sh_width*zoom) <= 3, "stopped sliding end="+endX+',start='+startX+',width='+sh_width*zoom);
}), 1100);
return d;
},
tearDown: function(){
domStyle.set(sh.handle, transitionDuration, "");
domStyle.set(sv.handle, transitionDuration, "");
}
})
}
doh.register("log", function(){
dom.byId('failures').innerHTML = doh._failureCount;
dom.byId('errors').innerHTML = doh._errorCount;
});
doh.run();
});
});
</script>
<style>
/* test overrides */
.mblSlider {
zoom: 1.1; /* for testing, to make it easier to touch the handle */
}
.mblSliderV {
width: 1px;
border: 0px none;
}
.mblSliderH .mblSliderProgressBar {
background:transparent url(images/progressBarAnim.gif) repeat;
}
.mblSliderV .mblSliderHandle {
background:transparent url(images/sliderVthumb.png) no-repeat;
border-width:0px;
border-radius:0;
}
.windows_theme .mblSliderV .mblSliderHandle {
background: white none;
}
.windows_theme .mblSliderH {
zoom: 0;
}
</style>
</head>
<body style="visibility:hidden;zoom:1.2;">
<form>
<br>
<center>
<table><tr>
<td>0</td>
<td><input id="sh" data-dojo-type="dojox/mobile/Slider" type="range" data-dojo-props='value:0, min:0, max:20, step:0.1, onChange:function(v){ document.getElementById("sh_val").innerHTML=this.value; }' style="width:200px;" /></td>
<td>20</td>
</tr><tr>
<td></td><td><center>Value: <span id="sh_val">0</span></center></td><td></td>
</tr></table>
</center>
<br>
<center>
<table><tr><td style="width:100px;">
<center>
20<br>
<input id="sv" name="sv" data-dojo-type="dojox/mobile/Slider" type="range" data-dojo-props='value:0, min:-20, max:20, step:1, intermediateChanges:true, onChange:function(v){ document.getElementById("sv_val").innerHTML=this.value; }' style="width:2px;height:200px;" />
-20
</center>
</td><td style="width:80px;">
Value: <span id="sv_val">0</span>
</td></tr></table>
</center>
<br>
<input type=submit>
</form>
Errors: <span id="errors">?</span><br>
Failures: <span id="failures">?</span>
</body>
</html>