summaryrefslogtreecommitdiffstats
path: root/accessible/tests/mochitest/grid.js
diff options
context:
space:
mode:
Diffstat (limited to 'accessible/tests/mochitest/grid.js')
-rw-r--r--accessible/tests/mochitest/grid.js149
1 files changed, 149 insertions, 0 deletions
diff --git a/accessible/tests/mochitest/grid.js b/accessible/tests/mochitest/grid.js
new file mode 100644
index 000000000..56f2412ff
--- /dev/null
+++ b/accessible/tests/mochitest/grid.js
@@ -0,0 +1,149 @@
+const nsIDOMKeyEvent = Components.interfaces.nsIDOMKeyEvent;
+
+/**
+ * Create grid object based on HTML table.
+ */
+function grid(aTableIdentifier)
+{
+ this.getRowCount = function getRowCount()
+ {
+ return this.table.rows.length - (this.table.tHead ? 1 : 0);
+ }
+ this.getColsCount = function getColsCount()
+ {
+ return this.table.rows[0].cells.length;
+ }
+
+ this.getRowAtIndex = function getRowAtIndex(aIndex)
+ {
+ return this.table.rows[this.table.tHead ? aIndex + 1 : aIndex];
+ }
+
+ this.getMaxIndex = function getMaxIndex()
+ {
+ return this.getRowCount() * this.getColsCount() - 1;
+ }
+
+ this.getCellAtIndex = function getCellAtIndex(aIndex)
+ {
+ var rowCount = this.getRowCount();
+ var colsCount = this.getColsCount();
+
+ var rowIdx = Math.floor(aIndex / colsCount);
+ var colIdx = aIndex % colsCount;
+
+ var row = this.getRowAtIndex(rowIdx);
+ return row.cells[colIdx];
+ }
+
+ this.getIndexByCell = function getIndexByCell(aCell)
+ {
+ var colIdx = aCell.cellIndex;
+
+ var rowIdx = aCell.parentNode.rowIndex;
+ if (this.table.tHead)
+ rowIdx -= 1;
+
+ var colsCount = this.getColsCount();
+ return rowIdx * colsCount + colIdx;
+ }
+
+ this.getCurrentCell = function getCurrentCell()
+ {
+ var rowCount = this.table.rows.length;
+ var colsCount = this.getColsCount();
+ for (var rowIdx = 0; rowIdx < rowCount; rowIdx++) {
+ for (var colIdx = 0; colIdx < colsCount; colIdx++) {
+ var cell = this.table.rows[rowIdx].cells[colIdx];
+ if (cell.hasAttribute("tabindex"))
+ return cell;
+ }
+ }
+ return null;
+ }
+
+ this.initGrid = function initGrid()
+ {
+ this.table.addEventListener("keypress", this, false);
+ this.table.addEventListener("click", this, false);
+ }
+
+ this.handleEvent = function handleEvent(aEvent)
+ {
+ if (aEvent instanceof nsIDOMKeyEvent)
+ this.handleKeyEvent(aEvent);
+ else
+ this.handleClickEvent(aEvent);
+ }
+
+ this.handleKeyEvent = function handleKeyEvent(aEvent)
+ {
+ if (aEvent.target.localName != "td")
+ return;
+
+ var cell = aEvent.target;
+ switch(aEvent.keyCode) {
+ case nsIDOMKeyEvent.DOM_VK_UP:
+ var colsCount = this.getColsCount();
+ var idx = this.getIndexByCell(cell);
+ var upidx = idx - colsCount;
+ if (upidx >= 0) {
+ cell.removeAttribute("tabindex");
+ var upcell = this.getCellAtIndex(upidx);
+ upcell.setAttribute("tabindex", "0");
+ upcell.focus();
+ }
+ break;
+
+ case nsIDOMKeyEvent.DOM_VK_DOWN:
+ var colsCount = this.getColsCount();
+ var idx = this.getIndexByCell(cell);
+ var downidx = idx + colsCount;
+ if (downidx <= this.getMaxIndex()) {
+ cell.removeAttribute("tabindex");
+ var downcell = this.getCellAtIndex(downidx);
+ downcell.setAttribute("tabindex", "0");
+ downcell.focus();
+ }
+ break;
+
+ case nsIDOMKeyEvent.DOM_VK_LEFT:
+ var idx = this.getIndexByCell(cell);
+ if (idx > 0) {
+ cell.removeAttribute("tabindex");
+ var prevcell = this.getCellAtIndex(idx - 1);
+ prevcell.setAttribute("tabindex", "0");
+ prevcell.focus();
+ }
+ break;
+
+ case nsIDOMKeyEvent.DOM_VK_RIGHT:
+ var idx = this.getIndexByCell(cell);
+ if (idx < this.getMaxIndex()) {
+ cell.removeAttribute("tabindex");
+ var nextcell = this.getCellAtIndex(idx + 1);
+ nextcell.setAttribute("tabindex", "0");
+ nextcell.focus();
+ }
+ break;
+ }
+ }
+
+ this.handleClickEvent = function handleClickEvent(aEvent)
+ {
+ if (aEvent.target.localName != "td")
+ return;
+
+ var curCell = this.getCurrentCell();
+ var cell = aEvent.target;
+
+ if (cell != curCell) {
+ curCell.removeAttribute("tabindex");
+ cell.setAttribute("tabindex", "0");
+ cell.focus();
+ }
+ }
+
+ this.table = getNode(aTableIdentifier);
+ this.initGrid();
+}