Closed Bug 257747 Opened 20 years ago Closed 19 years ago

Implement basic accessible relations

Categories

(Core :: Disability Access APIs, defect)

x86
Linux
defect
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: Louie.Zhao, Assigned: Louie.Zhao)

References

Details

(Keywords: access, Whiteboard: sunport17)

Attachments

(1 file, 10 obsolete files)

when gnopernicus read combobox, it will access relation of "labelled_by" and
will get the vaule of combobox by AtkTextInterface.
Attached patch patch v1 (obsolete) — Splinter Review
Since I have no access to execute "cvs add", the new files
"nsXULSelectAccessibleWrap.h/cpp" can't be included in patch. Attach it
seperately.
Attached patch nsXULSelectAccessibleWrap.cpp (obsolete) — Splinter Review
Attached patch nsXULSelectAccessibleWrap.h (obsolete) — Splinter Review
Are you seeking reviews yet?
Attachment #157692 - Flags: review?(pkwarren)
Comment on attachment 157692 [details] [diff] [review]
patch v1

>Index: src/atk/nsAccessibleText.cpp
>===================================================================
>@@ -114,7 +267,7 @@
>   PRBool isSelectionCollapsed;
>   domSel->GetIsCollapsed(&isSelectionCollapsed);
>   // Don't perform any actions when the selection is not collapsed
>-  NS_ENSURE_TRUE(isSelectionCollapsed, NS_ERROR_FAILURE);
>+  // NS_ENSURE_TRUE(isSelectionCollapsed, NS_ERROR_FAILURE);

Can you please explain why this check was removed?

