Bug 1053462 - Add isFromUserInput to vc change events and pivot methods. r=surkov

This commit is contained in:
Eitan Isaacson 2014-08-14 21:44:59 -04:00
parent d0f7653db0
commit 622cfa0912
9 changed files with 170 additions and 85 deletions

View File

@ -186,8 +186,9 @@ AccVCChangeEvent::
AccVCChangeEvent(Accessible* aAccessible, AccVCChangeEvent(Accessible* aAccessible,
nsIAccessible* aOldAccessible, nsIAccessible* aOldAccessible,
int32_t aOldStart, int32_t aOldEnd, int32_t aOldStart, int32_t aOldEnd,
int16_t aReason) : int16_t aReason, EIsFromUserInput aIsFromUserInput) :
AccEvent(::nsIAccessibleEvent::EVENT_VIRTUALCURSOR_CHANGED, aAccessible), AccEvent(::nsIAccessibleEvent::EVENT_VIRTUALCURSOR_CHANGED, aAccessible,
aIsFromUserInput),
mOldAccessible(aOldAccessible), mOldStart(aOldStart), mOldEnd(aOldEnd), mOldAccessible(aOldAccessible), mOldStart(aOldStart), mOldEnd(aOldEnd),
mReason(aReason) mReason(aReason)
{ {

View File

@ -469,7 +469,8 @@ public:
AccVCChangeEvent(Accessible* aAccessible, AccVCChangeEvent(Accessible* aAccessible,
nsIAccessible* aOldAccessible, nsIAccessible* aOldAccessible,
int32_t aOldStart, int32_t aOldEnd, int32_t aOldStart, int32_t aOldEnd,
int16_t aReason); int16_t aReason,
EIsFromUserInput aIsFromUserInput = eFromUserInput);
virtual ~AccVCChangeEvent() { } virtual ~AccVCChangeEvent() { }

View File

@ -101,7 +101,7 @@ nsAccessiblePivot::SetPosition(nsIAccessible* aPosition)
int32_t oldStart = mStartOffset, oldEnd = mEndOffset; int32_t oldStart = mStartOffset, oldEnd = mEndOffset;
mStartOffset = mEndOffset = -1; mStartOffset = mEndOffset = -1;
NotifyOfPivotChange(secondPosition, oldStart, oldEnd, NotifyOfPivotChange(secondPosition, oldStart, oldEnd,
nsIAccessiblePivot::REASON_NONE); nsIAccessiblePivot::REASON_NONE, false);
return NS_OK; return NS_OK;
} }
@ -154,7 +154,8 @@ nsAccessiblePivot::GetEndOffset(int32_t* aEndOffset)
NS_IMETHODIMP NS_IMETHODIMP
nsAccessiblePivot::SetTextRange(nsIAccessibleText* aTextAccessible, nsAccessiblePivot::SetTextRange(nsIAccessibleText* aTextAccessible,
int32_t aStartOffset, int32_t aEndOffset) int32_t aStartOffset, int32_t aEndOffset,
bool aIsFromUserInput, uint8_t aArgc)
{ {
NS_ENSURE_ARG(aTextAccessible); NS_ENSURE_ARG(aTextAccessible);
@ -186,7 +187,8 @@ nsAccessiblePivot::SetTextRange(nsIAccessibleText* aTextAccessible,
mPosition = newPosition; mPosition = newPosition;
NotifyOfPivotChange(oldPosition, oldStart, oldEnd, NotifyOfPivotChange(oldPosition, oldStart, oldEnd,
nsIAccessiblePivot::REASON_TEXT); nsIAccessiblePivot::REASON_TEXT,
(aArgc > 0) ? aIsFromUserInput : true);
return NS_OK; return NS_OK;
} }
@ -196,7 +198,7 @@ nsAccessiblePivot::SetTextRange(nsIAccessibleText* aTextAccessible,
NS_IMETHODIMP NS_IMETHODIMP
nsAccessiblePivot::MoveNext(nsIAccessibleTraversalRule* aRule, nsAccessiblePivot::MoveNext(nsIAccessibleTraversalRule* aRule,
nsIAccessible* aAnchor, bool aIncludeStart, nsIAccessible* aAnchor, bool aIncludeStart,
uint8_t aArgc, bool* aResult) bool aIsFromUserInput, uint8_t aArgc, bool* aResult)
{ {
NS_ENSURE_ARG(aResult); NS_ENSURE_ARG(aResult);
NS_ENSURE_ARG(aRule); NS_ENSURE_ARG(aRule);
@ -215,7 +217,8 @@ nsAccessiblePivot::MoveNext(nsIAccessibleTraversalRule* aRule,
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
if (accessible) if (accessible)
*aResult = MovePivotInternal(accessible, nsIAccessiblePivot::REASON_NEXT); *aResult = MovePivotInternal(accessible, nsIAccessiblePivot::REASON_NEXT,
(aArgc > 2) ? aIsFromUserInput : true);
return NS_OK; return NS_OK;
} }
@ -223,7 +226,7 @@ nsAccessiblePivot::MoveNext(nsIAccessibleTraversalRule* aRule,
NS_IMETHODIMP NS_IMETHODIMP
nsAccessiblePivot::MovePrevious(nsIAccessibleTraversalRule* aRule, nsAccessiblePivot::MovePrevious(nsIAccessibleTraversalRule* aRule,
nsIAccessible* aAnchor, nsIAccessible* aAnchor,
bool aIncludeStart, bool aIncludeStart, bool aIsFromUserInput,
uint8_t aArgc, bool* aResult) uint8_t aArgc, bool* aResult)
{ {
NS_ENSURE_ARG(aResult); NS_ENSURE_ARG(aResult);
@ -243,13 +246,16 @@ nsAccessiblePivot::MovePrevious(nsIAccessibleTraversalRule* aRule,
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
if (accessible) if (accessible)
*aResult = MovePivotInternal(accessible, nsIAccessiblePivot::REASON_PREV); *aResult = MovePivotInternal(accessible, nsIAccessiblePivot::REASON_PREV,
(aArgc > 2) ? aIsFromUserInput : true);
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsAccessiblePivot::MoveFirst(nsIAccessibleTraversalRule* aRule, bool* aResult) nsAccessiblePivot::MoveFirst(nsIAccessibleTraversalRule* aRule,
bool aIsFromUserInput,
uint8_t aArgc, bool* aResult)
{ {
NS_ENSURE_ARG(aResult); NS_ENSURE_ARG(aResult);
NS_ENSURE_ARG(aRule); NS_ENSURE_ARG(aRule);
@ -262,14 +268,16 @@ nsAccessiblePivot::MoveFirst(nsIAccessibleTraversalRule* aRule, bool* aResult)
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
if (accessible) if (accessible)
*aResult = MovePivotInternal(accessible, nsIAccessiblePivot::REASON_FIRST); *aResult = MovePivotInternal(accessible, nsIAccessiblePivot::REASON_FIRST,
(aArgc > 0) ? aIsFromUserInput : true);
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsAccessiblePivot::MoveLast(nsIAccessibleTraversalRule* aRule, nsAccessiblePivot::MoveLast(nsIAccessibleTraversalRule* aRule,
bool* aResult) bool aIsFromUserInput,
uint8_t aArgc, bool* aResult)
{ {
NS_ENSURE_ARG(aResult); NS_ENSURE_ARG(aResult);
NS_ENSURE_ARG(aRule); NS_ENSURE_ARG(aRule);
@ -291,13 +299,16 @@ nsAccessiblePivot::MoveLast(nsIAccessibleTraversalRule* aRule,
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
if (accessible) if (accessible)
*aResult = MovePivotInternal(accessible, nsAccessiblePivot::REASON_LAST); *aResult = MovePivotInternal(accessible, nsAccessiblePivot::REASON_LAST,
(aArgc > 0) ? aIsFromUserInput : true);
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP NS_IMETHODIMP
nsAccessiblePivot::MoveNextByText(TextBoundaryType aBoundary, bool* aResult) nsAccessiblePivot::MoveNextByText(TextBoundaryType aBoundary,
bool aIsFromUserInput, uint8_t aArgc,
bool* aResult)
{ {
NS_ENSURE_ARG(aResult); NS_ENSURE_ARG(aResult);
@ -407,13 +418,16 @@ nsAccessiblePivot::MoveNextByText(TextBoundaryType aBoundary, bool* aResult)
mStartOffset = tempStart; mStartOffset = tempStart;
mEndOffset = tempEnd; mEndOffset = tempEnd;
NotifyOfPivotChange(startPosition, oldStart, oldEnd, NotifyOfPivotChange(startPosition, oldStart, oldEnd,
nsIAccessiblePivot::REASON_TEXT); nsIAccessiblePivot::REASON_TEXT,
(aArgc > 0) ? aIsFromUserInput : true);
return NS_OK; return NS_OK;
} }
} }
NS_IMETHODIMP NS_IMETHODIMP
nsAccessiblePivot::MovePreviousByText(TextBoundaryType aBoundary, bool* aResult) nsAccessiblePivot::MovePreviousByText(TextBoundaryType aBoundary,
bool aIsFromUserInput, uint8_t aArgc,
bool* aResult)
{ {
NS_ENSURE_ARG(aResult); NS_ENSURE_ARG(aResult);
@ -536,7 +550,8 @@ nsAccessiblePivot::MovePreviousByText(TextBoundaryType aBoundary, bool* aResult)
mEndOffset = tempEnd; mEndOffset = tempEnd;
NotifyOfPivotChange(startPosition, oldStart, oldEnd, NotifyOfPivotChange(startPosition, oldStart, oldEnd,
nsIAccessiblePivot::REASON_TEXT); nsIAccessiblePivot::REASON_TEXT,
(aArgc > 0) ? aIsFromUserInput : true);
return NS_OK; return NS_OK;
} }
} }
@ -544,6 +559,7 @@ nsAccessiblePivot::MovePreviousByText(TextBoundaryType aBoundary, bool* aResult)
NS_IMETHODIMP NS_IMETHODIMP
nsAccessiblePivot::MoveToPoint(nsIAccessibleTraversalRule* aRule, nsAccessiblePivot::MoveToPoint(nsIAccessibleTraversalRule* aRule,
int32_t aX, int32_t aY, bool aIgnoreNoMatch, int32_t aX, int32_t aY, bool aIgnoreNoMatch,
bool aIsFromUserInput, uint8_t aArgc,
bool* aResult) bool* aResult)
{ {
NS_ENSURE_ARG_POINTER(aResult); NS_ENSURE_ARG_POINTER(aResult);
@ -581,7 +597,8 @@ nsAccessiblePivot::MoveToPoint(nsIAccessibleTraversalRule* aRule,
} }
if (match || !aIgnoreNoMatch) if (match || !aIgnoreNoMatch)
*aResult = MovePivotInternal(match, nsIAccessiblePivot::REASON_POINT); *aResult = MovePivotInternal(match, nsIAccessiblePivot::REASON_POINT,
(aArgc > 0) ? aIsFromUserInput : true);
return NS_OK; return NS_OK;
} }
@ -626,14 +643,16 @@ nsAccessiblePivot::IsDescendantOf(Accessible* aAccessible, Accessible* aAncestor
bool bool
nsAccessiblePivot::MovePivotInternal(Accessible* aPosition, nsAccessiblePivot::MovePivotInternal(Accessible* aPosition,
PivotMoveReason aReason) PivotMoveReason aReason,
bool aIsFromUserInput)
{ {
nsRefPtr<Accessible> oldPosition = mPosition.forget(); nsRefPtr<Accessible> oldPosition = mPosition.forget();
mPosition = aPosition; mPosition = aPosition;
int32_t oldStart = mStartOffset, oldEnd = mEndOffset; int32_t oldStart = mStartOffset, oldEnd = mEndOffset;
mStartOffset = mEndOffset = -1; mStartOffset = mEndOffset = -1;
return NotifyOfPivotChange(oldPosition, oldStart, oldEnd, aReason); return NotifyOfPivotChange(oldPosition, oldStart, oldEnd, aReason,
aIsFromUserInput);
} }
Accessible* Accessible*
@ -824,7 +843,7 @@ nsAccessiblePivot::SearchForText(Accessible* aAccessible, bool aBackward)
bool bool
nsAccessiblePivot::NotifyOfPivotChange(Accessible* aOldPosition, nsAccessiblePivot::NotifyOfPivotChange(Accessible* aOldPosition,
int32_t aOldStart, int32_t aOldEnd, int32_t aOldStart, int32_t aOldEnd,
int16_t aReason) int16_t aReason, bool aIsFromUserInput)
{ {
if (aOldPosition == mPosition && if (aOldPosition == mPosition &&
aOldStart == mStartOffset && aOldEnd == mEndOffset) aOldStart == mStartOffset && aOldEnd == mEndOffset)
@ -833,7 +852,8 @@ nsAccessiblePivot::NotifyOfPivotChange(Accessible* aOldPosition,
nsTObserverArray<nsCOMPtr<nsIAccessiblePivotObserver> >::ForwardIterator iter(mObservers); nsTObserverArray<nsCOMPtr<nsIAccessiblePivotObserver> >::ForwardIterator iter(mObservers);
while (iter.HasMore()) { while (iter.HasMore()) {
nsIAccessiblePivotObserver* obs = iter.GetNext(); nsIAccessiblePivotObserver* obs = iter.GetNext();
obs->OnPivotChanged(this, aOldPosition, aOldStart, aOldEnd, aReason); obs->OnPivotChanged(this, aOldPosition, aOldStart, aOldEnd, aReason,
aIsFromUserInput);
} }
return true; return true;

View File

@ -49,7 +49,8 @@ private:
*/ */
bool NotifyOfPivotChange(Accessible* aOldAccessible, bool NotifyOfPivotChange(Accessible* aOldAccessible,
int32_t aOldStart, int32_t aOldEnd, int32_t aOldStart, int32_t aOldEnd,
PivotMoveReason aReason); PivotMoveReason aReason,
bool aIsFromUserInput);
/* /*
* Check to see that the given accessible is a descendant of given ancestor * Check to see that the given accessible is a descendant of given ancestor
@ -95,7 +96,8 @@ private:
/* /*
* Update the pivot, and notify observers. Return true if it moved. * Update the pivot, and notify observers. Return true if it moved.
*/ */
bool MovePivotInternal(Accessible* aPosition, PivotMoveReason aReason); bool MovePivotInternal(Accessible* aPosition, PivotMoveReason aReason,
bool aIsFromUserInput);
/* /*
* Get initial node we should start a search from with a given rule. * Get initial node we should start a search from with a given rule.

View File

@ -816,11 +816,12 @@ NS_IMETHODIMP
DocAccessible::OnPivotChanged(nsIAccessiblePivot* aPivot, DocAccessible::OnPivotChanged(nsIAccessiblePivot* aPivot,
nsIAccessible* aOldAccessible, nsIAccessible* aOldAccessible,
int32_t aOldStart, int32_t aOldEnd, int32_t aOldStart, int32_t aOldEnd,
PivotMoveReason aReason) PivotMoveReason aReason,
bool aIsFromUserInput)
{ {
nsRefPtr<AccEvent> event = new AccVCChangeEvent(this, aOldAccessible, nsRefPtr<AccEvent> event = new AccVCChangeEvent(
aOldStart, aOldEnd, this, aOldAccessible, aOldStart, aOldEnd, aReason,
aReason); aIsFromUserInput ? eFromUserInput : eNoUserInput);
nsEventShell::FireEvent(event); nsEventShell::FireEvent(event);
return NS_OK; return NS_OK;

View File

@ -20,7 +20,7 @@ interface nsIAccessiblePivotObserver;
* provides traversal methods to move the pivot to next/prev state that complies * provides traversal methods to move the pivot to next/prev state that complies
* to a given rule. * to a given rule.
*/ */
[scriptable, uuid(c2938033-e240-4fe5-9cb6-e7ad649ccd10)] [scriptable, uuid(81fe5144-059b-42db-bd3a-f6ce3158d5e9)]
interface nsIAccessiblePivot : nsISupports interface nsIAccessiblePivot : nsISupports
{ {
const TextBoundaryType CHAR_BOUNDARY = 0; const TextBoundaryType CHAR_BOUNDARY = 0;
@ -64,91 +64,114 @@ interface nsIAccessiblePivot : nsISupports
/** /**
* Set the pivot's text range in a text accessible. * Set the pivot's text range in a text accessible.
* *
* @param aTextAccessible [in] the text accessible that contains the desired * @param aTextAccessible [in] the text accessible that contains the desired
* range. * range.
* @param aStartOffset [in] the start offset to set. * @param aStartOffset [in] the start offset to set.
* @param aEndOffset [in] the end offset to set. * @param aEndOffset [in] the end offset to set.
* @param aIsFromUserInput [in] the pivot changed because of direct user input
* (default is true).
* @throws NS_ERROR_INVALID_ARG when the offset exceeds the accessible's * @throws NS_ERROR_INVALID_ARG when the offset exceeds the accessible's
* character count. * character count.
*/ */
void setTextRange(in nsIAccessibleText aTextAccessible, [optional_argc] void setTextRange(in nsIAccessibleText aTextAccessible,
in long aStartOffset, in long aEndOffset); in long aStartOffset, in long aEndOffset,
[optional] in boolean aIsFromUserInput);
/** /**
* Move pivot to next object, from current position or given anchor, * Move pivot to next object, from current position or given anchor,
* complying to given traversal rule. * complying to given traversal rule.
* *
* @param aRule [in] traversal rule to use. * @param aRule [in] traversal rule to use.
* @param aAnchor [in] accessible to start search from, if not provided, * @param aAnchor [in] accessible to start search from, if not provided,
* current position will be used. * current position will be used.
* @param aIncludeStart [in] include anchor accessible in search. * @param aIncludeStart [in] include anchor accessible in search.
* @param aIsFromUserInput [in] the pivot changed because of direct user input
* (default is true).
* @return true on success, false if there are no new nodes to traverse to. * @return true on success, false if there are no new nodes to traverse to.
*/ */
[optional_argc] boolean moveNext(in nsIAccessibleTraversalRule aRule, [optional_argc] boolean moveNext(in nsIAccessibleTraversalRule aRule,
[optional] in nsIAccessible aAnchor, [optional] in nsIAccessible aAnchor,
[optional] in boolean aIncludeStart); [optional] in boolean aIncludeStart,
[optional] in boolean aIsFromUserInput);
/** /**
* Move pivot to previous object, from current position or given anchor, * Move pivot to previous object, from current position or given anchor,
* complying to given traversal rule. * complying to given traversal rule.
* *
* @param aRule [in] traversal rule to use. * @param aRule [in] traversal rule to use.
* @param aAnchor [in] accessible to start search from, if not provided, * @param aAnchor [in] accessible to start search from, if not provided,
* current position will be used. * current position will be used.
* @param aIncludeStart [in] include anchor accessible in search. * @param aIncludeStart [in] include anchor accessible in search.
* @param aIsFromUserInput [in] the pivot changed because of direct user input
* (default is true).
* @return true on success, false if there are no new nodes to traverse to. * @return true on success, false if there are no new nodes to traverse to.
*/ */
[optional_argc] boolean movePrevious(in nsIAccessibleTraversalRule aRule, [optional_argc] boolean movePrevious(in nsIAccessibleTraversalRule aRule,
[optional] in nsIAccessible aAnchor, [optional] in nsIAccessible aAnchor,
[optional] in boolean aIncludeStart); [optional] in boolean aIncludeStart,
[optional] in boolean aIsFromUserInput);
/** /**
* Move pivot to first object in subtree complying to given traversal rule. * Move pivot to first object in subtree complying to given traversal rule.
* *
* @param aRule [in] traversal rule to use. * @param aRule [in] traversal rule to use.
* @param aIsFromUserInput [in] the pivot changed because of direct user input
* (default is true).
* @return true on success, false if there are no new nodes to traverse to. * @return true on success, false if there are no new nodes to traverse to.
*/ */
boolean moveFirst(in nsIAccessibleTraversalRule aRule); [optional_argc] boolean moveFirst(in nsIAccessibleTraversalRule aRule,
[optional] in boolean aIsFromUserInput);
/** /**
* Move pivot to last object in subtree complying to given traversal rule. * Move pivot to last object in subtree complying to given traversal rule.
* *
* @param aRule [in] traversal rule to use. * @param aRule [in] traversal rule to use.
* @return true on success, false if there are no new nodes to traverse to. * @param aIsFromUserInput [in] the pivot changed because of direct user input
* (default is true).
*/ */
boolean moveLast(in nsIAccessibleTraversalRule aRule); [optional_argc] boolean moveLast(in nsIAccessibleTraversalRule aRule,
[optional] in boolean aIsFromUserInput);
/** /**
* Move pivot to next text range. * Move pivot to next text range.
* *
* @param aBoundary [in] type of boundary for next text range, character, word, * @param aBoundary [in] type of boundary for next text range,
* etc. * character, word, etc.
* @param aIsFromUserInput [in] the pivot changed because of direct user input
* (default is true).
* @return true on success, false if there are is no more text. * @return true on success, false if there are is no more text.
*/ */
boolean moveNextByText(in TextBoundaryType aBoundary); [optional_argc] boolean moveNextByText(in TextBoundaryType aBoundary,
[optional] in boolean aIsFromUserInput);
/** /**
* Move pivot to previous text range. * Move pivot to previous text range.
* *
* @param aBoundary [in] type of boundary for previous text range, character, * @param aBoundary [in] type of boundary for next text range,
* word, etc. * character, word, etc.
* @param aIsFromUserInput [in] the pivot changed because of direct user input
* (default is true).
* @return true on success, false if there are is no more text. * @return true on success, false if there are is no more text.
*/ */
boolean movePreviousByText(in TextBoundaryType aBoundary); [optional_argc] boolean movePreviousByText(in TextBoundaryType aBoundary,
[optional] in boolean aIsFromUserInput);
/** /**
* Move pivot to given coordinate in screen pixels. * Move pivot to given coordinate in screen pixels.
* *
* @param aRule [in] raversal rule to use. * @param aRule [in] raversal rule to use.
* @param aX [in] screen's x coordinate * @param aX [in] screen's x coordinate
* @param aY [in] screen's y coordinate * @param aY [in] screen's y coordinate
* @param aIgnoreNoMatch [in] don't unset position if no object was found at * @param aIgnoreNoMatch [in] don't unset position if no object was found
* point. * at point.
* @param aIsFromUserInput [in] the pivot changed because of direct user input
* (default is true).
* @return true on success, false if the pivot has not been moved. * @return true on success, false if the pivot has not been moved.
*/ */
boolean moveToPoint(in nsIAccessibleTraversalRule aRule, [optional_argc] boolean moveToPoint(in nsIAccessibleTraversalRule aRule,
in long aX, in long aY, in long aX, in long aY,
in boolean aIgnoreNoMatch); in boolean aIgnoreNoMatch,
[optional] in boolean aIsFromUserInput);
/** /**
* Add an observer for pivot changes. * Add an observer for pivot changes.
@ -174,19 +197,23 @@ interface nsIAccessiblePivotObserver : nsISupports
/** /**
* Called when the pivot changes. * Called when the pivot changes.
* *
* @param aPivot [in] the pivot that has changed. * @param aPivot [in] the pivot that has changed.
* @param aOldAccessible [in] the old pivot position before the change, or null. * @param aOldAccessible [in] the old pivot position before the change,
* @param aOldStart [in] the old start offset, or -1. * or null.
* @param aOldEnd [in] the old end offset, or -1. * @param aOldStart [in] the old start offset, or -1.
* @param aReason [in] the reason for the pivot change. * @param aOldEnd [in] the old end offset, or -1.
* @param aReason [in] the reason for the pivot change.
* @param aIsFromUserInput [in] the pivot changed because of direct user input
* (default is true).
*/ */
void onPivotChanged(in nsIAccessiblePivot aPivot, void onPivotChanged(in nsIAccessiblePivot aPivot,
in nsIAccessible aOldAccessible, in nsIAccessible aOldAccessible,
in long aOldStart, in long aOldEnd, in long aOldStart, in long aOldEnd,
in PivotMoveReason aReason); in PivotMoveReason aReason,
in boolean aIsFromUserInput);
}; };
[scriptable, uuid(4d9c4352-20f5-4c54-9580-0c77bb6b1115)] [scriptable, uuid(e197460d-1eff-4247-b4bb-a43be1840dae)]
interface nsIAccessibleTraversalRule : nsISupports interface nsIAccessibleTraversalRule : nsISupports
{ {
/* Ignore this accessible object */ /* Ignore this accessible object */

View File

@ -75,11 +75,12 @@ var ObjectTraversalRule =
/** /**
* A checker for virtual cursor changed events. * A checker for virtual cursor changed events.
*/ */
function VCChangedChecker(aDocAcc, aIdOrNameOrAcc, aTextOffsets, aPivotMoveMethod) function VCChangedChecker(aDocAcc, aIdOrNameOrAcc, aTextOffsets, aPivotMoveMethod,
aIsFromUserInput)
{ {
this.__proto__ = new invokerChecker(EVENT_VIRTUALCURSOR_CHANGED, aDocAcc); this.__proto__ = new invokerChecker(EVENT_VIRTUALCURSOR_CHANGED, aDocAcc);
this.match = function VCChangedChecker_check(aEvent) this.match = function VCChangedChecker_match(aEvent)
{ {
var event = null; var event = null;
try { try {
@ -114,6 +115,9 @@ function VCChangedChecker(aDocAcc, aIdOrNameOrAcc, aTextOffsets, aPivotMoveMetho
"expecting " + aIdOrNameOrAcc + ", got '" + "expecting " + aIdOrNameOrAcc + ", got '" +
prettyName(position)); prettyName(position));
SimpleTest.is(aEvent.isFromUserInput, aIsFromUserInput,
"Expected user input is " + aIsFromUserInput + '\n');
if (aTextOffsets) { if (aTextOffsets) {
SimpleTest.is(aDocAcc.virtualCursor.startOffset, aTextOffsets[0], SimpleTest.is(aDocAcc.virtualCursor.startOffset, aTextOffsets[0],
"wrong start offset"); "wrong start offset");
@ -190,7 +194,7 @@ function setVCRangeInvoker(aDocAcc, aTextAccessible, aTextOffsets)
}; };
this.eventSeq = [ this.eventSeq = [
new VCChangedChecker(aDocAcc, aTextAccessible, aTextOffsets, "setTextRange") new VCChangedChecker(aDocAcc, aTextAccessible, aTextOffsets, "setTextRange", true)
]; ];
} }
@ -203,8 +207,11 @@ function setVCRangeInvoker(aDocAcc, aTextAccessible, aTextOffsets)
* @param aIdOrNameOrAcc [in] id, accessible or accessible name to expect * @param aIdOrNameOrAcc [in] id, accessible or accessible name to expect
* virtual cursor to land on after performing move method. * virtual cursor to land on after performing move method.
* false if no move is expected. * false if no move is expected.
* @param aIsFromUserInput [in] set user input flag when invoking method, and
* expect it in the event.
*/ */
function setVCPosInvoker(aDocAcc, aPivotMoveMethod, aRule, aIdOrNameOrAcc) function setVCPosInvoker(aDocAcc, aPivotMoveMethod, aRule, aIdOrNameOrAcc,
aIsFromUserInput)
{ {
var expectMove = (aIdOrNameOrAcc != false); var expectMove = (aIdOrNameOrAcc != false);
this.invoke = function virtualCursorChangedInvoker_invoke() this.invoke = function virtualCursorChangedInvoker_invoke()
@ -212,7 +219,20 @@ function setVCPosInvoker(aDocAcc, aPivotMoveMethod, aRule, aIdOrNameOrAcc)
VCChangedChecker. VCChangedChecker.
storePreviousPosAndOffset(aDocAcc.virtualCursor); storePreviousPosAndOffset(aDocAcc.virtualCursor);
if (aPivotMoveMethod && aRule) { if (aPivotMoveMethod && aRule) {
var moved = aDocAcc.virtualCursor[aPivotMoveMethod](aRule); var moved = false;
switch (aPivotMoveMethod) {
case 'moveFirst':
case 'moveLast':
moved = aDocAcc.virtualCursor[aPivotMoveMethod](aRule,
aIsFromUserInput === undefined ? true : aIsFromUserInput);
break;
case 'moveNext':
case 'movePrevious':
moved = aDocAcc.virtualCursor[aPivotMoveMethod](aRule,
aDocAcc.virtualCursor.position, false,
aIsFromUserInput === undefined ? true : aIsFromUserInput);
break;
}
SimpleTest.is(!!moved, !!expectMove, SimpleTest.is(!!moved, !!expectMove,
"moved pivot with " + aPivotMoveMethod + "moved pivot with " + aPivotMoveMethod +
" to " + aIdOrNameOrAcc); " to " + aIdOrNameOrAcc);
@ -228,7 +248,8 @@ function setVCPosInvoker(aDocAcc, aPivotMoveMethod, aRule, aIdOrNameOrAcc)
if (expectMove) { if (expectMove) {
this.eventSeq = [ this.eventSeq = [
new VCChangedChecker(aDocAcc, aIdOrNameOrAcc, null, aPivotMoveMethod) new VCChangedChecker(aDocAcc, aIdOrNameOrAcc, null, aPivotMoveMethod,
aIsFromUserInput === undefined ? !!aPivotMoveMethod : aIsFromUserInput)
]; ];
} else { } else {
this.eventSeq = []; this.eventSeq = [];
@ -249,15 +270,19 @@ function setVCPosInvoker(aDocAcc, aPivotMoveMethod, aRule, aIdOrNameOrAcc)
* @param aIdOrNameOrAcc [in] id, accessible or accessible name to expect * @param aIdOrNameOrAcc [in] id, accessible or accessible name to expect
* virtual cursor to land on after performing move method. * virtual cursor to land on after performing move method.
* false if no move is expected. * false if no move is expected.
* @param aIsFromUserInput [in] set user input flag when invoking method, and
* expect it in the event.
*/ */
function setVCTextInvoker(aDocAcc, aPivotMoveMethod, aBoundary, aTextOffsets, aIdOrNameOrAcc) function setVCTextInvoker(aDocAcc, aPivotMoveMethod, aBoundary, aTextOffsets,
aIdOrNameOrAcc, aIsFromUserInput)
{ {
var expectMove = (aIdOrNameOrAcc != false); var expectMove = (aIdOrNameOrAcc != false);
this.invoke = function virtualCursorChangedInvoker_invoke() this.invoke = function virtualCursorChangedInvoker_invoke()
{ {
VCChangedChecker.storePreviousPosAndOffset(aDocAcc.virtualCursor); VCChangedChecker.storePreviousPosAndOffset(aDocAcc.virtualCursor);
SimpleTest.info(aDocAcc.virtualCursor.position); SimpleTest.info(aDocAcc.virtualCursor.position);
var moved = aDocAcc.virtualCursor[aPivotMoveMethod](aBoundary); var moved = aDocAcc.virtualCursor[aPivotMoveMethod](aBoundary,
aIsFromUserInput === undefined ? true : false);
SimpleTest.is(!!moved, !!expectMove, SimpleTest.is(!!moved, !!expectMove,
"moved pivot by text with " + aPivotMoveMethod + "moved pivot by text with " + aPivotMoveMethod +
" to " + aIdOrNameOrAcc); " to " + aIdOrNameOrAcc);
@ -272,7 +297,8 @@ function setVCTextInvoker(aDocAcc, aPivotMoveMethod, aBoundary, aTextOffsets, aI
if (expectMove) { if (expectMove) {
this.eventSeq = [ this.eventSeq = [
new VCChangedChecker(aDocAcc, aIdOrNameOrAcc, aTextOffsets, aPivotMoveMethod) new VCChangedChecker(aDocAcc, aIdOrNameOrAcc, aTextOffsets, aPivotMoveMethod,
aIsFromUserInput === undefined ? true : aIsFromUserInput)
]; ];
} else { } else {
this.eventSeq = []; this.eventSeq = [];
@ -317,7 +343,7 @@ function moveVCCoordInvoker(aDocAcc, aX, aY, aIgnoreNoMatch,
if (expectMove) { if (expectMove) {
this.eventSeq = [ this.eventSeq = [
new VCChangedChecker(aDocAcc, aIdOrNameOrAcc, null, 'moveToPoint') new VCChangedChecker(aDocAcc, aIdOrNameOrAcc, null, 'moveToPoint', true)
]; ];
} else { } else {
this.eventSeq = []; this.eventSeq = [];
@ -407,7 +433,8 @@ function queueTraversalSequence(aQueue, aDocAcc, aRule, aModalRoot, aSequence)
// No further more matches for given rule, expect no virtual cursor changes. // No further more matches for given rule, expect no virtual cursor changes.
aQueue.push(new setVCPosInvoker(aDocAcc, "moveNext", aRule, false)); aQueue.push(new setVCPosInvoker(aDocAcc, "moveNext", aRule, false));
aQueue.push(new setVCPosInvoker(aDocAcc, "moveFirst", aRule, aSequence[0])); // set isFromUserInput to false, just to test..
aQueue.push(new setVCPosInvoker(aDocAcc, "moveFirst", aRule, aSequence[0], false));
// No previous more matches for given rule, expect no virtual cursor changes. // No previous more matches for given rule, expect no virtual cursor changes.
aQueue.push(new setVCPosInvoker(aDocAcc, "movePrevious", aRule, false)); aQueue.push(new setVCPosInvoker(aDocAcc, "movePrevious", aRule, false));

View File

@ -96,8 +96,10 @@
NS_ERROR_INVALID_ARG)); NS_ERROR_INVALID_ARG));
// Put cursor in an ignored subtree // Put cursor in an ignored subtree
// set isFromUserInput to false, just to test..
gQueue.push(new setVCPosInvoker(docAcc, null, null, gQueue.push(new setVCPosInvoker(docAcc, null, null,
getAccessible(doc.getElementById("hidden-link")))); getAccessible(doc.getElementById("hidden-link")),
false));
// Next item shoud be outside of that subtree // Next item shoud be outside of that subtree
gQueue.push(new setVCPosInvoker(docAcc, "moveNext", ObjectTraversalRule, "An ")); gQueue.push(new setVCPosInvoker(docAcc, "moveNext", ObjectTraversalRule, "An "));

View File

@ -53,8 +53,10 @@
getAccessible(doc.getElementById('paragraph-1'), nsIAccessibleText))); getAccessible(doc.getElementById('paragraph-1'), nsIAccessibleText)));
gQueue.push(new setVCTextInvoker(docAcc, 'movePreviousByText', WORD_BOUNDARY, [0,3], gQueue.push(new setVCTextInvoker(docAcc, 'movePreviousByText', WORD_BOUNDARY, [0,3],
getAccessible(doc.getElementById('p1-link-1'), nsIAccessibleText))); getAccessible(doc.getElementById('p1-link-1'), nsIAccessibleText)));
// set user input to false, and see if it works
gQueue.push(new setVCTextInvoker(docAcc, 'movePreviousByText', WORD_BOUNDARY, [5,7], gQueue.push(new setVCTextInvoker(docAcc, 'movePreviousByText', WORD_BOUNDARY, [5,7],
getAccessible(doc.getElementById('paragraph-1'), nsIAccessibleText))); getAccessible(doc.getElementById('paragraph-1'), nsIAccessibleText)),
false);
gQueue.push(new setVCPosInvoker(docAcc, null, null, gQueue.push(new setVCPosInvoker(docAcc, null, null,
getAccessible(doc.getElementById('section-1')))); getAccessible(doc.getElementById('section-1'))));
@ -62,8 +64,10 @@
getAccessible(doc.getElementById('section-1'), nsIAccessibleText))); getAccessible(doc.getElementById('section-1'), nsIAccessibleText)));
gQueue.push(new setVCTextInvoker(docAcc, 'moveNextByText', WORD_BOUNDARY, [0,9], gQueue.push(new setVCTextInvoker(docAcc, 'moveNextByText', WORD_BOUNDARY, [0,9],
getAccessible(doc.getElementById('s1-link-1'), nsIAccessibleText))); getAccessible(doc.getElementById('s1-link-1'), nsIAccessibleText)));
// set user input to false, and see if it works
gQueue.push(new setVCTextInvoker(docAcc, 'moveNextByText', WORD_BOUNDARY, [10,14], gQueue.push(new setVCTextInvoker(docAcc, 'moveNextByText', WORD_BOUNDARY, [10,14],
getAccessible(doc.getElementById('s1-link-1'), nsIAccessibleText))); getAccessible(doc.getElementById('s1-link-1'), nsIAccessibleText),
false));
gQueue.push(new setVCTextInvoker(docAcc, 'moveNextByText', WORD_BOUNDARY, [4,6], gQueue.push(new setVCTextInvoker(docAcc, 'moveNextByText', WORD_BOUNDARY, [4,6],
getAccessible(doc.getElementById('section-1'), nsIAccessibleText))); getAccessible(doc.getElementById('section-1'), nsIAccessibleText)));
gQueue.push(new setVCTextInvoker(docAcc, 'moveNextByText', WORD_BOUNDARY, [7,12], gQueue.push(new setVCTextInvoker(docAcc, 'moveNextByText', WORD_BOUNDARY, [7,12],