1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/accessible/tests/mochitest/actions.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,187 @@ 1.4 +//////////////////////////////////////////////////////////////////////////////// 1.5 +// Event constants 1.6 + 1.7 +const MOUSEDOWN_EVENT = 1; 1.8 +const MOUSEUP_EVENT = 2; 1.9 +const CLICK_EVENT = 4; 1.10 +const COMMAND_EVENT = 8; 1.11 +const FOCUS_EVENT = 16; 1.12 + 1.13 +const CLICK_EVENTS = MOUSEDOWN_EVENT | MOUSEUP_EVENT | CLICK_EVENT; 1.14 +const XUL_EVENTS = CLICK_EVENTS | COMMAND_EVENT; 1.15 + 1.16 +//////////////////////////////////////////////////////////////////////////////// 1.17 +// Public functions 1.18 + 1.19 +/** 1.20 + * Test default accessible actions. 1.21 + * 1.22 + * Action tester interface is: 1.23 + * 1.24 + * var actionObj = { 1.25 + * // identifier of accessible to perform an action on 1.26 + * get ID() {}, 1.27 + * 1.28 + * // index of the action 1.29 + * get actionIndex() {}, 1.30 + * 1.31 + * // name of the action 1.32 + * get actionName() {}, 1.33 + * 1.34 + * // DOM events (see constants defined above) 1.35 + * get events() {}, 1.36 + * 1.37 + * // [optional] identifier of target DOM events listeners are registered on, 1.38 + * // used with 'events', if missing then 'ID' is used instead. 1.39 + * get targetID() {}, 1.40 + * 1.41 + * // [optional] perform checks when 'click' event is handled if 'events' 1.42 + * // is used. 1.43 + * checkOnClickEvent: function() {}, 1.44 + * 1.45 + * // [optional] an array of invoker's checker objects (see eventQueue 1.46 + * // constructor events.js) 1.47 + * get eventSeq() {} 1.48 + * }; 1.49 + * 1.50 + * 1.51 + * @param aArray [in] an array of action cheker objects 1.52 + */ 1.53 +function testActions(aArray) 1.54 +{ 1.55 + gActionsQueue = new eventQueue(); 1.56 + 1.57 + for (var idx = 0; idx < aArray.length; idx++) { 1.58 + 1.59 + var actionObj = aArray[idx]; 1.60 + var accOrElmOrID = actionObj.ID; 1.61 + var actionIndex = actionObj.actionIndex; 1.62 + var actionName = actionObj.actionName; 1.63 + var events = actionObj.events; 1.64 + var accOrElmOrIDOfTarget = actionObj.targetID ? 1.65 + actionObj.targetID : accOrElmOrID; 1.66 + 1.67 + var eventSeq = new Array(); 1.68 + if (events) { 1.69 + var elm = getNode(accOrElmOrIDOfTarget); 1.70 + if (events & MOUSEDOWN_EVENT) 1.71 + eventSeq.push(new checkerOfActionInvoker("mousedown", elm)); 1.72 + 1.73 + if (events & MOUSEUP_EVENT) 1.74 + eventSeq.push(new checkerOfActionInvoker("mouseup", elm)); 1.75 + 1.76 + if (events & CLICK_EVENT) 1.77 + eventSeq.push(new checkerOfActionInvoker("click", elm, actionObj)); 1.78 + 1.79 + if (events & COMMAND_EVENT) 1.80 + eventSeq.push(new checkerOfActionInvoker("command", elm)); 1.81 + 1.82 + if (events & FOCUS_EVENT) 1.83 + eventSeq.push(new focusChecker(elm)); 1.84 + } 1.85 + 1.86 + if (actionObj.eventSeq) 1.87 + eventSeq = eventSeq.concat(actionObj.eventSeq); 1.88 + 1.89 + var invoker = new actionInvoker(accOrElmOrID, actionIndex, actionName, 1.90 + eventSeq); 1.91 + gActionsQueue.push(invoker); 1.92 + } 1.93 + 1.94 + gActionsQueue.invoke(); 1.95 +} 1.96 + 1.97 +/** 1.98 + * Test action names and descriptions. 1.99 + */ 1.100 +function testActionNames(aID, aActions) 1.101 +{ 1.102 + var actions = (typeof aActions == "string") ? 1.103 + [ aActions ] : (aActions || []); 1.104 + 1.105 + var acc = getAccessible(aID); 1.106 + is(acc.actionCount, actions.length, "Wong number of actions."); 1.107 + for (var i = 0; i < actions.length; i++ ) { 1.108 + is(acc.getActionName(i), actions[i], "Wrong action name at " + i + " index."); 1.109 + is(acc.getActionDescription(0), gActionDescrMap[actions[i]], 1.110 + "Wrong action description at " + i + "index."); 1.111 + } 1.112 +} 1.113 + 1.114 +//////////////////////////////////////////////////////////////////////////////// 1.115 +// Private 1.116 + 1.117 +var gActionsQueue = null; 1.118 + 1.119 +function actionInvoker(aAccOrElmOrId, aActionIndex, aActionName, aEventSeq) 1.120 +{ 1.121 + this.invoke = function actionInvoker_invoke() 1.122 + { 1.123 + var acc = getAccessible(aAccOrElmOrId); 1.124 + if (!acc) 1.125 + return INVOKER_ACTION_FAILED; 1.126 + 1.127 + var isThereActions = acc.actionCount > 0; 1.128 + ok(isThereActions, 1.129 + "No actions on the accessible for " + prettyName(aAccOrElmOrId)); 1.130 + 1.131 + if (!isThereActions) 1.132 + return INVOKER_ACTION_FAILED; 1.133 + 1.134 + is(acc.getActionName(aActionIndex), aActionName, 1.135 + "Wrong action name of the accessible for " + prettyName(aAccOrElmOrId)); 1.136 + 1.137 + try { 1.138 + acc.doAction(aActionIndex); 1.139 + } 1.140 + catch (e){ 1.141 + ok(false, "doAction(" + aActionIndex + ") failed with: " + e.name); 1.142 + return INVOKER_ACTION_FAILED; 1.143 + } 1.144 + } 1.145 + 1.146 + this.eventSeq = aEventSeq; 1.147 + 1.148 + this.getID = function actionInvoker_getID() 1.149 + { 1.150 + return "invoke an action " + aActionName + " at index " + aActionIndex + 1.151 + " on " + prettyName(aAccOrElmOrId); 1.152 + } 1.153 +} 1.154 + 1.155 +function checkerOfActionInvoker(aType, aTarget, aActionObj) 1.156 +{ 1.157 + this.type = aType; 1.158 + 1.159 + this.target = aTarget; 1.160 + 1.161 + this.phase = false; 1.162 + 1.163 + this.getID = function getID() 1.164 + { 1.165 + return aType + " event handling"; 1.166 + } 1.167 + 1.168 + this.check = function check(aEvent) 1.169 + { 1.170 + if (aActionObj && "checkOnClickEvent" in aActionObj) 1.171 + aActionObj.checkOnClickEvent(aEvent); 1.172 + } 1.173 +} 1.174 + 1.175 +var gActionDescrMap = 1.176 +{ 1.177 + jump: "Jump", 1.178 + press: "Press", 1.179 + check: "Check", 1.180 + uncheck: "Uncheck", 1.181 + select: "Select", 1.182 + open: "Open", 1.183 + close: "Close", 1.184 + switch: "Switch", 1.185 + click: "Click", 1.186 + collapse: "Collapse", 1.187 + expand: "Expand", 1.188 + activate: "Activate", 1.189 + cycle: "Cycle" 1.190 +};