>Index: src/base/nsAccessible.cpp
>===================================================================
>@@ -1337,6 +1337,54 @@
>   return NS_ERROR_NOT_IMPLEMENTED;
> }
> 
>+/* nsIAccessible getAccessibleRelated(); */
>+NS_IMETHODIMP nsAccessible::GetAccessibleRelated(PRUint32 aRelationType, nsIAccessible **_retval)
>+{
...
>+    nsAutoString label;
>+    nsIContent *labelContent = nsnull;
>+    nsCOMPtr<nsIDOMXULElement> xulElt(do_QueryInterface(mDOMNode));
>+    nsCOMPtr<nsIDOMHTMLElement> htmlElt(do_QueryInterface(mDOMNode));

Is there a reason why you chose not to use GetXULName and GetHTMLName here? It
seems like this contains a lot of duplicated code which is already implemented
in those functions. The only difference between GetXULName and your version
seems to be that you are checking for the label "undefined". I don't see any
significant differences between GetHTMLName and your version.

>Index: src/base/nsRootAccessible.cpp
>@@ -354,7 +354,7 @@
> 
>   // for focus events on Radio Groups we give the focus to the selected button
>   nsCOMPtr<nsIDOMXULSelectControlElement> selectControl(do_QueryInterface(targetNode));
>-  if (selectControl) {
>+  if (selectControl && localName.EqualsIgnoreCase("radiogroup")) {
>     nsCOMPtr<nsIDOMXULSelectControlItemElement> selectItem;
>     selectControl->GetSelectedItem(getter_AddRefs(selectItem));
>     optionTargetNode = do_QueryInterface(selectItem);

This change seems to be separate from all the others in this patch. Was this
change meant for another bug?

Overall the code looks good.
Comment on attachment 157692 [details] [diff] [review]
patch v1

Minusing until Louie addresses pkwarren's comments.
Attachment #157692 - Flags: review?(pkwarren) → review-
Blocks: 263575
Whiteboard: sunport17
Attached patch patch v2 (obsolete) — Splinter Review
updated patch
Attachment #157692 - Attachment is obsolete: true
Attachment #157693 - Attachment is obsolete: true
Attachment #157694 - Attachment is obsolete: true
Comment on attachment 171738 [details] [diff] [review]
patch v2

This patch gets rid of some minor fix and make itself looks simple and clear.
It contains 2 main issues:

1. Implementation refRelationSetCB interface in ATK, which is often used by
AT-Tools to find a reasonable name for the object through
"RELATION_LABELLED_BY".

2. Add AtkText interface to XUL Combobox Accessible because AT-Tool (e.g.
gnopernicus) will get the value of combobox through   "GetText".
Attachment #171738 - Flags: review?(pkwarren)
Attached patch patch v2 (obsolete) — Splinter Review
Attachment #171738 - Attachment is obsolete: true
Attachment #171740 - Flags: review?(pkwarren)
Attachment #171738 - Flags: review?(pkwarren)
> >   // Don't perform any actions when the selection is not collapsed
> >-  NS_ENSURE_TRUE(isSelectionCollapsed, NS_ERROR_FAILURE);
> >+  // NS_ENSURE_TRUE(isSelectionCollapsed, NS_ERROR_FAILURE);
> 
> Can you please explain why this check was removed?
> 

Delete the fix from this patch (has loose connection with this bug. I will file
a new bug to deal with it).

> Is there a reason why you chose not to use GetXULName and GetHTMLName here? It
> seems like this contains a lot of duplicated code which is already implemented
> in those functions. The only difference between GetXULName and your version
> seems to be that you are checking for the label "undefined". I don't see any
> significant differences between GetHTMLName and your version.

"RELATION_LABELLED_BY" switch in function "nsAccessible::GetAccessibleRelated"
is to find the XUL/HTML element which "label" the current node. So it uses
helper function "GetXULLabelContent" and "GetHTMLLabelContent". Although it
looks similar with GetXULName/GetHTMLName, they're different.
"GetXULLabelContent"/"GetHTMLLabelContent" is only one of the cases in
GetXULName/GetHTMLName.

Actually, I was thinking to delete "GetXULLabelContent"/"GetHTMLLabelContent"
from GetXULName/GetHTMLName because the name got from label will has no much use
if AT-Tools can find "RELATION_LABELLED_BY" object. But I can't be sure that
AT-Tools always find "RELATION_LABELLED_BY" object before getting accessible
name directly from the object. So I suggest to remain
"GetXULLabelContent"/"GetHTMLLabelContent" in GetXULName/GetHTMLName first.

In this patch, also delete the code to judge "undefined" value because it's not
needed any more (as in GetXULName).

> >-  if (selectControl) {
> >+  if (selectControl && localName.EqualsIgnoreCase("radiogroup")) {
> >     nsCOMPtr<nsIDOMXULSelectControlItemElement> selectItem;
> >     selectControl->GetSelectedItem(getter_AddRefs(selectItem));
> >     optionTargetNode = do_QueryInterface(selectItem);
> 
> This change seems to be separate from all the others in this patch. Was this
> change meant for another bug?

Delete the fix from this patch (has loose connection with this bug. I will file
a new bug to deal with it).
Comment on attachment 171740 [details] [diff] [review]
patch v2

Aaron may be able to get to this before me - only thing I see is that the
nsIAccessible UUID needs to be updated again when this is checked in.
Attachment #171740 - Flags: review?(pkwarren) → review?(aaronleventhal)
Comment on attachment 171740 [details] [diff] [review]
patch v2

Some questions:
Are accessibles monogamous? :) Or, can an accessible have more than 1 other
accessible that it has a relationship with? Maybe an accessible can even have
more than 1 relationship with the same accessible. For example, it could be
labeled by, and also be the child of another accessible. I don't think
getAccessibleRelated is enough.

What does NODE_CHILD_OF mean, when we already have child nodes?

I would like to see the nsIAccessible.idl have some comments that describe the
relationships. At the least it should have a link to relevant documentation.
Attachment #171740 - Flags: review?(aaronleventhal) → review-
> Are accessibles monogamous? :) Or, can an accessible have more than 1 other
> accessible that it has a relationship with? Maybe an accessible can even have
> more than 1 relationship with the same accessible. For example, it could be
> labeled by, and also be the child of another accessible. I don't think
> getAccessibleRelated is enough.

Accessibles are not mongamous. One accessible can have relationship with many
other accessible. nsAccessible::GetAccessibleRelated is designed to return the
accessible with specified relationship (by argument aRelationType).

NS_IMETHODIMP nsAccessible::GetAccessibleRelated(PRUint32 aRelationType,
nsIAccessible **_retval)

All the relation type come from ATK and have been defined in mozilla. I will add
explaination for them. Currently, only RELATION_LABELLED_BY is widely used and
have major compact on usability (to give accessible a reasonable name). That's
the reason only RELATION_LABELLED_BY is implemented at present. If we need other
relationship, we can add in "nsAccessible::GetAccessibleRelated" easily in the
future.

> 
> What does NODE_CHILD_OF mean, when we already have child nodes?
> 
> I would like to see the nsIAccessible.idl have some comments that describe the
> relationships. At the least it should have a link to relevant documentation.
> 
Not investigate this :-) because it's never been used in current Apps on Linux.
Anyway, I'll add specific description for these relation types if they're available.



Attached patch patch v3 (obsolete) — Splinter Review
add description for relation types
Attachment #171740 - Attachment is obsolete: true
Comment on attachment 171967 [details] [diff] [review]
patch v3

Please use index or count instead a single lettter variable like i. It makes it
easier to edit the code later.
Comment on attachment 171967 [details] [diff] [review]
patch v3

Louie and I talked about this patch. He is going to integrate nsAccessibleLabel
into nsAccessibleText by using the label node for the text node.
Attachment #171967 - Flags: review-
Louie also mentioned that he would change the name of nsAccessibleText to
nsAccessibleTextMixin or nsAccessibleTextHelper so that things wouldn't be so
confusing, for example in nsAccessibleText.h

class nsTextAccessibleWrap : public nsTextAccessible,
                             public nsAccessibleText
RELATION_LABELLED_BY is not the only vital relationship.  For one thing, we need
the reciprocal RELATION_LABEL_FOR, this is essential.  Other very important
relationships are RELATION_CONTROLLER_FOR/RELATION_CONTROLLED_BY (for things
like sliders and scrollbars), RELATION_POPUP_FOR/RELATION_PARENT_WINDOW_OF,
RELATION_FLOWS_FROM/RELATION_FLOWS_TO (text only).  All these are reciprocal.

Louie is right that NODE_CHILD_OF and the EMBEDS/EMBEDDED_BY relations are
seldom used at this time, as is MEMBER_OF.  But MEMBER_OF can be important since
it provides grouping information, for instance in radio button groups.

Whatever is done for nsiAccessible, it's vital that the api can provide for
many-to-many relationship mapping of more than one type.

thanks!
Attached patch patch v4 (obsolete) — Splinter Review
The new patch only implements RELATION_LABELLED_BY and I will fix
"nsAccessibleLable" issue in new bug.

Bill, thanks very much for your information. This patch has already considered
the future adding of new relations. Expanding the code here can add new acc
relation for mozilla. I'll implement relations other than "LABELLED_BY" in new
bugs.
Attachment #171967 - Attachment is obsolete: true
Attachment #181741 - Flags: review?(aaronleventhal)
Comment on attachment 181741 [details] [diff] [review]
patch v4

Louie, this is almost ready.

Can you change GetAccessibleRelated() so that it only gets the accessibility
service and creates the accessible in one place after the switch statement?
Just initialize nsCOMPtr<nsIDOMNode> relatedNode before the switch, and check
to see if it is non-null afterwards.

Also, is it really necessary to get the label content and check to see if it is
empty? Why not just expose the label relationship and let the assistive
technology check the label to see if it is empty or not. When there is a
<label> set but it is empty, a screen reader would know that is intentional and
not try to use a heuristic.
Attachment #181741 - Flags: review?(aaronleventhal) → review-
Changing bug summary to more accurately reflect what it is for. It is not
specific to combo boxes -- it is for implementing relations in general.
Summary: [ATK] Implement "Relation" and Text interface for combobox → Implement basic accessible relations
Attached patch patch v5 (obsolete) — Splinter Review
Fix the 2 issues Aaron mentioned.
Attachment #181741 - Attachment is obsolete: true
Attachment #184395 - Flags: review?(aaronleventhal)
Louie I am working on a modified patch that allows these relations to also be
exposed in MSAA. Will post it within a day.
Attachment #184395 - Flags: review?(aaronleventhal) → review-
That's great for MSAA module to make use of nsAccessible::GetAccessibleRelated
interface. Waiting for your patch.
Neil, this adds support for a control attribute on xul:description, similar to
the control attribute in xul:label. All it does is tie the description to a XUL
form control for accessibility purposes. When that form control gets focused we
can expose a description for it, so that a screen reader can read it for a blind
user. It's an optional attribute.
Comment on attachment 184559 [details] [diff] [review]
1) Buld on Louie's patch & fixes for bug 294834 and bug 290344, 2) Add MSAA constants, 3) Add support for more relations, 4) Add support for ATK_STATE_DEFAULT, 5) Fix GetName() for xul:label

>+  // Relationships are defined on the same content node
>+  // that the role would be defined on
>+  nsIContent *content = GetRoleContent(mDOMNode);

(Against the current trunk) There is no definition of GetRoleContent() in this
patch. I suppose you have missed some part.
Louie, this builds on the reviewed patches in these bugs:
bug 294834 and bug 290344

Please take a look at those bugs to see the impl for GetRoleContent() and other
missing pieces.

Once the tree opens for 1.8b3 we can get them in and it will be easier to review
this patch.

Attachment #184559 - Attachment is obsolete: true
Attachment #184559 - Flags: review?(Louie.Zhao)
Attachment #185019 - Flags: review?(Louie.Zhao)
Attachment #185019 - Attachment is obsolete: true
Attachment #185019 - Flags: review?(Louie.Zhao)
Comment on attachment 185021 [details] [diff] [review]
This patch applies to today's updated trunk and builds. Ready for review.

The patch is good on Linux. Aaron, since "LABEL_FOR" has been implemented, can
you help to integrated this relationship into ATK part when you check in. The
change is only 1 line. Thanks.

Change
>+    PRUint32 relationType[1] = {nsIAccessible::RELATION_LABELLED_BY};
to

+    PRUint32 relationType[2] = {nsIAccessible::RELATION_LABELLED_BY,
+				 nsIAccessible::RELATION_LABEL_FOR};
Attachment #185021 - Flags: review?(Louie.Zhao) → review+
Comment on attachment 185021 [details] [diff] [review]
This patch applies to today's updated trunk and builds. Ready for review.

Okay, Louie. I will fix that for ATK, thanks.
Attachment #185021 - Flags: superreview?(neil.parkwaycc.co.uk)
Attachment #185021 - Flags: superreview?(neil.parkwaycc.co.uk) → superreview?(jst)
Comment on attachment 185021 [details] [diff] [review]
This patch applies to today's updated trunk and builds. Ready for review.

sr=jst
Attachment #185021 - Flags: superreview?(jst) → superreview+
Attachment #185021 - Flags: approval-l10n?
Attachment #185021 - Flags: approval-l10n? → approval1.8b3?
Attachment #185021 - Flags: approval1.8b3? → approval1.8b3+
Checking in public/nsIAccessible.idl;
/cvsroot/mozilla/accessible/public/nsIAccessible.idl,v  <--  nsIAccessible.idl
new revision: 1.39; previous revision: 1.38
done
Checking in src/atk/nsAccessibleWrap.cpp;
/cvsroot/mozilla/accessible/src/atk/nsAccessibleWrap.cpp,v  <-- 
nsAccessibleWrap.cpp
new revision: 1.25; previous revision: 1.24
done
Checking in src/base/nsAccessibilityAtomList.h;
/cvsroot/mozilla/accessible/src/base/nsAccessibilityAtomList.h,v  <-- 
nsAccessibilityAtomList.h
new revision: 1.23; previous revision: 1.22
done
Checking in src/base/nsAccessible.cpp;
/cvsroot/mozilla/accessible/src/base/nsAccessible.cpp,v  <--  nsAccessible.cpp
new revision: 1.152; previous revision: 1.151
done
Checking in src/base/nsAccessible.h;
/cvsroot/mozilla/accessible/src/base/nsAccessible.h,v  <--  nsAccessible.h
new revision: 1.64; previous revision: 1.63
done
Checking in src/msaa/nsAccessibleWrap.cpp;
/cvsroot/mozilla/accessible/src/msaa/nsAccessibleWrap.cpp,v  <-- 
nsAccessibleWrap.cpp
new revision: 1.29; previous revision: 1.28
done
Checking in src/xul/nsXULTextAccessible.cpp;
/cvsroot/mozilla/accessible/src/xul/nsXULTextAccessible.cpp,v  <-- 
nsXULTextAccessible.cpp
new revision: 1.12; previous revision: 1.11
done
Status: NEW → RESOLVED
Closed: 19 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: