Bug 386235 the <link> tag for stylesheets can cause text in document frame to be inaccessible r=aaronleventhal a=dsicore

This commit is contained in:
ginn.chen@sun.com 2007-08-06 23:10:31 -07:00
Родитель 804332784a
Коммит a20c8425e8
8 изменённых файлов: 51 добавлений и 127 удалений

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

@ -425,9 +425,6 @@ nsAccessibleWrap::CreateMaiInterfaces(void)
interfacesBits |= 1 << MAI_INTERFACE_ACTION;
}
PRUint32 accRole;
GetRole(&accRole);
//nsIAccessibleText
nsCOMPtr<nsIAccessibleText> accessInterfaceText;
QueryInterface(NS_GET_IID(nsIAccessibleText),
@ -478,15 +475,11 @@ nsAccessibleWrap::CreateMaiInterfaces(void)
if (!MustPrune(this)) { // These interfaces require children
//nsIAccessibleHypertext
PRInt32 linkCount = 0;
nsCOMPtr<nsIAccessibleHyperText> accessInterfaceHypertext;
QueryInterface(NS_GET_IID(nsIAccessibleHyperText),
getter_AddRefs(accessInterfaceHypertext));
if (accessInterfaceHypertext) {
nsresult rv = accessInterfaceHypertext->GetLinks(&linkCount);
if (NS_SUCCEEDED(rv) && (linkCount > 0)) {
interfacesBits |= 1 << MAI_INTERFACE_HYPERTEXT;
}
interfacesBits |= 1 << MAI_INTERFACE_HYPERTEXT;
}
//nsIAccessibleTable
@ -912,25 +905,24 @@ refChildCB(AtkObject *aAtkObj, gint aChildIndex)
return nsnull;
}
nsresult rv;
nsCOMPtr<nsIAccessible> accChild;
nsCOMPtr<nsIAccessibleHyperText> hyperText;
accWrap->QueryInterface(NS_GET_IID(nsIAccessibleHyperText), getter_AddRefs(hyperText));
if (hyperText) {
// If HyperText, then number of links matches number of children
nsCOMPtr<nsIAccessibleHyperLink> hyperLink;
rv = hyperText->GetLink(aChildIndex, getter_AddRefs(hyperLink));
hyperText->GetLink(aChildIndex, getter_AddRefs(hyperLink));
accChild = do_QueryInterface(hyperLink);
}
else {
nsCOMPtr<nsIAccessibleText> accText;
accWrap->QueryInterface(NS_GET_IID(nsIAccessibleText), getter_AddRefs(accText));
if (!accText) { // Accessible Text that is not HyperText has no children
rv = accWrap->GetChildAt(aChildIndex, getter_AddRefs(accChild));
accWrap->GetChildAt(aChildIndex, getter_AddRefs(accChild));
}
}
if (NS_FAILED(rv) || !accChild)
if (!accChild)
return nsnull;
AtkObject* childAtkObj = nsAccessibleWrap::GetAtkObject(accChild);

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

@ -55,43 +55,3 @@ nsDocAccessibleWrap::~nsDocAccessibleWrap()
{
}
void nsDocAccessibleWrap::SetEditor(nsIEditor* aEditor)
{
// Recreate atkobject if editable interface is changing
PRBool needRecreate = mAtkObject && (mEditor != aEditor)
&& (!mEditor || !aEditor);
nsDocAccessible::SetEditor(aEditor);
if (needRecreate) {
// Get parent atkobject and index in parent
AtkObject* oldAtkObj = mAtkObject;
// getParentCB
AtkObject* parentAtkObj = atk_object_get_parent(oldAtkObj);
// getIndexInParentCB
PRInt32 index = atk_object_get_index_in_parent(oldAtkObj);
// Clear old atkobject
ShutdownAtkObject();
// Get new atkobject
GetAtkObject();
// Emit children_changed events
if (parentAtkObj && (index >= 0)) {
g_signal_emit_by_name(parentAtkObj, "children_changed::remove", index,
oldAtkObj, NULL);
g_signal_emit_by_name(parentAtkObj, "children_changed::add", index,
mAtkObject, NULL);
}
// Set every child's parent to new created atkobject
nsCOMPtr<nsIAccessible> accChild;
while (NextChild(accChild)) {
if (IsEmbeddedObject(accChild)) {
AtkObject* childAtkObj = nsAccessibleWrap::GetAtkObject(accChild);
atk_object_set_parent(childAtkObj, mAtkObject);
}
}
}
}

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

@ -54,10 +54,6 @@ public:
nsDocAccessibleWrap(nsIDOMNode *aNode, nsIWeakReference *aShell);
virtual ~nsDocAccessibleWrap();
// Override SetEditor because we need to recreate atkobject
// when editable interface is added/removed
void SetEditor(nsIEditor* aEditor);
PRBool mActivated;
};

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

