Bug 648235 - Use more underlying HTML input states for XUL textboxes, r=davidb

--HG--
rename : accessible/tests/mochitest/test_textboxes.xul => accessible/tests/mochitest/states/test_textbox.xul
This commit is contained in:
Alexander Surkov 2011-04-10 08:37:04 +09:00
Родитель caa0495193
Коммит ab4286eaca
6 изменённых файлов: 146 добавлений и 35 удалений

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

@ -495,13 +495,14 @@ nsHTMLTextFieldAccessible::GetStateInternal(PRUint32 *aState,
nsCOMPtr<nsIContent> bindingContent = mContent->GetBindingParent(); nsCOMPtr<nsIContent> bindingContent = mContent->GetBindingParent();
if (bindingContent && if (bindingContent &&
bindingContent->NodeInfo()->Equals(nsAccessibilityAtoms::textbox, bindingContent->NodeInfo()->Equals(nsAccessibilityAtoms::textbox,
kNameSpaceID_XUL) && kNameSpaceID_XUL)) {
bindingContent->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::type, if (bindingContent->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::type,
nsAccessibilityAtoms::autocomplete, nsAccessibilityAtoms::autocomplete,
eIgnoreCase)) { eIgnoreCase)) {
// If parent is XUL textbox and value of @type attribute is "autocomplete", // If parent is XUL textbox and value of @type attribute is "autocomplete",
// then this accessible supports autocompletion. // then this accessible supports autocompletion.
*aExtraState |= nsIAccessibleStates::EXT_STATE_SUPPORTS_AUTOCOMPLETION; *aExtraState |= nsIAccessibleStates::EXT_STATE_SUPPORTS_AUTOCOMPLETION;
}
} else if (gIsFormFillEnabled && htmlInput && } else if (gIsFormFillEnabled && htmlInput &&
!(*aState & nsIAccessibleStates::STATE_PROTECTED)) { !(*aState & nsIAccessibleStates::STATE_PROTECTED)) {
// Check to see if autocompletion is allowed on this input. We don't expose // Check to see if autocompletion is allowed on this input. We don't expose

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

@ -919,12 +919,12 @@ nsXULTextFieldAccessible::GetStateInternal(PRUint32 *aState,
// Create a temporary accessible from the HTML text field // Create a temporary accessible from the HTML text field
// to get the accessible state from. Doesn't add to cache // to get the accessible state from. Doesn't add to cache
// because Init() is not called. // because Init() is not called.
nsHTMLTextFieldAccessible* tempAccessible = nsRefPtr<nsHTMLTextFieldAccessible> tempAccessible =
new nsHTMLTextFieldAccessible(inputField, mWeakShell); new nsHTMLTextFieldAccessible(inputField, mWeakShell);
if (!tempAccessible) if (!tempAccessible)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;
nsCOMPtr<nsIAccessible> kungFuDeathGrip = tempAccessible;
rv = tempAccessible->GetStateInternal(aState, nsnull); rv = tempAccessible->GetStateInternal(aState, aExtraState);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
if (gLastFocusedNode == mContent) if (gLastFocusedNode == mContent)
@ -939,30 +939,6 @@ nsXULTextFieldAccessible::GetStateInternal(PRUint32 *aState,
*aState |= nsIAccessibleStates::STATE_READONLY; *aState |= nsIAccessibleStates::STATE_READONLY;
} }
} }
else {
// <xul:textbox>
if (mContent->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::type,
nsAccessibilityAtoms::password, eIgnoreCase)) {
*aState |= nsIAccessibleStates::STATE_PROTECTED;
}
if (mContent->AttrValueIs(kNameSpaceID_None, nsAccessibilityAtoms::readonly,
nsAccessibilityAtoms::_true, eIgnoreCase)) {
*aState |= nsIAccessibleStates::STATE_READONLY;
}
}
if (!aExtraState)
return NS_OK;
PRBool isMultiLine = mContent->HasAttr(kNameSpaceID_None,
nsAccessibilityAtoms::multiline);
if (isMultiLine) {
*aExtraState |= nsIAccessibleStates::EXT_STATE_MULTI_LINE;
}
else {
*aExtraState |= nsIAccessibleStates::EXT_STATE_SINGLE_LINE;
}
return NS_OK; return NS_OK;
} }

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

@ -25,6 +25,7 @@ const STATE_MIXED = nsIAccessibleStates.STATE_MIXED;
const STATE_MULTISELECTABLE = nsIAccessibleStates.STATE_MULTISELECTABLE; const STATE_MULTISELECTABLE = nsIAccessibleStates.STATE_MULTISELECTABLE;
const STATE_OFFSCREEN = nsIAccessibleStates.STATE_OFFSCREEN; const STATE_OFFSCREEN = nsIAccessibleStates.STATE_OFFSCREEN;
const STATE_PRESSED = nsIAccessibleStates.STATE_PRESSED; const STATE_PRESSED = nsIAccessibleStates.STATE_PRESSED;
const STATE_PROTECTED = nsIAccessibleStates.STATE_PROTECTED;
const STATE_READONLY = nsIAccessibleStates.STATE_READONLY; const STATE_READONLY = nsIAccessibleStates.STATE_READONLY;
const STATE_REQUIRED = nsIAccessibleStates.STATE_REQUIRED; const STATE_REQUIRED = nsIAccessibleStates.STATE_REQUIRED;
const STATE_SELECTABLE = nsIAccessibleStates.STATE_SELECTABLE; const STATE_SELECTABLE = nsIAccessibleStates.STATE_SELECTABLE;

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

