Bug 512908 - Don't expose empty live attribute if there is no aria-live and ARIA role hasn't default live value, r=marcoz, davidb

This commit is contained in:
Alexander Surkov 2009-08-28 13:27:27 +08:00
Родитель 8a9fb4d41e
Коммит 914e0d53fb
5 изменённых файлов: 32 добавлений и 19 удалений

Просмотреть файл

@ -706,17 +706,19 @@ nsAccUtils::GetAttributeCharacteristics(nsIAtom* aAtom)
return 0; return 0;
} }
void PRBool
nsAccUtils::GetLiveAttrValue(PRUint32 aRule, nsAString& aValue) nsAccUtils::GetLiveAttrValue(PRUint32 aRule, nsAString& aValue)
{ {
switch (aRule) { switch (aRule) {
case eOffLiveAttr: case eOffLiveAttr:
aValue = NS_LITERAL_STRING("off"); aValue = NS_LITERAL_STRING("off");
break; return PR_TRUE;
case ePoliteLiveAttr: case ePoliteLiveAttr:
aValue = NS_LITERAL_STRING("polite"); aValue = NS_LITERAL_STRING("polite");
break; return PR_TRUE;
} }
return PR_FALSE;
} }
already_AddRefed<nsAccessible> already_AddRefed<nsAccessible>

Просмотреть файл