@ -97,10 +97,7 @@ setTextContentsCB(AtkEditableText *aText, const gchar *aString)
MAI_LOG_DEBUG(("EditableText: setTextContentsCB, aString=%s", aString));
NS_ConvertUTF8toUTF16 strContent(aString);
nsresult rv = accText->SetTextContents(strContent);
NS_ASSERTION(NS_SUCCEEDED(rv),
"MaiInterfaceEditableText::SetTextContents, failed\n");
accText->SetTextContents(strContent);
}
void
@ -125,9 +122,7 @@ insertTextCB(AtkEditableText *aText,
// nsresult rv = accText->InsertText(strContent, aLength, &pos);
// *aPosition = pos;
nsresult rv = accText->InsertText(strContent, *aPosition);
NS_ASSERTION(NS_SUCCEEDED(rv),
"MaiInterfaceEditableText::InsertText, failed\n");
accText->InsertText(strContent, *aPosition);
MAI_LOG_DEBUG(("EditableText: insert aString=%s, aLength=%d, aPosition=%d",
aString, aLength, *aPosition));
@ -148,9 +143,7 @@ copyTextCB(AtkEditableText *aText, gint aStartPos, gint aEndPos)
MAI_LOG_DEBUG(("EditableText: copyTextCB, aStartPos=%d, aEndPos=%d",
aStartPos, aEndPos));
nsresult rv = accText->CopyText(aStartPos, aEndPos);
NS_ASSERTION(NS_SUCCEEDED(rv),
"MaiInterfaceEditableText::CopyText, failed\n");
accText->CopyText(aStartPos, aEndPos);
}
void
@ -167,9 +160,7 @@ cutTextCB(AtkEditableText *aText, gint aStartPos, gint aEndPos)
return;
MAI_LOG_DEBUG(("EditableText: cutTextCB, aStartPos=%d, aEndPos=%d",
aStartPos, aEndPos));
nsresult rv = accText->CutText(aStartPos, aEndPos);
NS_ASSERTION(NS_SUCCEEDED(rv),
"MaiInterfaceEditableText::CutText, failed\n");
accText->CutText(aStartPos, aEndPos);
}
void
@ -187,9 +178,7 @@ deleteTextCB(AtkEditableText *aText, gint aStartPos, gint aEndPos)
MAI_LOG_DEBUG(("EditableText: deleteTextCB, aStartPos=%d, aEndPos=%d",
aStartPos, aEndPos));
nsresult rv = accText->DeleteText(aStartPos, aEndPos);
NS_ASSERTION(NS_SUCCEEDED(rv),
"MaiInterfaceEditableText::DeleteText, failed\n");
accText->DeleteText(aStartPos, aEndPos);
}
void
@ -206,7 +195,5 @@ pasteTextCB(AtkEditableText *aText, gint aPosition)
return;
MAI_LOG_DEBUG(("EditableText: pasteTextCB, aPosition=%d", aPosition));
nsresult rv = accText->PasteText(aPosition);
NS_ASSERTION(NS_SUCCEEDED(rv),
"MaiInterfaceEditableText::PasteText, failed\n");
accText->PasteText(aPosition);
}

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

@ -86,13 +86,13 @@ getLinkCountCB(AtkHypertext *aText)
if (!accWrap)
return -1;
nsCOMPtr<nsIAccessibleHyperText> accHyperlink;
nsCOMPtr<nsIAccessibleHyperText> hyperText;
accWrap->QueryInterface(NS_GET_IID(nsIAccessibleHyperText),
getter_AddRefs(accHyperlink));
NS_ENSURE_TRUE(accHyperlink, -1);
getter_AddRefs(hyperText));
NS_ENSURE_TRUE(hyperText, -1);
PRInt32 count = -1;
nsresult rv = accHyperlink->GetLinks(&count);
nsresult rv = hyperText->GetLinks(&count);
NS_ENSURE_SUCCESS(rv, -1);
return count;
@ -105,13 +105,13 @@ getLinkIndexCB(AtkHypertext *aText, gint aCharIndex)
if (!accWrap)
return -1;
nsCOMPtr<nsIAccessibleHyperText> accHyperlink;
nsCOMPtr<nsIAccessibleHyperText> hyperText;
accWrap->QueryInterface(NS_GET_IID(nsIAccessibleHyperText),
getter_AddRefs(accHyperlink));
NS_ENSURE_TRUE(accHyperlink, -1);
getter_AddRefs(hyperText));
NS_ENSURE_TRUE(hyperText, -1);
PRInt32 index = -1;
nsresult rv = accHyperlink->GetLinkIndex(aCharIndex, &index);
nsresult rv = hyperText->GetLinkIndex(aCharIndex, &index);
NS_ENSURE_SUCCESS(rv, -1);
return index;

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