@ -56,6 +56,7 @@ _TEST_FILES =\
test_inputs.xul \ test_inputs.xul \
test_link.html \ test_link.html \
test_popup.xul \ test_popup.xul \
test_textbox.xul \
test_tree.xul \ test_tree.xul \
z_frames.html \ z_frames.html \
z_frames_article.html \ z_frames_article.html \

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

@ -131,7 +131,7 @@
<input id="reset" type="reset" required> <input id="reset" type="reset" required>
<input id="image" type="image" required> <input id="image" type="image" required>
<!-- disabled --> <!-- inherited disabled -->
<fieldset id="f" disabled> <fieldset id="f" disabled>
<input id="f_input"> <input id="f_input">
<input id="f_input_disabled" disabled> <input id="f_input_disabled" disabled>

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

@ -0,0 +1,132 @@
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
title="nsIAccessible XUL textboxes states tests">
<script type="application/javascript"
src="chrome://mochikit/content/MochiKit/packed.js"></script>
<script type="application/javascript"
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
<script type="application/javascript"
src="../common.js" />
<script type="application/javascript"
src="../role.js" />
<script type="application/javascript"
src="../states.js" />
<script type="application/javascript">
<![CDATA[
function doTest()
{
//////////////////////////////////////////////////////////////////////////
// Ordinary textbox
testStates("textbox",
STATE_FOCUSABLE, EXT_STATE_EDITABLE,
STATE_PROTECTED | STATE_UNAVAILABLE, EXT_STATE_SUPPORTS_AUTOCOMPLETION,
"ordinary textbox");
//////////////////////////////////////////////////////////////////////////
// Password textbox
testStates("password",
STATE_FOCUSABLE | STATE_PROTECTED, EXT_STATE_EDITABLE,
STATE_UNAVAILABLE, EXT_STATE_SUPPORTS_AUTOCOMPLETION,
"password textbox");
//////////////////////////////////////////////////////////////////////////
// Textarea
testStates("textarea",
STATE_FOCUSABLE, EXT_STATE_EDITABLE | EXT_STATE_MULTI_LINE,
STATE_PROTECTED | STATE_UNAVAILABLE, EXT_STATE_SUPPORTS_AUTOCOMPLETION,
"multiline textbox");
//////////////////////////////////////////////////////////////////////////
// Readonly textbox
testStates("readonly_textbox",
STATE_FOCUSABLE | STATE_READONLY, 0,
STATE_PROTECTED | STATE_UNAVAILABLE, EXT_STATE_SUPPORTS_AUTOCOMPLETION,
"readonly textbox");
//////////////////////////////////////////////////////////////////////////
// Disabled textbox
testStates("disabled_textbox",
STATE_UNAVAILABLE, 0,
STATE_FOCUSABLE | STATE_PROTECTED, EXT_STATE_SUPPORTS_AUTOCOMPLETION,
"readonly textbox");
//////////////////////////////////////////////////////////////////////////
// Readonly textarea
testStates("readonly_textarea",
STATE_FOCUSABLE | STATE_READONLY, EXT_STATE_MULTI_LINE,
STATE_PROTECTED | STATE_UNAVAILABLE, EXT_STATE_SUPPORTS_AUTOCOMPLETION,
"readonly multiline textbox");
//////////////////////////////////////////////////////////////////////////
// Disabled textarea
testStates("disabled_textarea",
STATE_UNAVAILABLE, EXT_STATE_MULTI_LINE,
STATE_PROTECTED | STATE_FOCUSABLE, EXT_STATE_SUPPORTS_AUTOCOMPLETION,
"readonly multiline textbox");
//////////////////////////////////////////////////////////////////////////
// Search textbox without search button, searches as you type and filters
// a separate control.
testStates("searchbox",
STATE_FOCUSABLE, EXT_STATE_EDITABLE | EXT_STATE_SUPPORTS_AUTOCOMPLETION,
STATE_PROTECTED | STATE_UNAVAILABLE, 0,
"searchbox");
//////////////////////////////////////////////////////////////////////////
// Search textbox with search button, does not support autoCompletion.
testStates("searchfield",
STATE_FOCUSABLE, EXT_STATE_EDITABLE,
STATE_PROTECTED | STATE_UNAVAILABLE, EXT_STATE_SUPPORTS_AUTOCOMPLETION,
"searchfield");
SimpleTest.finish();
}
SimpleTest.waitForExplicitFinish();
addA11yLoadEvent(doTest);
]]>
</script>
<hbox flex="1" style="overflow: auto;">
<body xmlns="http://www.w3.org/1999/xhtml">
<a target="_blank"
href="https://bugzilla.mozilla.org/show_bug.cgi?id=442648">
Mozilla Bug 442648
</a>
<a target="_blank"
href="https://bugzilla.mozilla.org/show_bug.cgi?id=648235"
title="XUL textbox can inherit more states from underlying HTML input">
Mozilla Bug 648235
</a>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test">
</pre>
</body>
<vbox flex="1">
<textbox id="textbox"/>
<textbox id="password" type="password"/>
<textbox id="textarea" multiline="true" cols="80" rows="5"/>
<textbox id="readonly_textbox" readonly="true"/>
<textbox id="disabled_textbox" disabled="true"/>
<textbox id="readonly_textarea" multiline="true" readonly="true"
cols="80" rows="5"/>
<textbox id="disabled_textarea" multiline="true" disabled="true"
cols="80" rows="5"/>
<textbox id="searchbox" flex="1" type="search" results="historyTree"/>
<textbox id="searchfield" placeholder="Search all add-ons"
type="search" searchbutton="true"/>
</vbox>
</hbox>
</window>