@ -283,10 +283,15 @@ public:
static PRUint8 GetAttributeCharacteristics(nsIAtom* aAtom); static PRUint8 GetAttributeCharacteristics(nsIAtom* aAtom);
/** /**
* Return the 'live' or 'container-live' object attribute value from the given * Get the 'live' or 'container-live' object attribute value from the given
* ELiveAttrRule constant. * ELiveAttrRule constant.
*
* @param aRule [in] rule constant (see ELiveAttrRule in nsAccMap.h)
* @param aValue [out] object attribute value
*
* @return true if object attribute should be exposed
*/ */
static void GetLiveAttrValue(PRUint32 aRule, nsAString& aValue); static PRBool GetLiveAttrValue(PRUint32 aRule, nsAString& aValue);
/** /**
* Query DestinationType from the given SourceType. * Query DestinationType from the given SourceType.

Просмотреть файл

@ -1748,8 +1748,8 @@ nsAccessible::GetAttributes(nsIPersistentProperties **aAttributes)
nsAutoString live; nsAutoString live;
nsAccUtils::GetAccAttr(attributes, nsAccessibilityAtoms::live, live); nsAccUtils::GetAccAttr(attributes, nsAccessibilityAtoms::live, live);
if (live.IsEmpty()) { if (live.IsEmpty()) {
nsAccUtils::GetLiveAttrValue(mRoleMapEntry->liveAttRule, live); if (nsAccUtils::GetLiveAttrValue(mRoleMapEntry->liveAttRule, live))
nsAccUtils::SetAccAttr(attributes, nsAccessibilityAtoms::live, live); nsAccUtils::SetAccAttr(attributes, nsAccessibilityAtoms::live, live);
} }
} }

Просмотреть файл

@ -22,7 +22,7 @@ function testAttrs(aAccOrElmOrID, aAttrs, aSkipUnexpectedAttrs)
* @param aAbsentAttrs [in] map of attributes that should not be * @param aAbsentAttrs [in] map of attributes that should not be
* present (name/value pairs) * present (name/value pairs)
*/ */
function testAbsentAttrs(aAccOrElmOrID, aAbsentAttrs, aSkipUnexpectedAttrs) function testAbsentAttrs(aAccOrElmOrID, aAbsentAttrs)
{ {
testAttrsInternal(aAccOrElmOrID, {}, true, aAbsentAttrs); testAttrsInternal(aAccOrElmOrID, {}, true, aAbsentAttrs);
} }
@ -190,6 +190,7 @@ function testAttrsInternal(aAccOrElmOrID, aAttrs, aSkipUnexpectedAttrs,
function compareAttrs(aErrorMsg, aAttrs, aExpectedAttrs, aSkipUnexpectedAttrs, function compareAttrs(aErrorMsg, aAttrs, aExpectedAttrs, aSkipUnexpectedAttrs,
aAbsentAttrs) aAbsentAttrs)
{ {
// Check if all obtained attributes are expected and have expected value.
var enumerate = aAttrs.enumerate(); var enumerate = aAttrs.enumerate();
while (enumerate.hasMoreElements()) { while (enumerate.hasMoreElements()) {
var prop = enumerate.getNext().QueryInterface(nsIPropertyElement); var prop = enumerate.getNext().QueryInterface(nsIPropertyElement);
@ -209,6 +210,7 @@ function compareAttrs(aErrorMsg, aAttrs, aExpectedAttrs, aSkipUnexpectedAttrs,
} }
} }
// Check if all expected attributes are presented.
for (var name in aExpectedAttrs) { for (var name in aExpectedAttrs) {
var value = ""; var value = "";
try { try {
@ -220,18 +222,20 @@ function compareAttrs(aErrorMsg, aAttrs, aExpectedAttrs, aSkipUnexpectedAttrs,
"There is no expected attribute '" + name + "' " + aErrorMsg); "There is no expected attribute '" + name + "' " + aErrorMsg);
} }
if (aAbsentAttrs) // Check if all unexpected attributes are absent.
if (aAbsentAttrs) {
for (var name in aAbsentAttrs) { for (var name in aAbsentAttrs) {
var value = ""; var wasFound = false;
try {
value = aAttrs.getStringProperty(name);
} catch(e) { }
if (value) var enumerate = aAttrs.enumerate();
ok(false, while (enumerate.hasMoreElements()) {
"There is an unexpected attribute '" + name + "' " + aErrorMsg); var prop = enumerate.getNext().QueryInterface(nsIPropertyElement);
else if (prop.key == name)
ok(true, wasFound = true;
"There is no unexpected attribute '" + name + "' " + aErrorMsg); }
} }
ok(!wasFound,
"There is an unexpected attribute '" + name + "' " + aErrorMsg);
}
} }

Просмотреть файл

@ -40,6 +40,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=391829
// live object attribute // live object attribute
testAttrs("live", {"live" : "polite"}, true); testAttrs("live", {"live" : "polite"}, true);
testAttrs("live2", {"live" : "polite"}, true); testAttrs("live2", {"live" : "polite"}, true);
testAbsentAttrs("live3", {"live" : ""});
testAttrs("log", {"live" : "polite"}, true); testAttrs("log", {"live" : "polite"}, true);
testAttrs("logAssertive", {"live" : "assertive"}, true); testAttrs("logAssertive", {"live" : "assertive"}, true);
testAttrs("marquee", {"live" : "off"}, true); testAttrs("marquee", {"live" : "off"}, true);
@ -121,6 +122,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=391829
<div id="live" aria-live="polite">excuse <div id="liveChild">me</div></div> <div id="live" aria-live="polite">excuse <div id="liveChild">me</div></div>
<div id="live2" role="marquee" aria-live="polite">excuse <div id="live2Child">me</div></div> <div id="live2" role="marquee" aria-live="polite">excuse <div id="live2Child">me</div></div>
<div id="live3" role="section">excuse</div>
<div id="log" role="log">excuse <div id="logChild">me</div></div> <div id="log" role="log">excuse <div id="logChild">me</div></div>
<div id="logAssertive" role="log" aria-live="assertive">excuse <div id="logAssertiveChild">me</div></div> <div id="logAssertive" role="log" aria-live="assertive">excuse <div id="logAssertiveChild">me</div></div>
<div id="marquee" role="marquee">excuse <div id="marqueeChild">me</div></div> <div id="marquee" role="marquee">excuse <div id="marqueeChild">me</div></div>