@ -256,12 +256,13 @@ getRunAttributesCB(AtkText *aText, gint aOffset,
nsCOMPtr<nsIAccessible> accessibleWithAttrs;
PRInt32 startOffset = 0, endOffset = 0;
nsresult rv = accText->GetAttributeRange(aOffset,
&startOffset, &endOffset,
getter_AddRefs(accessibleWithAttrs));
nsresult rv =
accText->GetAttributeRange(aOffset, &startOffset, &endOffset,
getter_AddRefs(accessibleWithAttrs));
*aStartOffset = startOffset;
*aEndOffset = endOffset;
NS_ENSURE_SUCCESS(rv, nsnull);
if (NS_FAILED(rv))
return nsnull;
return GetAttributeSet(accessibleWithAttrs);
}
@ -396,6 +397,7 @@ getTextSelectionCountCB(AtkText *aText)
nsCOMPtr<nsIAccessibleText> accText;
accWrap->QueryInterface(NS_GET_IID(nsIAccessibleText),
getter_AddRefs(accText));
NS_ENSURE_TRUE(accText, nsnull);
PRInt32 selectionCount;
nsresult rv = accText->GetSelectionCount(&selectionCount);

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

@ -79,42 +79,40 @@ nsresult nsHyperTextAccessible::QueryInterface(REFNSIID aIID, void** aInstancePt
nsCOMPtr<nsIDOMXULDocument> xulDoc(do_QueryInterface(mDOMNode));
if (mDOMNode && !xulDoc) {
// We need XUL doc check for now because for now nsDocAccessible must inherit from nsHyperTextAccessible
// in order for HTML document accessibles to get support for these interfaces
// We need XUL doc check for now because for now nsDocAccessible must
// inherit from nsHyperTextAccessible in order for HTML document accessibles
// to get support for these interfaces.
// However at some point we may push <body> to implement the interfaces and
// return nsDocAccessible to inherit from nsAccessibleWrap
// return nsDocAccessible to inherit from nsAccessibleWrap.
PRUint32 role = Role(this);
if (aIID.Equals(NS_GET_IID(nsIAccessibleText))) {
// If |this| contains any children
PRInt32 numChildren;
GetChildCount(&numChildren);
if (numChildren > 0) {
*aInstancePtr = static_cast<nsIAccessibleText*>(this);
NS_ADDREF_THIS();
return NS_OK;
if (role == nsIAccessibleRole::ROLE_TEXT_LEAF) {
return NS_ERROR_NO_INTERFACE;
}
return NS_ERROR_NO_INTERFACE;
*aInstancePtr = static_cast<nsIAccessibleText*>(this);
NS_ADDREF_THIS();
return NS_OK;
}
if (aIID.Equals(NS_GET_IID(nsIAccessibleHyperText))) {
if (IsHyperText()) {
// If |this| contains text and embedded objects
*aInstancePtr = static_cast<nsIAccessibleHyperText*>(this);
NS_ADDREF_THIS();
return NS_OK;
if (role == nsIAccessibleRole::ROLE_ENTRY ||
role == nsIAccessibleRole::ROLE_PASSWORD_TEXT ||
role == nsIAccessibleRole::ROLE_TEXT_LEAF) {
return NS_ERROR_NO_INTERFACE;
}
return NS_ERROR_NO_INTERFACE;
*aInstancePtr = static_cast<nsIAccessibleHyperText*>(this);
NS_ADDREF_THIS();
return NS_OK;
}
if (aIID.Equals(NS_GET_IID(nsIAccessibleEditableText))) {
// If this contains editable text
PRUint32 state, extState;
GetState(&state, &extState);
if (extState & nsIAccessibleStates::EXT_STATE_EDITABLE) {
*aInstancePtr = static_cast<nsIAccessibleEditableText*>(this);
NS_ADDREF_THIS();
return NS_OK;
if (role == nsIAccessibleRole::ROLE_TEXT_LEAF) {
return NS_ERROR_NO_INTERFACE;
}
return NS_ERROR_NO_INTERFACE;
*aInstancePtr = static_cast<nsIAccessibleEditableText*>(this);
NS_ADDREF_THIS();
return NS_OK;
}
}
@ -126,18 +124,6 @@ nsAccessibleWrap(aNode, aShell)
{
}
PRBool nsHyperTextAccessible::IsHyperText()
{
nsCOMPtr<nsIAccessible> accessible;
while (NextChild(accessible)) {
if (IsEmbeddedObject(accessible)) {
return PR_TRUE;
}
}
return PR_FALSE;
}
NS_IMETHODIMP nsHyperTextAccessible::GetRole(PRUint32 *aRole)
{
nsCOMPtr<nsIContent> content = do_QueryInterface(mDOMNode);
@ -482,7 +468,10 @@ NS_IMETHODIMP nsHyperTextAccessible::GetCharacterAtOffset(PRInt32 aOffset, PRUni
}
nsAutoString text;
nsresult rv = GetText(aOffset, aOffset + 1, text);
NS_ENSURE_SUCCESS(rv, rv);
if (NS_FAILED(rv)) {
return rv;
}
if (text.IsEmpty()) {
return NS_ERROR_FAILURE;
}

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

@ -114,8 +114,6 @@ public:
nsIAccessible **aFinalAccessible = nsnull);
protected:
PRBool IsHyperText();
/*
* This does the work for nsIAccessibleText::GetText[At|Before|After]Offset
* @param aType, eGetBefore, eGetAt, eGetAfter