зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1008502 - Activate first operable descendant when landing on containers. r=MarcoZ
.. and don't land on containers with a mix of operable and not operable children.
This commit is contained in:
Родитель
0e677f5560
Коммит
b679a28c6d
|
@ -221,9 +221,26 @@ this.ContentControl.prototype = {
|
|||
return;
|
||||
}
|
||||
|
||||
// recursively find a descendant that is activatable.
|
||||
let getActivatableDescendant = (aAccessible) => {
|
||||
if (aAccessible.actionCount > 0) {
|
||||
return aAccessible;
|
||||
}
|
||||
|
||||
for (let acc = aAccessible.firstChild; acc; acc = acc.nextSibling) {
|
||||
let activatable = getActivatableDescendant(acc);
|
||||
if (activatable) {
|
||||
return activatable;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
let vc = this.vc;
|
||||
if (!this.sendToChild(vc, aMessage)) {
|
||||
activateAccessible(vc.position);
|
||||
let position = vc.position;
|
||||
activateAccessible(getActivatableDescendant(position) || position);
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
@ -113,7 +113,7 @@ var gSimpleMatchFunc = function gSimpleMatchFunc(aAccessible) {
|
|||
|
||||
function isFlatSubtree(acc) {
|
||||
for (let child = acc.firstChild; child; child = child.nextSibling) {
|
||||
if (child.childCount > 0) {
|
||||
if (child.childCount > 0 || child.actionCount > 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,9 @@
|
|||
'<head><title>such app</title></head>' +
|
||||
'<body>' +
|
||||
'<h1>wow</h1>' +
|
||||
'<label><input type="checkbox">many option</label><br>' +
|
||||
'<ul>' +
|
||||
'<li><label><input type="checkbox">many option</label></li>' +
|
||||
'</ul>' +
|
||||
'<label for="r">much range</label>' +
|
||||
'<input min="0" max="10" value="5" type="range" id="r">' +
|
||||
'</body>' +
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
<label for="checkbox-1-3">But not me: </label>
|
||||
<input id="checkbox-1-3" type="checkbox" aria-hidden="true">
|
||||
<label for="checkbox-1-4">Or me! </label>
|
||||
<input id="checkbox-1-3" type="checkbox" style="visibility:hidden">
|
||||
<input id="checkbox-1-4" type="checkbox" style="visibility:hidden">
|
||||
<select id="select-1-3" size="3">
|
||||
<option>Value 1</option>
|
||||
<option>Value 2</option>
|
||||
|
@ -67,6 +67,9 @@
|
|||
<li id="listitem-3-1">Scheme</li>
|
||||
<li id="listitem-3-2">Racket</li>
|
||||
<li id="listitem-3-3">Clojure</li>
|
||||
<li id="listitem-3-4"><strong>Standard</strong> Lisp</li>
|
||||
<li id="listitem-3-5"><a id="link-0" href="#">Common</a> Lisp</li>
|
||||
<li id="listitem-3-6"><input id="checkbox-1-5" type="checkbox"> LeLisp</li>
|
||||
</ol>
|
||||
</li>
|
||||
<li id="listitem-2-3">JavaScript</li>
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
speak: 'wow heading level 1 such app'
|
||||
}],
|
||||
[ContentMessages.simpleMoveNext, {
|
||||
speak: 'many option not checked check button'
|
||||
speak: 'many option not checked check button First item list 1 item'
|
||||
}],
|
||||
// check checkbox
|
||||
[ContentMessages.activateCurrent(), {
|
||||
|
@ -64,7 +64,7 @@
|
|||
speak: 'much range label'
|
||||
}],
|
||||
[ContentMessages.simpleMovePrevious, {
|
||||
speak: 'many option checked check button'
|
||||
speak: 'many option checked check button First item list 1 item'
|
||||
}],
|
||||
// uncheck checkbox
|
||||
[ContentMessages.activateCurrent(), {
|
||||
|
@ -99,7 +99,7 @@
|
|||
speak: 'wow heading level 1 such app'
|
||||
}],
|
||||
[ContentMessages.simpleMoveNext, {
|
||||
speak: 'many option not checked check button'
|
||||
speak: 'many option not checked check button First item list 1 item'
|
||||
}],
|
||||
[ContentMessages.simpleMoveFirst, {
|
||||
speak: 'Phone status bar',
|
||||
|
|
|
@ -56,7 +56,7 @@
|
|||
'select-1-1', 'select-1-2', 'checkbox-1-2',
|
||||
'select-1-3', 'input-1-5', 'button-1-3',
|
||||
'button-2-1', 'button-2-2', 'button-2-3',
|
||||
'button-2-4']);
|
||||
'button-2-4', 'checkbox-1-5']);
|
||||
|
||||
queueTraversalSequence(gQueue, docAcc, TraversalRules.Button, null,
|
||||
['button-1-1', 'button-1-2', 'button-1-3',
|
||||
|
@ -67,7 +67,7 @@
|
|||
['radio-1-1', 'radio-1-2']);
|
||||
|
||||
queueTraversalSequence(gQueue, docAcc, TraversalRules.Checkbox, null,
|
||||
['checkbox-1-1', 'checkbox-1-2']);
|
||||
['checkbox-1-1', 'checkbox-1-2', 'checkbox-1-5']);
|
||||
|
||||
queueTraversalSequence(gQueue, docAcc, TraversalRules.Combobox, null,
|
||||
['select-1-1', 'select-1-2', 'select-1-3']);
|
||||
|
@ -78,13 +78,14 @@
|
|||
queueTraversalSequence(gQueue, docAcc, TraversalRules.ListItem, null,
|
||||
['listitem-1-1', 'listitem-2-1', 'listitem-2-2',
|
||||
'listitem-3-1', 'listitem-3-2', 'listitem-3-3',
|
||||
'listitem-3-4', 'listitem-3-5', 'listitem-3-6',
|
||||
'listitem-2-3']);
|
||||
|
||||
queueTraversalSequence(gQueue, docAcc, TraversalRules.Graphic, null,
|
||||
['image-2', 'image-3']);
|
||||
|
||||
queueTraversalSequence(gQueue, docAcc, TraversalRules.Link, null,
|
||||
['link-1', 'link-2', 'link-3']);
|
||||
['link-0', 'link-1', 'link-2', 'link-3']);
|
||||
|
||||
queueTraversalSequence(gQueue, docAcc, TraversalRules.Anchor, null,
|
||||
['anchor-1', 'anchor-2']);
|
||||
|
@ -112,7 +113,9 @@
|
|||
'formidable warriors, for its unrelenting strict' +
|
||||
' power is unfathomable.',
|
||||
'• Lists of Programming Languages', 'Lisp ',
|
||||
'1. Scheme', '2. Racket', '3. Clojure', '• JavaScript', 'heading-5',
|
||||
'1. Scheme', '2. Racket', '3. Clojure',
|
||||
'4. Standard Lisp', 'link-0', ' Lisp', 'checkbox-1-5',
|
||||
' LeLisp', '• JavaScript', 'heading-5',
|
||||
'image-2', 'image-3', 'Not actually an image',
|
||||
'link-1', 'anchor-1', 'link-2', 'anchor-2', 'link-3',
|
||||
'3', '1', '4', '1', 'Just an innocuous separator',
|
||||
|
|
Загрузка…
Ссылка в новой задаче