diff --git a/accessible/src/jsat/AccessFu.jsm b/accessible/src/jsat/AccessFu.jsm index 8515344ce302..b7eee12f4472 100644 --- a/accessible/src/jsat/AccessFu.jsm +++ b/accessible/src/jsat/AccessFu.jsm @@ -357,7 +357,8 @@ var AccessFu = { } case Ci.nsIAccessibleEvent.EVENT_SCROLLING_START: { - VirtualCursorController.moveCursorToObject(aEvent.accessible); + VirtualCursorController.moveCursorToObject( + Utils.getVirtualCursor(aEvent.accessibleDocument), aEvent.accessible); break; } case Ci.nsIAccessibleEvent.EVENT_FOCUS: @@ -366,7 +367,8 @@ var AccessFu = { let doc = aEvent.accessibleDocument; if (acc.role != Ci.nsIAccessibleRole.ROLE_DOCUMENT && doc.role != Ci.nsIAccessibleRole.ROLE_CHROME_WINDOW) - VirtualCursorController.moveCursorToObject(acc); + VirtualCursorController.moveCursorToObject( + Utils.getVirtualCursor(doc), acc); let [,extState] = Utils.getStates(acc); let editableState = extState & diff --git a/accessible/src/jsat/Utils.jsm b/accessible/src/jsat/Utils.jsm index 2fa4e588ad8b..a35efd22a30c 100644 --- a/accessible/src/jsat/Utils.jsm +++ b/accessible/src/jsat/Utils.jsm @@ -88,6 +88,21 @@ var Utils = { let extState = {}; aAccessible.getState(state, extState); return [state.value, extState.value]; + }, + + getVirtualCursor: function getVirtualCursor(aDocument) { + let doc = (aDocument instanceof Ci.nsIAccessible) ? aDocument : + gAccRetrieval.getAccessibleFor(aDocument); + + while (doc) { + try { + return doc.QueryInterface(Ci.nsIAccessibleCursorable).virtualCursor; + } catch (x) { + doc = doc.parentDocument; + } + } + + return null; } }; diff --git a/accessible/src/jsat/VirtualCursorController.jsm b/accessible/src/jsat/VirtualCursorController.jsm index d55d458497f1..79b0f445546d 100644 --- a/accessible/src/jsat/VirtualCursorController.jsm +++ b/accessible/src/jsat/VirtualCursorController.jsm @@ -334,12 +334,12 @@ var VirtualCursorController = { }, moveToPoint: function moveToPoint(aDocument, aX, aY) { - this.getVirtualCursor(aDocument).moveToPoint(TraversalRules.Simple, - aX, aY, true); + Utils.getVirtualCursor(aDocument).moveToPoint(TraversalRules.Simple, + aX, aY, true); }, moveForward: function moveForward(aDocument, aLast, aRule) { - let virtualCursor = this.getVirtualCursor(aDocument); + let virtualCursor = Utils.getVirtualCursor(aDocument); if (aLast) { virtualCursor.moveLast(TraversalRules.Simple); } else { @@ -347,13 +347,14 @@ var VirtualCursorController = { virtualCursor.moveNext(aRule || TraversalRules.Simple); } catch (x) { this.moveCursorToObject( - gAccRetrieval.getAccessibleFor(aDocument.activeElement), aRule); + virtualCursor, + gAccRetrieval.getAccessibleFor(aDocument.activeElement), aRule); } } }, moveBackward: function moveBackward(aDocument, aFirst, aRule) { - let virtualCursor = this.getVirtualCursor(aDocument); + let virtualCursor = Utils.getVirtualCursor(aDocument); if (aFirst) { virtualCursor.moveFirst(TraversalRules.Simple); } else { @@ -361,13 +362,14 @@ var VirtualCursorController = { virtualCursor.movePrevious(aRule || TraversalRules.Simple); } catch (x) { this.moveCursorToObject( - gAccRetrieval.getAccessibleFor(aDocument.activeElement), aRule); + virtualCursor, + gAccRetrieval.getAccessibleFor(aDocument.activeElement), aRule); } } }, activateCurrent: function activateCurrent(document) { - let virtualCursor = this.getVirtualCursor(document); + let virtualCursor = Utils.getVirtualCursor(document); let acc = virtualCursor.position; if (acc.actionCount > 0) { @@ -394,24 +396,9 @@ var VirtualCursorController = { } }, - getVirtualCursor: function getVirtualCursor(document) { - return gAccRetrieval.getAccessibleFor(document). - QueryInterface(Ci.nsIAccessibleCursorable).virtualCursor; - }, - - moveCursorToObject: function moveCursorToObject(aAccessible, aRule) { - let doc = aAccessible.document; - while (doc) { - let vc = null; - try { - vc = doc.QueryInterface(Ci.nsIAccessibleCursorable).virtualCursor; - } catch (x) { - doc = doc.parentDocument; - continue; - } - vc.moveNext(aRule || TraversalRules.Simple, aAccessible, true); - break; - } + moveCursorToObject: function moveCursorToObject(aVirtualCursor, + aAccessible, aRule) { + aVirtualCursor.moveNext(aRule || TraversalRules.Simple, aAccessible, true); }, keyMap: {