Closed Bug 938197 Opened 9 years ago Closed 9 years ago

[ATK Accessibility] AtkTextAttributes derived names should be used on AtkText methods get_run/default_attributs

Categories

(Core :: Disability Access APIs, defect)

x86_64
Linux
defect
Not set
normal

Tracking

()

RESOLVED FIXED
mozilla29

People

(Reporter: apinheiro, Assigned: tbsaunde)

Details

Attachments

(1 file, 1 obsolete file)

User Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 (Beta/Release)
Build ID: 20130917102914

Steps to reproduce:

atk_text_get_run/default_attributes [1][2] returns an AtkAttributeSet with text attributes. Although AtkAttributeSet allows to define custom name/value pairs, the documentation of those methods explains that the default names are defined on the enum AtkTextAttribute. But right now Firefox expose those settings using only custom firefox-defined names. Due this, ATs like Orca need to do some mapping with the common names [4], mapping that imho, should be done by the implementor.

Note that in order to get the name of the attribute from the enum, ATK provides the utility method atk_text_attribute_get_name [5].

You can see an example of usage of that enum and methods on WebKitGTK implementation here [6]

[1] https://developer.gnome.org/atk/stable/AtkText.html#atk-text-get-run-attributes
[2] https://developer.gnome.org/atk/stable/AtkText.html#atk-text-get-default-attributes
[3] https://developer.gnome.org/atk/stable/AtkText.html#AtkTextAttribute
[4] https://git.gnome.org/browse/orca/tree/src/orca/scripts/toolkits/Gecko/script.py#n209
[5] https://developer.gnome.org/atk/stable/AtkText.html#atk-text-attribute-get-name
[6] http://trac.webkit.org/browser/trunk/Source/WebCore/accessibility/atk/WebKitAccessibleInterfaceText.cpp#L81
(In reply to Alejandro Piñeiro from comment #0)
> User Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101
> Firefox/24.0 (Beta/Release)
> Build ID: 20130917102914
> 
> Steps to reproduce:
> 
> atk_text_get_run/default_attributes [1][2] returns an AtkAttributeSet with
> text attributes. Although AtkAttributeSet allows to define custom name/value
> pairs, the documentation of those methods explains that the default names
> are defined on the enum AtkTextAttribute. But right now Firefox expose those
> settings using only custom firefox-defined names. Due this, ATs like Orca
> need to do some mapping with the common names [4], mapping that imho, should
> be done by the implementor.

It shouldn't be too hard to expose the attributes using the common names as well, I guess it isn't an issue if we keep the old names as well for backward compat?

> Note that in order to get the name of the attribute from the enum, ATK
> provides the utility method atk_text_attribute_get_name [5].

that seems rather silly, isn't there just a list of what those enum values map to as strings someplace?  Why is it an enum anyway?
(In reply to Trevor Saunders (:tbsaunde) from comment #1)
> (In reply to Alejandro Piñeiro from comment #0)
> > User Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101
> > Firefox/24.0 (Beta/Release)
> > Build ID: 20130917102914
> > 
> > Steps to reproduce:
> > 
> > atk_text_get_run/default_attributes [1][2] returns an AtkAttributeSet with
> > text attributes. Although AtkAttributeSet allows to define custom name/value
> > pairs, the documentation of those methods explains that the default names
> > are defined on the enum AtkTextAttribute. But right now Firefox expose those
> > settings using only custom firefox-defined names. Due this, ATs like Orca
> > need to do some mapping with the common names [4], mapping that imho, should
> > be done by the implementor.
> 
> It shouldn't be too hard to expose the attributes using the common names as
> well, I guess it isn't an issue if we keep the old names as well for
> backward compat?
> 
> > Note that in order to get the name of the attribute from the enum, ATK
> > provides the utility method atk_text_attribute_get_name [5].
> 
> that seems rather silly, isn't there just a list of what those enum values
> map to as strings someplace?  Why is it an enum anyway?

The enum is convenient and easy to use while writing code.

About the mapping, right now is basically a sttriped form of the enum name. Eventually we would go to use CSS/XSLT name convention:
https://bugzilla.gnome.org/show_bug.cgi?id=363439#c5
> > > Note that in order to get the name of the attribute from the enum, ATK
> > > provides the utility method atk_text_attribute_get_name [5].
> > 
> > that seems rather silly, isn't there just a list of what those enum values
> > map to as strings someplace?  Why is it an enum anyway?
> 
> The enum is convenient and easy to use while writing code.

sure, but you could get  basically the same benefits with a bunch of const char *atk_text_attribute_foo = "foobar"; but I guess that's a design decision from a while ago we can't fix now :(

> About the mapping, right now is basically a sttriped form of the enum name.
> Eventually we would go to use CSS/XSLT name convention:
> https://bugzilla.gnome.org/show_bug.cgi?id=363439#c5

that sounds like it could have backwards compat fun, but anyway can I get a list of the strings some place? or do I have to write code to cache them at run time?
(In reply to Trevor Saunders (:tbsaunde) from comment #3)
> > > > Note that in order to get the name of the attribute from the enum, ATK
> > > > provides the utility method atk_text_attribute_get_name [5].
> > > 
> > > that seems rather silly, isn't there just a list of what those enum values
> > > map to as strings someplace?  Why is it an enum anyway?
> > 
> > The enum is convenient and easy to use while writing code.
> 
> sure, but you could get  basically the same benefits with a bunch of const
> char *atk_text_attribute_foo = "foobar"; but I guess that's a design
> decision from a while ago we can't fix now :(

Yep.

> > About the mapping, right now is basically a sttriped form of the enum name.
> > Eventually we would go to use CSS/XSLT name convention:
> > https://bugzilla.gnome.org/show_bug.cgi?id=363439#c5
> 
> that sounds like it could have backwards compat fun, but anyway can I get a
> list of the strings some place? or do I have to write code to cache them at
> run time?

This is the reason I think that it is better to just use atk_text_attribute_get_name. In that way ATK implementors shouldn't worry about setting a name, and just use what ATK provides.

And in relation with backwards compatibility, it would be also help us if we change the name convention as mentioned on bgo#363439, as all the ATK implementors would change at the same time, and for the same names.
builds with a test patch should soon show up at http://ftp.mozilla.org/pub/mozilla.org/firefox/try-builds/trev.saunders@gmail.com-68ede9eb55a8 can you please check all the attributes you think should use the atk name do?
Attachment #8345464 - Flags: review?(surkov.alexander)
Assignee: nobody → trev.saunders
Status: UNCONFIRMED → ASSIGNED
Ever confirmed: true
Comment on attachment 8345464 [details] [diff] [review]
bug 938197 - alias atk text attr names to gecko ones

Review of attachment 8345464 [details] [diff] [review]:
-----------------------------------------------------------------

::: accessible/src/atk/nsMaiInterfaceText.cpp
@@ +20,3 @@
>  using namespace mozilla::a11y;
>  
> +static const char* atkTextAttrNames[ATK_TEXT_ATTR_LAST_DEFINED];

adding g or s prefix is usually what we do

@@ +24,5 @@
> +static AtkAttributeSet*
> +ConvertToAtkTextAttributeSet(nsIPersistentProperties* aAttributes)
> +{
> +    if (!aAttributes)
> +        return nullptr;

nit: two spaces offset please (in whole method)

@@ +26,5 @@
> +{
> +    if (!aAttributes)
> +        return nullptr;
> +
> +    AtkAttributeSet *objAttributeSet = nullptr;

nit: type* name (here and below)

@@ +31,5 @@
> +    nsCOMPtr<nsISimpleEnumerator> propEnum;
> +    nsresult rv = aAttributes->Enumerate(getter_AddRefs(propEnum));
> +    NS_ENSURE_SUCCESS(rv, nullptr);
> +
> +    bool hasMore;

= fasle; pls

@@ +51,5 @@
> +
> +        AtkAttribute *objAttr = (AtkAttribute *)g_malloc(sizeof(AtkAttribute));
> +        objAttr->name = g_strdup(name.get());
> +        objAttr->value = g_strdup(NS_ConvertUTF16toUTF8(value).get());
> +        objAttributeSet = g_slist_prepend(objAttributeSet, objAttr);

so keeping two version of same attribute, backward compat?

@@ +57,5 @@
> +        // Handle attributes where atk has its own name.
> +        const char* atkName = nullptr;
> +        nsAutoString atkValue;
> +        if (name.EqualsLiteral("color")) {
> +          atkValue = Substring(value, 5, value.Length() - 1);

cutting rgb() thing? it'd be nice to have a comment

@@ +81,5 @@
> +          objAttr = static_cast<AtkAttribute*>(g_malloc(sizeof(AtkAttribute)));
> +              objAttr->name = g_strdup(atkName);
> +              objAttr->value = g_strdup(NS_ConvertUTF16toUTF8(atkValue).get());
> +              objAttributeSet = g_slist_prepend(objAttributeSet, objAttr);
> +              }

nit: wrong indentation as well

@@ +485,5 @@
>    aIface->remove_selection = removeTextSelectionCB;
>    aIface->set_selection = setTextSelectionCB;
>    aIface->set_caret_offset = setCaretOffsetCB;
> +
> +  for (uint32_t i = 0; i < ArrayLength(atkTextAttrNames); i++)

nit: would be nice to have small comment

@@ +487,5 @@
>    aIface->set_caret_offset = setCaretOffsetCB;
> +
> +  for (uint32_t i = 0; i < ArrayLength(atkTextAttrNames); i++)
> +    atkTextAttrNames[i] =
> +      atk_text_attribute_get_name (static_cast<AtkTextAttribute>(i));

nit: no space after function name
yes, keeping the old attributes is about backward compat.
Attachment #8345464 - Attachment is obsolete: true
Attachment #8345464 - Flags: review?(surkov.alexander)
Attachment #8345534 - Flags: review?(surkov.alexander)
Comment on attachment 8345534 [details] [diff] [review]
bug 938197 - alias atk text attr names to gecko ones

Review of attachment 8345534 [details] [diff] [review]:
-----------------------------------------------------------------

few more nits

::: accessible/src/atk/nsMaiInterfaceText.cpp
@@ +48,5 @@
> +    nsAutoString value;
> +    rv = propElem->GetValue(value);
> +    NS_ENSURE_SUCCESS(rv, objAttributeSet);
> +
> +    AtkAttribute *objAttr = (AtkAttribute *)g_malloc(sizeof(AtkAttribute));

type* name

@@ +70,5 @@
> +    } else if (name.EqualsLiteral("font-family")) {
> +      atkValue = value;
> +      atkName = sAtkTextAttrNames[ATK_TEXT_ATTR_FAMILY_NAME];
> +    } else if (name.Equals("font-size")) {
> +      atkValue = StringHead(value, value.Length() - 2);

nit: a comment we cut measure unit

@@ +88,5 @@
> +      objAttributeSet = g_slist_prepend(objAttributeSet, objAttr);
> +    }
> +  }
> +
> +  //libspi will free it

nit: space after //
Attachment #8345534 - Flags: review?(surkov.alexander) → review+
https://hg.mozilla.org/mozilla-central/rev/cb34959ba6f8
Status: ASSIGNED → RESOLVED
Closed: 9 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla29
You need to log in before you can comment on or make changes to this bug.