Bug 757598 - Fallback for items that don't have accessible actions. r=davidb
--- a/accessible/src/jsat/VirtualCursorController.jsm
+++ b/accessible/src/jsat/VirtualCursorController.jsm
@@ -131,18 +131,38 @@ var VirtualCursorController = {
}
}
},
activateCurrent: function activateCurrent(document) {
let virtualCursor = this.getVirtualCursor(document);
let acc = virtualCursor.position;
- if (acc.numActions > 0)
+ if (acc.numActions > 0) {
acc.doAction(0);
+ } else {
+ // XXX Some mobile widget sets do not expose actions properly
+ // (via ARIA roles, etc.), so we need to generate a click.
+ // Could possibly be made simpler in the future. Maybe core
+ // engine could expose nsCoreUtiles::DispatchMouseEvent()?
+ let docAcc = gAccRetrieval.getAccessibleFor(this.chromeWin.document);
+ let docX = {}, docY = {}, docW = {}, docH = {};
+ docAcc.getBounds(docX, docY, docW, docH);
+
+ let objX = {}, objY = {}, objW = {}, objH = {};
+ acc.getBounds(objX, objY, objW, objH);
+
+ let x = Math.round((objX.value - docX.value) + objW.value/2);
+ let y = Math.round((objY.value - docY.value) + objH.value/2);
+
+ let cwu = this.chromeWin.QueryInterface(Ci.nsIInterfaceRequestor).
+ getInterface(Ci.nsIDOMWindowUtils);
+ cwu.sendMouseEventToWindow('mousedown', x, y, 0, 1, 0, false);
+ cwu.sendMouseEventToWindow('mouseup', x, y, 0, 1, 0, false);
+ }
},
getVirtualCursor: function getVirtualCursor(document) {
return gAccRetrieval.getAccessibleFor(document).
QueryInterface(Ci.nsIAccessibleCursorable).virtualCursor;
},
SimpleTraversalRule: {