зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
804332784a
Коммит
a20c8425e8
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче