<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-564396784419613484</id><updated>2012-03-01T09:22:39.837-08:00</updated><category term='AT'/><category term='traveling'/><category term='firefox-for-AT'/><category term='mozilla'/><category term='DOMi'/><category term='aria'/><category term='russia'/><category term='a11y'/><category term='web'/><title type='text'>Alex's blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://asurkov.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://asurkov.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Alex Surkov</name><uri>http://www.blogger.com/profile/05042790799045807105</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-564396784419613484.post-7358264656495398569</id><published>2012-03-01T09:21:00.000-08:00</published><updated>2012-03-01T09:22:39.846-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='a11y'/><category scheme='http://www.blogger.com/atom/ns#' term='AT'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Windows 8 Narrator on the web</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I should notice I'm not a screen reader user and therefore my front-end observations might be not complete or not accurate. Please correct me if I say something wrong.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://windows.microsoft.com/en-US/windows-8/download"&gt;Windows 8 beta&lt;/a&gt; is out. I saw a bunch of posts saying that Microsoft &lt;a href="http://blogs.msdn.com/b/b8/archive/2012/02/14/enabling-accessibility.aspx"&gt;improved&lt;/a&gt; accessibility support, in particular that Narrator was greatly refined over previous versions including outstanding performance in IE. So I wanted to play with Narrator and see how it works in Firefox.&lt;br /&gt;&lt;br /&gt;The background of the interest&lt;span class="short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt; &lt;/span&gt;&lt;/span&gt;is sort of pragmatic. I'm curious whether the market share of screen readers can be shifted after Windows 8 release. The rationally is simple. If some OS provides a set of built-in applications then the user gets all-in-one solution. And if those applications are good enough then many users don't need anything else. So I wasn't going to do any truth worth research but I wanted to see myself how the things look.&lt;br /&gt;&lt;br /&gt;On Windows Mozilla bets on &lt;a href="http://www.linuxfoundation.org/collaborate/workgroups/accessibility/iaccessible2"&gt;IAccessible2&lt;/a&gt;, an open standard developed by number of companies including both AT client vendors (screen readers, screen magnifiers etc) and AT server vendors. I don't think this is going to change but if Firefox wasn't nice on Narrator and if Narrator takes a certain percent of the market share then we at Mozilla can't leave this unaddressed.&lt;br /&gt;&lt;br /&gt;This time I didn't pay an attention to touch-based accessibility features despite this is definitely a crucial part for mobile web. But this is certainly big area deserving own topic. I focused on how Narrator is doing on the web in classical desktop case.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Narrator&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The first noticeable thing is Narrator highlights traversed objects similar to what Voice Over does. This should be a neat feature for teaching and training. I liked the help dialog to see command shortcuts which is good for newbies. Another interesting feature the Narrator allows to bring a dialog containing the list of available actions on the current object and the user can pick up the one to invoke.&lt;br /&gt;&lt;br /&gt;Narrator is fast, at least I didn't noticed any lags when I navigated the web. Moreover I've got an impression that sometimes it's faster than NVDA (both on IE and Firefox).&lt;br /&gt;&lt;br /&gt;It provides hierarchical virtual cursor: arrow keys allows you to move into container, navigate through siblings within a container and move outside a container. It seems that the implementation is quite plain, it just moves the virtual cursor through accessible tree. You may consider this as a benefit since often this allows you to skip easily a large portions of the page. However taking into account that containers aren't provided by any good description then this is rather useless feature, at least until the user learns the hierarchy for each web site he visits. To Narrator credit I must say it announces the amount of items within certain containers. &lt;br /&gt;&lt;br /&gt;On the other hand the web pages and especially web applications have quite complicated trees and that makes navigation not trivial. I'm not experienced user but I feel like NVDA approach is nicer. Narrator approach sounded for me like it's more suitable for tree inspection for debugging proposes rather than for document navigation in the wild.&lt;br /&gt;&lt;br /&gt;I looked how Narrator goes with some applications like GMail. I was able to navigate the whole GMail, however sometimes the virtual cursor reached a certain point and didn't move further. I was forced to use tab to skip this place. Also I wasn't able to locate some menus of menu buttons. I think this is because these menus weren't in hierarchy of the button. So you might want to blame Gmail. &lt;br /&gt;&lt;br /&gt;Narrator allows to navigate the text, provides commands to traverse the page by paragraphs and supports table navigation but I didn't make it to do more complicated structural navigation like navigation by headings, links etc. It doesn't sound like Narrator has it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;MSAA / UIA / IAccessible2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Windows 8 makes some work to map MSAA to UIA and that allows Narrator to work with MSAA applications. That makes Firefox accessible in principle. For example, you can navigate the web pages and do basic interaction with control elements like open a link, click a button etc. But MSAA accessibility is quite restricted.&lt;br /&gt;&lt;br /&gt;Narrator allows the user to navigate by paragraphs, lines, words and characters. It provides some support of text attributes. None of these features work in Firefox. When the document is loaded then Narrator starts reading it. Again not in Firefox.&lt;br /&gt;&lt;br /&gt;In summary Firefox doesn't look cool in Narrator. It's sort of expected because Firefox doesn't implement UIA.&lt;br /&gt;&lt;br /&gt;I didn't really believe that Microsoft will bridge IAccessible2 to UIA but I hoped. That would allow a number of applications like Eclipse, Open Office or Firefox to work great for Narrator users. Sometimes dreams may not come true.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/564396784419613484-7358264656495398569?l=asurkov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://asurkov.blogspot.com/feeds/7358264656495398569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://asurkov.blogspot.com/2012/03/windows-8-narrator-on-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/7358264656495398569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/7358264656495398569'/><link rel='alternate' type='text/html' href='http://asurkov.blogspot.com/2012/03/windows-8-narrator-on-web.html' title='Windows 8 Narrator on the web'/><author><name>Alex Surkov</name><uri>http://www.blogger.com/profile/05042790799045807105</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-564396784419613484.post-7076668834444618078</id><published>2012-02-29T08:40:00.000-08:00</published><updated>2012-02-29T08:40:29.575-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='traveling'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='russia'/><title type='text'>How I booked the flight or the curse of cancel button</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Recently I booked the flight for me and my family. After some search I stopped at Rossiya airlines (Saint-Petersburg's airlines). It was new airlines for me but they offered the best option.&lt;br /&gt;&lt;br /&gt;So I started booking and somewhere in the middle I decided to use another bank card. I pressed cancel button (instead the pay button) and it says the payment failed. No option to retry.&lt;br /&gt;&lt;br /&gt;I tried to dial the call-center of Rossiya airlines, several times, but no any luck to ring till the bell is answered. So I wrote them email and in few minutes I got an answer:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Unfortunately you can't pay by bank card online if you rejected to do that once. But you can pay in our office, choose another payment type or book another flight.&lt;/blockquote&gt;Sure I tried to book the flight again but the price surprised me. It wasn't the best option anymore. So I decided to pay existing one and since another payment type usually assumes a noticeable fee then I said:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Ok. What is address of your office in my city.&lt;/blockquote&gt;They said:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;Unfortunately we don't have offices in your city. You can try to pay by VTB-24 ATM or in VTB-24 bank office.&lt;/blockquote&gt;I asked about the fee. They said no fee. Ok, nice.&lt;br /&gt;&lt;br /&gt;I located VTB-24 ATM near of my house and tried to pay. When I typed the payment info then the ATM said that it can't process this request. I thought maybe VTB-24 ATM can vary, thus I checked Rossiya airlines web site which ATM can be used to make this payment. Next day I tried another VTB-24 ATM. This time when I specified all payment info it said "the feature is not implemented". The farther into the forest the thicker the trees I thought.&lt;br /&gt;&lt;br /&gt;So I came to the office of VTB-24 bank to make a payment. They said I can't pay by my bank card. Of course if that was a bank card of their bank then I could do that but otherwise they can't help me and they need a cash. So I moved to ATM of my bank and got that cache, got back to that office and oh happiness I did that.&lt;br /&gt;&lt;br /&gt;Say me what a heck I pressed that cancel button.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/564396784419613484-7076668834444618078?l=asurkov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://asurkov.blogspot.com/feeds/7076668834444618078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://asurkov.blogspot.com/2012/02/how-i-booked-flight-or-curse-of-cancel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/7076668834444618078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/7076668834444618078'/><link rel='alternate' type='text/html' href='http://asurkov.blogspot.com/2012/02/how-i-booked-flight-or-curse-of-cancel.html' title='How I booked the flight or the curse of cancel button'/><author><name>Alex Surkov</name><uri>http://www.blogger.com/profile/05042790799045807105</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-564396784419613484.post-821511317239525021</id><published>2012-02-24T02:15:00.001-08:00</published><updated>2012-02-24T02:15:13.073-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='a11y'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox-for-AT'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Firefox 12 for AT developers</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Firefox 12 is still on aurora channel and &lt;a href="https://wiki.mozilla.org/Releases#Based_on_Gecko_12"&gt;expected&lt;/a&gt; to enter into beta stage at 13 March. It doesn't have much "front-end" features but there's couple ones that might be interesting for AT developers. We did some under the hood work and crash fixes. Also we improved Mac accessibility support but it's still not a part of the default build.&lt;br /&gt;&lt;br /&gt;ARIA support gained some sugar for multi-selectable widgets like ARIA list and tree. Now the selected state is exposed on list options and tree items by default, i.e. until aria-selected="false" is specified. This prevents screen readers like JAWS and NVDA to say "unselected" for many ARIA widgets on the web when the user traverse through their items. So a bit of sugar to keep users less annoyed.&lt;br /&gt;&lt;br /&gt;We fixed &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;NAVRELATION_EMBEDS&lt;/span&gt; MSAA relation on Firefox application accessible (&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;ROLE_SYSTEM_APPLICATION&lt;/span&gt;/&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;IA2_ROLE_FRAME&lt;/span&gt;). It failed to return a selected tab document accessible under certain circumstances, for example, when Firebug is installed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Invisible and offscreen states&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The most important change is we altered a logic how we expose MSAA &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;INVISIBLE&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;OFFSCREEN&lt;/span&gt; &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd373609%28v=vs.85%29.aspx"&gt;states&lt;/a&gt; and ATK &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;VISIBLE&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;SHOWING&lt;/span&gt; &lt;a href="http://www.pygtk.org/docs/pygtk/atk-constants.html#atk-state-type-constants"&gt;states&lt;/a&gt;. Let's do some background on this.&lt;br /&gt;&lt;br /&gt;ATK &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;VISIBLE&lt;/span&gt; means visible or the user can make it visible. ATK &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SHOWING&lt;/span&gt;&lt;/span&gt; means visible, i.e. on the screen. &lt;a href="http://comments.gmane.org/gmane.comp.gnome.accessibility.devel/2449"&gt;See the post&lt;/a&gt;&amp;nbsp; for the reference. &lt;br /&gt;&lt;br /&gt;MSAA expectations are different. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;INVISIBLE&lt;/span&gt; means not visible on the screen (in either case), &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;OFFSCREEN&lt;/span&gt; means it's not visible on the screenbut the user can make it visible. &lt;a href="http://blogs.msdn.com/b/vsaccessibility/archive/2004/09/20/232157.aspx"&gt;See the post&lt;/a&gt; for the reference.&lt;br /&gt;&lt;br /&gt;So based on that we'd need to do the following:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;on the screen&lt;/li&gt;&lt;ul&gt;&lt;li&gt;MSAA: no &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;INVISIBLE&lt;/span&gt; &amp;amp; no &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;OFFSCREEN&lt;/span&gt;&lt;/li&gt;&lt;li&gt;ATK: &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;VISIBLE&lt;/span&gt; &amp;amp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;SHOWING&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;not on the screen&lt;/li&gt;&lt;ul&gt;&lt;li&gt;MSAA: &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;INVISIBLE&lt;/span&gt; &amp;amp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;OFFSCREEN&lt;/span&gt;&lt;/li&gt;&lt;li&gt;ATK: &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;VISIBLE&lt;/span&gt; &amp;amp; no &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SHOWING&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;hidden accessible&lt;/li&gt;&lt;ul&gt;&lt;li&gt;MSAA: &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;INVISIBLE&lt;/span&gt;&lt;/span&gt; &amp;amp; no &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;OFFSCREEN&lt;/span&gt;&lt;/li&gt;&lt;li&gt;ATK: no &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;VISIBLE&lt;/span&gt; &amp;amp; no &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;SHOWING&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;However Firefox didn't expose hidden accessible this way on MSAA so we decided to not fix this and keep the logic closer to ATK spec:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;on the screen&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;MSAA: no &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;INVISIBLE&lt;/span&gt; &amp;amp; no &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;OFFSCREEN&lt;/span&gt;&lt;/li&gt;&lt;li&gt;ATK: &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;VISIBLE&lt;/span&gt; &amp;amp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;SHOWING&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;not on the screen&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;MSAA: &lt;i&gt;&lt;b&gt;no&lt;/b&gt;&lt;/i&gt; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;INVISIBLE&lt;/span&gt; &amp;amp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;OFFSCREEN&lt;/span&gt;&lt;/li&gt;&lt;li&gt;ATK: &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;VISIBLE&lt;/span&gt; &amp;amp; no &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SHOWING&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;hidden accessible&lt;/li&gt;&lt;ul&gt;&lt;li&gt;MSAA: &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;INVISIBLE&lt;/span&gt;&lt;/span&gt; &amp;amp; no &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;OFFSCREEN&lt;/span&gt;&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;ATK: no &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;VISIBLE&lt;/span&gt; &amp;amp; no &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;SHOWING&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;Also we started to treat accessibles from the background as offscreen (previously they were exposed as invisible). The reason of doing this is usually ATs ignore invisible accessibles but they are interested in changes happening in background tab.&lt;br /&gt;&lt;br /&gt;If you need more information on this then please refer to &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=591363"&gt;the bug&lt;/a&gt; to read discussion.&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/564396784419613484-821511317239525021?l=asurkov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://asurkov.blogspot.com/feeds/821511317239525021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://asurkov.blogspot.com/2012/02/firefox-12-for-at-developers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/821511317239525021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/821511317239525021'/><link rel='alternate' type='text/html' href='http://asurkov.blogspot.com/2012/02/firefox-12-for-at-developers.html' title='Firefox 12 for AT developers'/><author><name>Alex Surkov</name><uri>http://www.blogger.com/profile/05042790799045807105</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-564396784419613484.post-2546455425821614670</id><published>2012-02-20T23:51:00.000-08:00</published><updated>2012-02-20T23:52:53.996-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='a11y'/><category scheme='http://www.blogger.com/atom/ns#' term='aria'/><title type='text'>aria-hidden and role="presentation"</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;John Foliot pinged me about his &lt;a href="http://john.foliot.ca/aria-hidden/"&gt;blog post&lt;/a&gt; devoted to ARIA techniques used to hide the content from assistive technologies. Since I don't have straight answer then I decided to put my thoughts here.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;presentation role&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;ARIA role="presentation" technique is intended to hide an element from AT users. A classical example is presentational images. If you place &lt;/span&gt;&lt;span style="font-family: inherit; font-size: small;"&gt;role="presentation"&lt;/span&gt;&lt;span style="font-size: small;"&gt; on the image then it gets removed from accessible tree. Also this technique can be used to remove HTML table semantics, i.e. if &lt;/span&gt;&lt;span style="font-family: inherit; font-size: small;"&gt;role="presentation"&lt;/span&gt;&lt;span style="font-size: small;"&gt; is specified on HTML table then table structure is not exposed.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;ARIA &lt;/span&gt;&lt;span style="font-size: small;"&gt;role="presentation"&lt;/span&gt;&lt;span style="font-size: small;"&gt; is completely ignored if it's used on focusable element. That means the element isn't removed from accessible tree and its native semantic is exposed. For example, if you put this role on HTML button then it's revealed as normal HTML button to AT. This is reasonable because if the user focuses the button then focus doesn't get lost and screen reader announces something meaningful.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;aria-hidden&lt;/span&gt;&lt;br /&gt;The most noticeable difference from role="presentation" is aria-hidden affects on whole subtree. John gave a &lt;a href="http://john.foliot.ca/aria-hidden/#uc"&gt;good use case&lt;/a&gt;: hide excess links from screen reader users. A common pattern is a clickable image inside HTML:a element. ARIA spec &lt;a href="http://www.w3.org/TR/wai-aria/states_and_properties#aria-hidden"&gt;confirms&lt;/a&gt; this saying "Authors &lt;b class="rfc2119"&gt;MAY&lt;/b&gt;, with caution, use aria-hidden to hide visibly rendered content from assistive technologies &lt;i&gt;only&lt;/i&gt; if the act of hiding this content is intended to improve the experience for users of assistive technologies by removing redundant or extraneous content."&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;I should notice that ARIA is not designed to change visual presentation and affect on behavior. Thus if this is an ordinal link then no ARIA technique can be used to hide it from screen reader user since this contradicts to ARIA design. But if the author puts &lt;/span&gt;&lt;span style="font-size: small;"&gt;@tabindex="-1" on the link to make it unfocusable then &lt;/span&gt;&lt;span style="font-size: small;"&gt;aria-hidden looks like a proper way to achieve desired result.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Technical side&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.w3.org/WAI/PF/aria-implementation/#mapping_general"&gt;ARIA implementation guide&lt;/a&gt; allows to remove elements with &lt;/span&gt;&lt;span style="font-size: small;"&gt;aria-hidden&lt;/span&gt;&lt;span style="font-size: small;"&gt; from accessible tree but it doesn't require that. Also it states "If the object is in the accessibility tree, map all attributes as normal. In addition, expose object attribute &lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;hidden:true&lt;/code&gt;". Additionally it points that if the &lt;/span&gt;&lt;span style="font-size: small;"&gt;aria-hidden&lt;/span&gt;&lt;span style="font-size: small;"&gt; attribute is changed then the browser should emit &lt;/span&gt;&lt;span style="font-size: small;"&gt;attribute_changed&lt;/span&gt;&lt;span style="font-size: small;"&gt; event (in case of IAccessible2). That's exactly what Firefox does.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;So Firefox does a minimal implementation of &lt;/span&gt;&lt;span style="font-size: small;"&gt;aria-hidden&lt;/span&gt;&lt;span style="font-size: small;"&gt; allowing a screen reader to do what it thinks it should. That means each screen readers should invent a wheel and actually that what happens (or doesn't) - check &lt;a href="http://john.foliot.ca/aria-hidden/#tests"&gt;this table&lt;/a&gt; to see how Firefox is different depending on screen reader running.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;Implementation of &lt;/span&gt;&lt;span style="font-size: small;"&gt;aria-hidden&lt;/span&gt;&lt;span style="font-size: small;"&gt; both on browser side and screen reader side is not straightforward. For example if some element having aria-hidden contains a focusable element then its *whole* subtree can't be ignored. At the first glance reasonable solution would be if the browser doesn't create an accessible for each element in subtree until the element is focusable, in other words it treats &lt;/span&gt;&lt;span style="font-size: small;"&gt;aria-hidden&lt;/span&gt;&lt;span style="font-size: small;"&gt; as &lt;/span&gt;&lt;span style="font-size: small;"&gt;role="presentation"&lt;/span&gt;&lt;span style="font-size: small;"&gt; was specified on each node in subtree. Otherwise AT needs to crawl the accessible tree to check if there's an element with &lt;/span&gt;&lt;span style="font-size: small;"&gt;aria-hidden&lt;/span&gt;&lt;span style="font-size: small;"&gt; in &lt;/span&gt;&lt;span style="font-size: small;"&gt;ancestor chain&lt;/span&gt;&lt;span style="font-size: small;"&gt;. The current Firefox implementation forces AT to do that.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Things to think about.&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;If the browser doesn't create an accessible for aria-hidden subtree then there is a black box having certain dimensions on the screen. Thus if the user investigates the page layout by mouse then screen reader says nothing when the mouse pointer is above that black box but if the user clicks at this area then he gets unexpected behavior.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;On the other hand some screen magnifiers use dimensions of accessible objects for page zooming. No accessible then zoom is likely broken.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;So at the second glance I think &lt;/span&gt;&lt;span style="font-size: small;"&gt;aria-hidden&lt;/span&gt;&lt;span style="font-size: small;"&gt; shouldn't change the tree at all. Instead the browser should expose &lt;/span&gt;&lt;span style="font-size: small;"&gt;hidden:true&lt;/span&gt;&lt;span style="font-size: small;"&gt; object attribute on every accessible from the subtree of &lt;/span&gt;&lt;span style="font-size: small;"&gt;aria-hidden&lt;/span&gt;&lt;span style="font-size: small;"&gt; element. That allows AT to decide whether they want to ignore the accessible or not and prevents AT to crawl the accessible hierarchy.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;I'd say this rule should be applicable to &lt;/span&gt;&lt;span style="font-size: small;"&gt;role="presentation"&lt;/span&gt;&lt;span style="font-size: small;"&gt; as well. So if the user explorers the page by mouse then screen reader can say this is presentational image but exclude it from keyboard navigation.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/564396784419613484-2546455425821614670?l=asurkov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://asurkov.blogspot.com/feeds/2546455425821614670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://asurkov.blogspot.com/2012/02/aria-hidden-and-rolepresentation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/2546455425821614670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/2546455425821614670'/><link rel='alternate' type='text/html' href='http://asurkov.blogspot.com/2012/02/aria-hidden-and-rolepresentation.html' title='aria-hidden and role=&quot;presentation&quot;'/><author><name>Alex Surkov</name><uri>http://www.blogger.com/profile/05042790799045807105</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-564396784419613484.post-8191221179539878524</id><published>2012-02-10T02:56:00.000-08:00</published><updated>2012-02-10T02:57:19.784-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DOMi'/><category scheme='http://www.blogger.com/atom/ns#' term='a11y'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>DOM Inspector as accessibility tool</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;As you probably know &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/dom-inspector-6622/"&gt;DOM Inspector&lt;/a&gt; (aka DOMi) is Firefox add-on designed to inspect web pages and Firefox UI. In some sense it's ancestor of &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt; but perhaps not so fancy and miss some useful features like integrated JavaScript console. Nevertheless DOMi allows you to inspect Firefox UI what makes it quite different from Firebug. You may say there's &lt;a href="http://getfirebug.com/wiki/index.php/Chromebug"&gt;ChromeBug&lt;/a&gt; but it has less amount of features than DOMi, for example, it doesn't allow to inspect XBL elements.&lt;br /&gt;&lt;br /&gt;Anyway, DOMi is really nice accessibility tool also. It's not feature complete and far from ideal but it's quite powerful. And that's probably something new for you. Each platform provides set of accessibility tools like &lt;a href="http://accessibility.linuxfoundation.org/a11yweb/util/accprobe/"&gt;accprobe&lt;/a&gt; on Windows, &lt;a href="http://live.gnome.org/Accerciser"&gt;accerciser&lt;/a&gt; on Linux or built-in tools on Mac. These tools have own benefits and disadvantages but main thing I dislike they don't allow me to inspect DOM. When you need to understand why your web page or your ARIA widget has accessibility issues then it's quite handy to inspect both DOM and accessible trees and what's most important to see *relation* between elements of these trees. That's what DOMi gives you.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;DOM Tree&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you check 'Show Accessible Nodes' menu option then 'DOM Nodes' view of the left panel marks accessible DOM nodes by bold font. This view is good to understand where the specific accessible is located in DOM tree. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" height="450" src="http://3.bp.blogspot.com/-UCbNMyjQAnA/TzTTgbCSbeI/AAAAAAAAAA4/H4sizOcpCsQ/s640/Screen+Shot+2012-02-10+at+5.22.57+PM.png" width="640" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Accessible Tree&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you don't want to see inaccessible DOM nodes then you can switch to 'Accessible Tree' view of the left panel. The tree displays accessible role, name and related DOM node information for each accessible. Also you can inspect different properties and relations of interesting accessible by selecting it and choosing corresponding view in the right panel.&lt;br /&gt;&lt;br /&gt;Also you should choose this view if you want to work with complete accessible tree. 'DOM Nodes' view doesn't always allow you to do this because accessible tree is not a strict subset of DOM tree. For example, XUL trees often don't have underlying DOM however they have rows and cells in accessible tree.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-gTWF_rrZhNk/TzTQVmmF6xI/AAAAAAAAAAw/UMVeR8TIcfo/s1600/Screen+Shot+2012-02-10+at+5.11.00+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="449" src="http://3.bp.blogspot.com/-gTWF_rrZhNk/TzTQVmmF6xI/AAAAAAAAAAw/UMVeR8TIcfo/s640/Screen+Shot+2012-02-10+at+5.11.00+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;JavaScript Console&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;JavaScript console is available in 'Accessible Tree' view from context menu on selected accessible. It gets open in separate window (what is not super comfortable) and it doesn't have set of handy functions to help you with tree inspection but you can evaluate arbitrary JS code and call any method on selected accessible object.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-s3zBTe8jijU/TzTenO-kfbI/AAAAAAAAABQ/xF5y4BsGzog/s1600/Screen+Shot+2012-02-10+at+6.12.37+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="446" src="http://1.bp.blogspot.com/-s3zBTe8jijU/TzTenO-kfbI/AAAAAAAAABQ/xF5y4BsGzog/s640/Screen+Shot+2012-02-10+at+6.12.37+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Accessible Properties&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;'Accessible Properties' view of the right panel allows you to inspect accessible properties of the accessible selected in the left panel. You can inspect accessible role, name, states, object attributes i.e. standard set of accessible properties. Also it allows you to invoke accessible actions. Switch to 'Actions' tab to find it out.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-RvYsCYA4Qoc/TzTbPCMmHUI/AAAAAAAAABA/2zmjf-UVns8/s1600/Screen+Shot+2012-02-10+at+5.56.57+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="456" src="http://3.bp.blogspot.com/-RvYsCYA4Qoc/TzTbPCMmHUI/AAAAAAAAABA/2zmjf-UVns8/s640/Screen+Shot+2012-02-10+at+5.56.57+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Accessible Relations&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;'Accessible Relations' view of the right panel allows you to see accessible relations and inspect relation targets in separate window.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-saKn9AQYq40/TzTgEVLpK6I/AAAAAAAAABg/z5tVSVVPcOA/s1600/Screen+Shot+2012-02-10+at+6.18.51+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="434" src="http://2.bp.blogspot.com/-saKn9AQYq40/TzTgEVLpK6I/AAAAAAAAABg/z5tVSVVPcOA/s640/Screen+Shot+2012-02-10+at+6.18.51+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Accessible Events&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;'Accessible Events' is a super feature to inspect web pages and ARIA widgets in dynamics. It allows you to&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;watch accessible events and choose events you want to watch;&lt;/li&gt;&lt;li&gt;add custom event handlers and see output.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-tJwHm3rJjGQ/TzTkhzw5KaI/AAAAAAAAABo/QBHu2Jo6yNA/s1600/Screen+Shot+2012-02-10+at+6.37.52+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="472" src="http://3.bp.blogspot.com/-tJwHm3rJjGQ/TzTkhzw5KaI/AAAAAAAAABo/QBHu2Jo6yNA/s640/Screen+Shot+2012-02-10+at+6.37.52+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If you switch to 'Watched Events' tab then you can choose a number of events you'd like to listen and add custom event handlers. Custom event handlers feature provides you a set of helper functions to inspect accessible tree and accessible properties at time of event handling. For example, you can use &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;outputTree()&lt;/span&gt; function to make a snapshot of accessible tree. Small help button marked by '&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;?&lt;/span&gt;' is available to get a list of helper functions.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-2cIQPjBzzvM/TzTlerIqQcI/AAAAAAAAABw/jT5EqbyMIeU/s1600/Screen+Shot+2012-02-10+at+6.39.55+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="472" src="http://2.bp.blogspot.com/-2cIQPjBzzvM/TzTlerIqQcI/AAAAAAAAABw/jT5EqbyMIeU/s640/Screen+Shot+2012-02-10+at+6.39.55+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You can see custom event handler output by selecting handled event in the left panel and choosing 'Accessible Event' view in the right panel.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Accessible Event&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;'Accessible Event' view of the right panel is used to inspect properties of handled accessible event and contains output of custom event handlers. Here's a snapshot of accessible tree when accessible focus event was handled. Highlighted accessible in the tree is focus event target.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-4Gr5E7PC8Tw/TzTnu268hNI/AAAAAAAAAB4/lYURY8z48L8/s1600/Screen+Shot+2012-02-10+at+6.51.17+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="462" src="http://3.bp.blogspot.com/-4Gr5E7PC8Tw/TzTnu268hNI/AAAAAAAAAB4/lYURY8z48L8/s640/Screen+Shot+2012-02-10+at+6.51.17+PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/564396784419613484-8191221179539878524?l=asurkov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://asurkov.blogspot.com/feeds/8191221179539878524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://asurkov.blogspot.com/2012/02/dom-inspector-as-accessibility-tool.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/8191221179539878524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/8191221179539878524'/><link rel='alternate' type='text/html' href='http://asurkov.blogspot.com/2012/02/dom-inspector-as-accessibility-tool.html' title='DOM Inspector as accessibility tool'/><author><name>Alex Surkov</name><uri>http://www.blogger.com/profile/05042790799045807105</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-UCbNMyjQAnA/TzTTgbCSbeI/AAAAAAAAAA4/H4sizOcpCsQ/s72-c/Screen+Shot+2012-02-10+at+5.22.57+PM.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-564396784419613484.post-9023183075492200760</id><published>2012-02-08T01:38:00.000-08:00</published><updated>2012-02-08T01:38:36.270-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='a11y'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox-for-AT'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Firefox 11 for AT developers</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Here's an update what's new in Firefox 11 (beta, release on March 13) for assistive technology developers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;HTML &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;CSS generated tables (CSS &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;display:table&lt;/span&gt;&lt;/span&gt; style) are exposed as &lt;a href="http://asurkov.blogspot.com/2011/10/data-vs-layout-table.html"&gt;layout tables&lt;/a&gt;. Originally this piece of work was targeted to Firefox 10 but we weren't in time to make this happen.&lt;br /&gt;&lt;br /&gt;HTML table cells (HTML &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;th&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;td&lt;/span&gt; elements) gained new not standard &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;axis&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;abbr&lt;/span&gt; object attributes.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;axis&lt;/span&gt; object attribute is direct mapping of HTML &lt;span style="font-size: x-small;"&gt;&lt;a href="http://www.w3.org/TR/html4/struct/tables.html#adef-axis" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;@axis&lt;/a&gt;&lt;/span&gt; attribute. This object attribute is supposed to help AT to extract semantic of rich HTML tables in the web. Granted, this HTML attribute is not wide used on the web but we wanted to break the chicken-egg problem: browsers/AT don't support it iff web authors don't use it.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;abbr&lt;/span&gt; object attribute is less academic than previous one and useful to pick up short accessible name for header cells, for example, it makes sense when the user traverses through table cells and screen reader announces related heading information for each cell. The user doesn't want to hear long header cell names on and on: that's what &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;abbr&lt;/span&gt; object attribute is supposed to help to. This object attribute is exposed in two cases:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt; HTML &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;abbr&lt;/span&gt; element is inside the table cell&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;@abbr&lt;/span&gt; attribute is used on table cell&lt;/li&gt;&lt;/ul&gt;Examples: &lt;br /&gt;&lt;pre&gt;  &amp;lt;th id="th1"&amp;gt;&amp;lt;abbr title="Social Security Number"&amp;gt;SS#&amp;lt;/abbr&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;  &amp;lt;th id="th2" abbr="SS#"&amp;gt;Social Security Number&amp;lt;/th&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;HTML &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;acronym&lt;/span&gt;&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;abbr&lt;/span&gt; elements allow &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;@title&lt;/span&gt;&lt;/span&gt; attribute for accessible name computation. This can be illustrated by following example:&lt;br /&gt;&lt;pre&gt;  &amp;lt;input id="input"&amp;gt;&lt;br /&gt;  &amp;lt;label for="input"&amp;gt;&amp;lt;acronym title="O A T F"&amp;gt;OATF&amp;lt;/acronym&amp;gt;&amp;lt;/label&amp;gt;&lt;/pre&gt;Accessible name of input accessible is "O A T F" now.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;HMTL5&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;HTML5 &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;figure&lt;/span&gt;&lt;/span&gt; and &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;figcaption&lt;/span&gt;&lt;/span&gt; elements are now accessible.&amp;nbsp; The &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;figure&lt;/span&gt;&lt;/span&gt; element is exposed with generic MSAA &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;ROLE_SYSTEM_GROUPING&lt;/span&gt;&lt;span style="font-size: small;"&gt; and ATK &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ATK_ROLE_PANEL&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt; roles because neither IAccessible2 nor ATK provide more suitable roles. AT can rely on &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;xml-roles:figure&lt;/span&gt;&lt;/span&gt; object attribute to detect &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;figure&lt;/span&gt;&lt;/span&gt; element&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;. HTML &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;figure&lt;/span&gt;&lt;/span&gt; element picks up accessible name from &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;figcaption&lt;/span&gt;&lt;/span&gt; element which is exposed with &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IA2_ROLE_CAPTION&lt;/span&gt;&lt;/span&gt; / &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ATK_ROLE_CAPTION&lt;/span&gt;&lt;/span&gt; role. The &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;figure&lt;/span&gt;&lt;/span&gt; and &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;figcaption&lt;/span&gt;&lt;/span&gt; accessible objects are linked by &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;LABELLED_BY &lt;/span&gt;&lt;/span&gt;/ &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;LABEL_FOR&lt;/span&gt;&lt;/span&gt; relations.&lt;br /&gt;&lt;br /&gt;The content of HTML5 &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;canvas&lt;/span&gt;&lt;/span&gt; element is not accessible still but Firefox 11 started to expose an accessible object having &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IA2_ROLE_CANVAS/ATK_ROLE_CANVAS&lt;/span&gt;&lt;/span&gt; role for &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;canvas&lt;/span&gt;&lt;/span&gt; element itself. Not big deal but it's a good first step on canvas accessibility.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;ARIA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ARIA attributes used on HTML file element (&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;input@type="file"&lt;/span&gt;) are propagated to underlying text field and "Browse" button, i.e. accessible states defined by these attributes are inherited.&lt;br /&gt;&lt;br /&gt;ARIA combobox (&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;@role="combobox"&lt;/span&gt;) fires MSAA &lt;span style="font-family: inherit; font-size: x-small;"&gt;EVENT_OBJECT_VALUECHANGE&lt;/span&gt; event and ATK &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;accessible-value&lt;/span&gt;&lt;/span&gt; signal when option is changed. Here's an &lt;a href="http://oaa-accessibility.org/example/10/"&gt;example&lt;/a&gt; of ARIA combobox widget.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Correctness&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IA2_STATE_ACTIVE/ATK_STATE_ACTIVE&lt;/span&gt;&lt;/span&gt; state is exposed on active item for standard composite widgets like HTML select elements. The state can be used for example to detect the current item of the widget when the widget isn't focused. We make our implementation closer to ARIA widgets where &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;aria-activedescendant&lt;/span&gt;&lt;/span&gt; technique is used. Another side of this code unification is &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IAccessible::accSelect&lt;/span&gt;&lt;/span&gt; called with &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SELFLAG_TAKEFOCUS&lt;/span&gt;&lt;/span&gt; flag can be used on widget items now.&lt;br /&gt;&lt;br /&gt;Small fix for &lt;span id="summary_alias_container"&gt;&lt;span id="short_desc_nonedit_display"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IAccessible::get_accName&lt;/span&gt;&lt;/span&gt; that returns &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;S_FALSE&lt;/span&gt;&lt;/span&gt; when the accessible object doesn't have accessible name. Not big deal. Done for consistence and meet MSAA spec.&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/564396784419613484-9023183075492200760?l=asurkov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://asurkov.blogspot.com/feeds/9023183075492200760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://asurkov.blogspot.com/2011/11/firefox-11-for-at-developers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/9023183075492200760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/9023183075492200760'/><link rel='alternate' type='text/html' href='http://asurkov.blogspot.com/2011/11/firefox-11-for-at-developers.html' title='Firefox 11 for AT developers'/><author><name>Alex Surkov</name><uri>http://www.blogger.com/profile/05042790799045807105</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-564396784419613484.post-3682971770519515030</id><published>2011-11-24T06:49:00.000-08:00</published><updated>2011-11-24T06:49:51.252-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='a11y'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox-for-AT'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Frefox merry-go-round</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;As you know Mozilla switched to fast release cycle this year and no doubts this is a great decision for Firefox users because they don't need to wait couple years anymore before wanted features are added or disturbing bugs are fixed. But everything would be ok if it weren't so bad. There's a downside of this approach. 3d party vendors of products that rely on Firefox this or that way like screen readers aren't always able to pick up new things so fast as they appear. That can happen due to various reasons for example because of different release cycles. That's why users can suffer and blame screen readers. Screen readers blame Firefox and new ways of collaboration must be figured out. One way is to provide up to dated information what's new for assistive technologies (AT) developers in Firefox. I continue Marco's &lt;a href="http://www.marcozehe.de/"&gt;blog&lt;/a&gt; tradition where he gives general overview of accessibility improvements and I will highlight the changes that might be interesting for AT developers.&lt;br /&gt;&lt;br /&gt;Since many Firefoxes were released after my last post about &lt;a href="http://asurkov.blogspot.com/2011/03/firefox-4-for-at-developers.html"&gt;Firefox 4 for assistive technologies&lt;/a&gt; then I list accessibility related changes for both released and upcoming Firefox versions. Note, the post doesn't cover UI changes in Firefox which can be also important for AT developers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Firefox 5 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Firefox 5 appeared shortly after Firefox 4 and actually it was a release we wanted to see as Firefox 4. Firefox 4 was really great, so &lt;span class="short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;innovative&lt;/span&gt;&lt;/span&gt; and so different from Firefox 3.6 but due to tight schedule we were unable to make sure all changes work perfectly. So Firefox 5 is Firefox 4 that contains several crash fixes and few fixed regressions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;Firefox 6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The most interesting thing happened on Linux is plugins accessibility. Thanks to Brad Taylor who contributed this feature the plugins can be made accessible on Linux now. The solution is based on socket mechanism, refer to &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=480317"&gt;bug&lt;/a&gt; for technical discussion and example. This work might be found remarkable because it could happen that this was a last thing we did for plugin accessibility. It sounds like era of plugins is &lt;a href="http://robert.ocallahan.org/2011/11/end-of-plugins.html"&gt;ending&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;ARIA implementation gained support of MSAA accChild method on ARIA documents. So you can get a child belonging to ARIA document by passing unique ID of the child into accChild method called on document accessible. This is quite neat feature for AT developers since they don't need to have special support for ARIA documents.&lt;br /&gt;&lt;br /&gt;We've got some ARIA improvements and HTML5 progress element &lt;a href="http://www.marcozehe.de/2011/05/18/firefox-6-htmlprogress-element-accessibility/"&gt;accessibility support&lt;/a&gt;. Some crashes and regressions are fixed. Read Marco's &lt;a href="http://www.marcozehe.de/2011/06/01/whats-new-in-accessibility-in-firefox-6/"&gt;blogpost&lt;/a&gt; for details.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Firefox 7&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Firefox 7 is mostly under the hood work, less memory usage, more performance, more stability.&lt;br /&gt;&lt;br /&gt;ARIA role="presentation" if specified on focusable elements doesn't override accessible role coming from native markup. So if the author puts it by accident on focusable HTML table then table accessible is still exposed to AT.&lt;br /&gt;&lt;br /&gt;HTML tables got more correct mapping of summary attribute and caption element to accessibility APIs. HTML5 aside element is exposed as complimentary xml-roles object attribute what makes it an equivalent to ARIA role="complimentary" technique.&lt;br /&gt;&lt;br /&gt;Thunderbird 7 is a little more accessible now. Orca announces the number of unread messages when inbox is refreshing. Read more in Marco's &lt;a href="http://www.marcozehe.de/2011/09/27/firefox-7-is-released-new-features-in-accessibility/"&gt;blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Firefox 8&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Access keys and keyboard shortcuts are exposed in ATK for any element (previous releases were restricted to menus). I hope Orca users are little happier now.&lt;br /&gt;&lt;br /&gt;IAccessibleRelation::get_targets method was regressed. ATs don't rely on this method currently so the regression was noticed too late after Firefox 8 was shipped. The problem is fixed in Firefox 9.&lt;br /&gt;&lt;br /&gt;See Marco's &lt;a href="http://www.marcozehe.de/2011/11/08/whats-new-in-accessibility-in-firefox-8-0/"&gt;post&lt;/a&gt; for more details.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Firefox 9&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Currently Firefox 9 is in beta stage. Release is expected in December. It doesn't have much new for AT developers and web authors. However it's worth to notice ARIA autocomplete attribute is now respected when used on HTML input element. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Firefox 10&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Firefox 10 is in alpha stage now. &lt;br /&gt;&lt;br /&gt;Firefox 10 has a great improvement of focus management. If you still stay on Firefox 3.6 due to some reason then it's time to seriously think if it's worth to continue ;)&lt;br /&gt;&lt;br /&gt;New focus management makes different widgets of same type to work consistently.&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Listboxes (like HTML select@size&amp;gt;1) claims to be focusable but they never get the focus as long as they have navigable items. Items are focusable and receive focus events.&lt;/li&gt;&lt;li&gt;Comboboxes (like HTML select) and its options are focusable. Combobox gets the focus until it's expanded, otherwise selected option keeps the focus. If the user navigates items in collapsed combobox then no focus event is fired, items receive selection change events and combobox itself receives value change events.&lt;/li&gt;&lt;li&gt;Autocompletes like Firefox awesomebar work similar to comboboxes. Except they don't provide a way to navigate options when autocomplete popup is closed.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Also Firefox 10 has changed the support of selection events. Now it fires the following MSAA events for selectable controls:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt; &lt;span style="font-size: x-small;"&gt;EVENT_OBJECT_SELECTION&lt;/span&gt; when single item was selected, event is targeted to item.&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: x-small;"&gt;EVENT_OBJECT_SELECTIONADD&lt;/span&gt; and &lt;span style="font-size: x-small;"&gt;EVENT_OBJECT_SELECTIONREMOVE&lt;/span&gt; when item(s) was unselected and/or items were selected, events are targeted to changed items.&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: x-small;"&gt;EVENT_OBJECT_SELECTIONWITHIN&lt;/span&gt; when selection within control was changed much, for example, when all items were selected. In this case screen readers can announce that selection was changed rather than announce every changed item. Event target is control.&lt;/li&gt;&lt;/ul&gt;ATK emits &lt;span style="font-size: x-small;"&gt;"selection_changed"&lt;/span&gt; signal. It doesn't provide information about how selection was changed and it's supposed to be used as generic notification.&lt;br /&gt;&lt;br /&gt;caretOffset method of text interface can be used now to change the caret position within a document. That makes this release a little bit closer to virtual cursor implementations based on Gecko's caret navigation mode.&lt;br /&gt;&lt;br /&gt;HTML table &lt;a href="http://asurkov.blogspot.com/2011/10/data-vs-layout-table.html"&gt;'layout-guess'&lt;/a&gt; object attribute now takes into account @datatable="0" attribute placed on HTML table. We did that to make the web is a little more accessible. Web authors should use ARIA role="presentation" instead.&lt;br /&gt;&lt;br /&gt;HTML map element used as navigation links container is always exposed to AT even if imagemap techniques are used on it. See an example:&lt;br /&gt;&lt;pre&gt;  &amp;lt;map id="mapgroup" title="Navigation Bar" name="mapgroup"&amp;gt;&lt;br /&gt;    [&amp;lt;a href="#how"&amp;gt;Bypass navigation bar&amp;lt;/a&amp;gt;]&lt;br /&gt;    [&amp;lt;a href="home.html"&amp;gt;Home&amp;lt;/a&amp;gt;]&lt;br /&gt;  &amp;lt;/map&amp;gt;&lt;/pre&gt;&lt;br /&gt;Default state on submit button is exposed correctly. So if the form has two submit buttons by accident then only one which is really default exposes this state. HTML options and XUL tree items don't pick up relations from their controls anymore. These are good fixes allowing the screen readers to avoid the confusion.&lt;br /&gt;&lt;br /&gt;HTML5 gained complete support of @datalist attribute on HTML input controls which is exposed as &lt;span style="font-size: x-small;"&gt;SUPPORTS_AUTOCOMPLETION&lt;/span&gt; state and supported by IAccessible2 and ATK APIs.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/564396784419613484-3682971770519515030?l=asurkov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://asurkov.blogspot.com/feeds/3682971770519515030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://asurkov.blogspot.com/2011/11/frefox-merry-go-round.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/3682971770519515030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/3682971770519515030'/><link rel='alternate' type='text/html' href='http://asurkov.blogspot.com/2011/11/frefox-merry-go-round.html' title='Frefox merry-go-round'/><author><name>Alex Surkov</name><uri>http://www.blogger.com/profile/05042790799045807105</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-564396784419613484.post-8376212973539592855</id><published>2011-11-21T20:11:00.001-08:00</published><updated>2011-11-21T20:25:00.805-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='russia'/><title type='text'>Random thoughts</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;They replaced children's playground by parking lots near of my house. Children don't play soccer, volleyball or tennis anymore. They've got some free time and they can spend it for something else. But don't worry, sooner or later children will grow up and they will buy cars too.&lt;br /&gt;&lt;br /&gt;Рядом с моим домом убрали детскую площадку, заменили на автомобильную парковку. Детям негде играть в футбол, волейбол или тенис. У них появилось свободное время, чтобы потратить его на что-нибудь еще. Но не стоит переживать, рано или поздно дети вырастут и у них тоже будут машины.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/564396784419613484-8376212973539592855?l=asurkov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://asurkov.blogspot.com/feeds/8376212973539592855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://asurkov.blogspot.com/2011/11/random-thoughts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/8376212973539592855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/8376212973539592855'/><link rel='alternate' type='text/html' href='http://asurkov.blogspot.com/2011/11/random-thoughts.html' title='Random thoughts'/><author><name>Alex Surkov</name><uri>http://www.blogger.com/profile/05042790799045807105</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-564396784419613484.post-2163395021565226807</id><published>2011-11-17T06:32:00.001-08:00</published><updated>2011-11-17T10:27:11.246-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='a11y'/><category scheme='http://www.blogger.com/atom/ns#' term='aria'/><title type='text'>ARIA autocomples implementation insight</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Autocomple widget is a text field having associated list of options so the user is allowed to type value into text field or choose it from available options. Basically autocomplete is variety of combobox control and the user expects it behaving similarly to combobox, for example, keyboard shortcuts should work mostly the same way.&lt;br /&gt;&lt;br /&gt;ARIA allows the author to create autocomplete widgets by putting aria-autocomplete attribute on element having role="textbox" or role="combobox" attributes. There are examples on the web, for instance, &lt;a href="http://hanshillen.github.com/jqtest/#goto_autocomplete"&gt;here&lt;/a&gt; or &lt;a href="http://oaa-accessibility.org/example/9/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Usually authors prefer to use HTML input control as a base of autocomplete widget because they get typing implementation for free. All they need is to implement autocomplete list, navigation through list options and support standard combobox shortcuts.&lt;br /&gt;&lt;br /&gt;When the user navigates autocomplete list then he's able to start typing to adjust list of available options. From implementation point of view the author tends to keep DOM focus on text field. That makes sense because if he keeps it on option element or autocomplete list then he'd need to implement typing on his own. But what is perceived focus in this case? I'd say the focus is on currently traversed option but when the user starts typing then focus goes into text field and visa versa. It's quite similar to comboboxes: when the user navigates options then focus is on option, if the user dismiss popup then focus goes into combobox itself.&lt;br /&gt;&lt;br /&gt;How does it look from AT perspective? When the user navigates through options then AT should announce where the user is. For that the author can manage the DOM focus by tabindex technique, use ARIA live regions or try something else. Tabindex technique is really great because it's mapped into accessibility focus concept. The focus concept exists in all AT APIs what makes it universal and all ATs support it very well. Whenever focus is changed it gets announced to the user.  ARIA live regions technique is good too because it's supported well by modern ATs.&lt;br /&gt;&lt;br /&gt;Reality is the author doesn't want to manage DOM focus because it means special support for typing and he doesn't want to use ARIA live regions because it's hacky, complicated and sort of weird. So we have something else in the end. ARIA provides one more technique called active descendant which is supposed to be mapped to accessible focus but not restricted to it. So this one looks like authors could rely on.&lt;br /&gt;&lt;br /&gt;The author wants to keep DOM focus on text field so he sets aria-activedescendant attribute on autocomplete list element which points to currently traversed option. ARIA implementation guide states that aria-activedescendant attribute change results in accessible focus event on pointed descendant iff the container has DOM focus. Since DOM focus is on text field then there's no focus event. Author can't manage aria-activedescendant on text field since autocomplete popup can't be a child of text field due to markup restrictions and strictly speaking it shouldn't be required to be a logical child (aria-owns).&amp;nbsp; Actually the relation between autocomplete and autocomplete popup should be described by aria-controls attribute but ARIA spec doesn't allow to map aria-activedescendant changes into focus event for elements of this relation.&lt;br /&gt;&lt;br /&gt;So what do we have? Some AT APIs (like IAccessible2) has a concept of active descendant and the author could hope that ATs are smart enough so they can pick up active descendant changes and announce them to the user. Reality is active descendant concept is well supported neither by browsers nor by ATs. Some AT APIs (like MSAA) doesn't have it. I'm not aware of other use cases of this concept so that makes me think that active-descendant is going to require special support from ATs. But ATs like focus, they don't want to support new techniques when there's working old one. Autocomple widgets are not special and user interaction can be described in focus terms. That's how Firefox awesome bar works.&lt;br /&gt;&lt;br /&gt;What can we do? I think ARIA spec should be changed to extend rules of active-descendant mapping into accessible focus. The following proposition sounds reasonable with me. Allow ARIA menu, listbox and tree widgets controlled (aria-controls) by the widget having DOM focus to manage accessible focus by aria-activedescendant technique. For example:&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;lt;input aria-autocomplete="list" aria-controls="autocomplelist"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;ul role="listbox" id="autocompletelist" aria-activedescendant="option1"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li role="listitem" id="option1"&amp;gt;first option&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;li role="listitem" id="option2"&amp;gt;second option&amp;lt;/li&amp;gt;  &lt;br /&gt;&amp;nbsp; &amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;br /&gt;In this case AT should report accessible focus on the first option when the text field has DOM focus.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/564396784419613484-2163395021565226807?l=asurkov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://asurkov.blogspot.com/feeds/2163395021565226807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://asurkov.blogspot.com/2011/11/aria-autocomples-implementation-insight.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/2163395021565226807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/2163395021565226807'/><link rel='alternate' type='text/html' href='http://asurkov.blogspot.com/2011/11/aria-autocomples-implementation-insight.html' title='ARIA autocomples implementation insight'/><author><name>Alex Surkov</name><uri>http://www.blogger.com/profile/05042790799045807105</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-564396784419613484.post-6611807575528473869</id><published>2011-10-26T22:31:00.000-07:00</published><updated>2011-10-26T22:31:49.460-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='a11y'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>When HTML table is an accesible table</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;In addition to previous topic &lt;a href="http://asurkov.blogspot.com/2011/10/data-vs-layout-table.html"&gt;Data vs layout tables&lt;/a&gt; another aspect of the issue is when layout-guess computation algorithm is applied for HTML table elements.&lt;br /&gt;&lt;br /&gt; Shortly the algorithm starts working if HTML table element has associated table accessible. In particular that means it doesn't run if HTML table is not accessible, i.e. it doesn't have  any associated accessible object in the accessible objects hierarchy. This happens if HTML table is&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt; not visible (CSS display:none or visibility:hidden styles are applied)&lt;/li&gt;&lt;li&gt;not focusable and ARIA role="presentation" is used on it.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Another case is when table element is accessible but it's not a table accessible. From AT perspective the table accessible is an accessible object that exposes a number of table specific interfaces (like IAccessibleTable2 in case of IAccessible2) and has proper accessible roles (like MSAA table or outline roles). So this case is effective (no table accessible is created) when ARIA role used to override native semantics is set on the element, for example role="button". Note, the same time weak ARIA roles like role="banner" don't affect on table semantics and the element gets treated as a table by AT.&lt;br /&gt;&lt;br /&gt;In either case HTML table accessibility state affects on its underlying accessible hierarchy. So that if HTML table is not accessible or is not a table accessible then no table structure is exposed, i.e. no rows and no cells.&lt;br /&gt;&lt;br /&gt;Also table accessibles may be created for elements different than HTML tables. There are two options to do that:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;CSS display:table&lt;/li&gt;&lt;li&gt;table specific ARIA roles like role="grid" or role="treegrid".&lt;/li&gt;&lt;/ul&gt;The layout-guess algorithm returns true in former case and false in second case.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/564396784419613484-6611807575528473869?l=asurkov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://asurkov.blogspot.com/feeds/6611807575528473869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://asurkov.blogspot.com/2011/10/when-html-table-is-accesible-table.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/6611807575528473869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/6611807575528473869'/><link rel='alternate' type='text/html' href='http://asurkov.blogspot.com/2011/10/when-html-table-is-accesible-table.html' title='When HTML table is an accesible table'/><author><name>Alex Surkov</name><uri>http://www.blogger.com/profile/05042790799045807105</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-564396784419613484.post-4242739274263171608</id><published>2011-10-19T08:06:00.000-07:00</published><updated>2011-10-19T08:06:30.589-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='a11y'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Data vs layout table</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div&gt;Tables in accessible world may be treated as data or layout table. The data tables are supposed to contain data and user should be able to navigate through its structure and get information like headings. Typical example of data table is grid. Layout tables are supposed for elements arrangement on the screen and structure of these tables is likely ignored by AT.&lt;br /&gt;&lt;br /&gt;Firefox provides semi-standard layout-guess object attribute on table accessible to say whether this table is for data or layout. Shortly, this attribute is exposed for layout tables only, for data table it's omitted. This object attribute wasn't adopted by IAccessible2 or ATK specifications yet but there is discussion on IAccessible2 list.&lt;br /&gt;&lt;br /&gt;In Gecko only HTML tables can be treated as layout tables. So the following algorithm is considered in context of HTML tables. This algorithm is pretty static between Firefox releases but Firefox 10 introduces slight changes to it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Algorithm&lt;/span&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Table inside editable area is data table always since the table structure is crucial for table editing&lt;/li&gt;&lt;li&gt;Table having table related ARIA role is data table (like ARIA grid or treegrid)&lt;/li&gt;&lt;li&gt;Table having landmark role is data table&lt;/li&gt;&lt;li&gt;Table having datatable="0" attribute is layout table (Firefox 10)&lt;/li&gt;&lt;li&gt;Table made by CSS display style is layout table&amp;nbsp; (Firefox 10)&lt;/li&gt;&lt;li&gt;Table having summary attribute or legitimate data table structures is data table, these structures are&lt;/li&gt;&lt;ul&gt;&lt;li&gt;caption element &lt;/li&gt;&lt;li&gt;col or colgroup elements&lt;/li&gt;&lt;li&gt;tfoot or thead elements&lt;/li&gt;&lt;li&gt;th elements &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Table having nested table is layout table&lt;/li&gt;&lt;li&gt;Table having only one row or column is layout table&lt;/li&gt;&lt;li&gt;Table having many columns (&amp;gt;= 5) is data table&lt;/li&gt;&lt;li&gt;Table having borders around cells is data table&lt;/li&gt;&lt;li&gt;Table having differently colored rows is data table&lt;/li&gt;&lt;li&gt;Table having many rows (&amp;gt;= 20) is data table&lt;/li&gt;&lt;li&gt;Wide table (more than 95% of the document width) is layout table&lt;/li&gt;&lt;li&gt;Table having small amount of cells (&amp;lt;= 10) is layout table&lt;/li&gt;&lt;li&gt;Table containing embed, object, applet of iframe elements (typical advertisements elements) is layout table&lt;/li&gt;&lt;li&gt;Otherwise it's data table&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/564396784419613484-4242739274263171608?l=asurkov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://asurkov.blogspot.com/feeds/4242739274263171608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://asurkov.blogspot.com/2011/10/data-vs-layout-table.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/4242739274263171608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/4242739274263171608'/><link rel='alternate' type='text/html' href='http://asurkov.blogspot.com/2011/10/data-vs-layout-table.html' title='Data vs layout table'/><author><name>Alex Surkov</name><uri>http://www.blogger.com/profile/05042790799045807105</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-564396784419613484.post-3606984126749811737</id><published>2011-10-19T03:26:00.000-07:00</published><updated>2011-10-19T03:29:10.417-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='a11y'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Accessible document handling in Firefox</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;The accessible document handling is one of tricky parts of accessible Firefox implementation and implicates not evident details. By providing up-to-dated knowledge about this are I hope this information will be interesting for AT developers.&lt;br /&gt;&lt;br /&gt;The document accessible is self-contained unit in Firefox and it's mapped into AT APIs by different ways. For example, neither MSAA nor IAccessible2 has similar concept and accessible roles is a primary test used to detect this particular accessible is document accessible. The same time the knowing that this particular accessible is a document accessible having specific document type might be important for AT because it allows to make assumptions about the content and the ways how it should be expose to the user.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Document types &lt;/span&gt;&lt;br /&gt;A document accessible may belong to one or more document types. This is mostly terminological split, however documents may be characterized by specific properties depending on type.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tab documents&lt;/b&gt;&lt;br /&gt;The tab document is a document accessible created for web page within the browser tab. Tab document is unique document type what document load events are fired for (see Events section below).&lt;br /&gt;&lt;br /&gt;On Windows Gecko provides not standard way to acquire the tab document accessible from any its child accessible object. For that the following GUID:&lt;br /&gt;&lt;div style="text-align: center;"&gt;const GUID SID_IAccessibleContentDocument = {0xa5d8e1f3,0x3571,0x4d8f,0x95,0x21,0x07,0xed,0x28,0xfb,0x07,0x2e}&lt;/div&gt;is used as argument of IServiceProvider::QueryService() method.  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Application documents&lt;/b&gt; &lt;br /&gt;Application document is a document created for piece of Firefox UI (also referred as chrome). Note, the application document can be a tab document if it's hosted within browser tab like add-ons page.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Dialog documents &lt;/b&gt;&lt;br /&gt;Different kinds of dialogs falls into this category (like XUL dialog, XUL wizard elements or ARIA dialogs).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sub documents&lt;/b&gt;&lt;br /&gt;Sub documents are documents contained within tab or application documents. Sub documents may be nested. For example, documents contained by iframe element accessible objects.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Temporary documents&lt;/b&gt;&lt;br /&gt;Temporary documents is something we try to avoid but there are few cases when they are created for a short period. This sort of documents is replaced by  another type document shortly.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Native documents&lt;/b&gt;&lt;br /&gt;Native documents are document accessibles created for DOM documents.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;ARIA documents&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;ARIA can be used to create a document accessible by placing ARIA role attribute on DOM element, for example, "dialog", "document" or  "application" roles are used for that.&amp;nbsp; In contrast to native documents ARIA documents can have behavior &lt;span class="active"&gt;distinct from&lt;/span&gt; native documents. This happens when ARIA role is used on DOM element other than document element or HTML body element, in other words when there's no native document accessible is in base of ARIA document.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Roles&lt;/span&gt;&lt;br /&gt;The document accessible can have one of the following accessible roles: &lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;DOCUMENT role&lt;/li&gt;&lt;li&gt;APPLICATION role&lt;/li&gt;&lt;li&gt;DIALOG role&lt;/li&gt;&lt;/ul&gt;Exposed role depends on document type. Note that ARIA role can be used to change accessible role.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DOCUMENT role&lt;/b&gt;&lt;br /&gt;MSAA / ATK roles: ROLE_SYSTEM_DOCUMENT / ATK_ROLE_DOCUMENT_FRAME.&lt;br /&gt;Primary this role is used for web page documents and for their sub documents.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;APPLICATION role&lt;/b&gt;&lt;br /&gt;MSAA / ATK roles: ROLE_SYSTEM_APPLICATION / ATK_ROLE_EMBEDDED.&lt;br /&gt;The application role is used for chrome documents when they aren't dialogs. For example, it's used for Firefox UI window, add-ons page or error pages. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;DIALOG role&lt;/b&gt;&lt;br /&gt;MSAA / ATK roles: ROLE_SYSTEM_DIALOG / ATK_ROLE_DIALOG.&lt;br /&gt;Used for dialog documents.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-size: large;"&gt;States&lt;/span&gt;&lt;br /&gt;The following states related with document life cycle can be exposed by document accessible.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;STALE state&lt;/b&gt; &lt;br /&gt;IAccessible2 / ATK states: IA2_STATE_STALE / ATK_STATE_STALE.&lt;/div&gt;&lt;div style="text-align: left;"&gt;The state is exposed when document is not attached to the tree (see Document creation section).&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;BUSY state&lt;/b&gt; &lt;/div&gt;&lt;div style="text-align: left;"&gt;MSAA / ATK states:  STATE_SYSTEM_BUSY / ATK_STATE_BUSY.&lt;br /&gt;The state is exposed when document is loading or HTTP request was initiated by user (for example, when clicking on link).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Events&lt;/span&gt;&lt;br /&gt;The following events related with document life cycle can be fired.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;REORDER event&lt;/b&gt;&lt;br /&gt;MSAA event: STATE_SYSTEM_REORDER.&lt;br /&gt;Fired on document container accessible when document accessible is attached to the tree.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LOAD_COMPLETE event&lt;/b&gt;&lt;br /&gt;IAcessible2 event / ATK signal: IA2_EVENT_DOCUMENT_LOAD_COMPLETE / "load_complete".&lt;br /&gt;Fired on tab document accessible when document is loaded together with its sub documents (referred as completely loaded document).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LOAD_STOPPED event&lt;/b&gt;&lt;br /&gt;IAcessible2 event / ATK signal: IA2_EVENT_DOCUMENT_LOAD_STOPPED/ "load_stopped".&lt;br /&gt;Fired on tab document accessible when document loading is cancelled.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;RELOAD event&lt;/b&gt;&lt;br /&gt;IAcessible2 event / ATK signal: IA2_EVENT_DOCUMENT_RELOAD / "reload".&lt;br /&gt;Fired on tab document when the document is about to reload. 'eventFromUserInput' object attribute on document accessible can be used to detect whether the event was caused by user or programmatically. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;STATE_CHANGE event&lt;/b&gt;&lt;br /&gt;MSAA event / ATK signal: EVENT_OBJECT_STATECHANGE / "state-change".&lt;br /&gt;Fired on tab document when documents is completely loaded or loading was cancelled. Fired immediately after LOAD_COMPLETE or LOAD_STOPPED events.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Document creation&lt;/span&gt;&lt;br /&gt;A document accessible is created whenever it gains DOM content or the accessible was requested by AT. It has STALE state until it gets initial content and gets attached to the tree. After that the REORDER event on the document container accessible is emitted. In case of document that is root in hierarchy the REORDER event is fired on application accesible.&lt;br /&gt;The document keeps BUSY state until it gets completely loaded or loading was cancelled. After that the LOAD_COMPLETE or LOAD_STOPPED events are fired in case of tab document.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Children getting&lt;/span&gt;&lt;br /&gt;On Windows the document accessible allows to get any child accessible within it by accessible unique ID (refer to IAccessible::accChild). This is quite useful mechanism to get an event target. Note, this works for ARIA documents as well.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/564396784419613484-3606984126749811737?l=asurkov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://asurkov.blogspot.com/feeds/3606984126749811737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://asurkov.blogspot.com/2011/10/accessible-document-handling-in-firefox.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/3606984126749811737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/3606984126749811737'/><link rel='alternate' type='text/html' href='http://asurkov.blogspot.com/2011/10/accessible-document-handling-in-firefox.html' title='Accessible document handling in Firefox'/><author><name>Alex Surkov</name><uri>http://www.blogger.com/profile/05042790799045807105</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-564396784419613484.post-3269178586982375348</id><published>2011-05-03T05:57:00.000-07:00</published><updated>2011-11-21T20:11:35.398-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='russia'/><title type='text'>Travel passport online in Russia!</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Finally they saved us from standing in long lines and millions of forms fillings when you need to get social services from government. Now you can fill up millions of forms online. Yep, that's great. My travel passport gets expired soon so I decided to obtain a new one online.&lt;br /&gt;&lt;br /&gt;I went to gosuslugi.ru where I were asked to sign up. I entered my ID number (well, it's not ID in terms of USA but close at some precision) and they said they will send me activation number by post mail. "Ok" - I thought and after couple weeks I've got a letter with activation number.&lt;br /&gt;&lt;br /&gt;Then I activated my account. It was tabbed UI.&amp;nbsp; First tab "enter ID and activation numbers". Second tab "pick up a password". Third tab: "you see a message that account is activated". So due to some reason they skipped a second tab. They said my account was activated and now I can use it. "Ok" - I thought and tried to use it with empty password. That didn't work. Fortunately, they allowed me to pick up new passport after usual procedure with confirmation by email. "Ok, great" - I thought - "let's move further".&lt;br /&gt;&lt;br /&gt;I was ready to fill up the form to request a new travel passport. That was a big form, yep, really big form. I should point who I am, my birthplace, my existing passports, all my jobs and etc, shortly speaking all my biography.&lt;br /&gt;&lt;br /&gt;That was a bit unusual UI. I need to choose where I want to pick up the passport when it's ready. You can imagine how Russia is big and how many places to pick up the passport it could have. These options weren't sorted by cities. I listed them one by one looking for a proper one. My wife suggested to start from the end (she had experience to get the travel passport online, well, she didn't get yet) and - oh happiness - my option was in first dozen of options from the end.&lt;br /&gt;&lt;br /&gt;I'm not sure why but my browser shows enabled and disabled controls on this web page the same way (I assume that's page styling). The required control elements are marked by red asterisk, this applied to enabled and disabled controls both. Usually when you choose a value in combobox then some controls gets enabled or disabled. So what I did? I clicked any form control to make sure I don't miss anything important.&lt;br /&gt;&lt;br /&gt;What UI control would I use if I need to ask a question with answers "yes" or "no". First of all I think of checkboxes. These guys decided to use comboboxes with three options: yes, no and empty (default). I guess they did this because they wanted to make sure the user chooses something and don't skip the question by mistake. Well, this point makes sense but obviously it's not user friendly.&lt;br /&gt;&lt;br /&gt;Every region in Russia has a number. So, Irkutsk where I'm located is 38. How many people knows this number and how many people think about the number where they are asked about their region? I'm pretty sure if you have a car then you know the number (because the car number contains a region number). But I'm not sure your answer would be 38 if you were asked about the region you are located. What do I say this for? They have a combobox with options like "38 - Irkutsk region". What do I do when I want to choose my region from list of options? I focus it and start typing "Irk" and etc and expect that I choose the Irkutsk region. Yep, that doesn't happen because they used numbers as prefixes. I run through all options and find a needed one and only then I understand what all these number mean and why I wasn't able to find Irkutsk by typing.&lt;br /&gt;&lt;br /&gt;Ok, let's move next. I was asked to point all jobs I had (period, company name, job title, address). They provided a button "add item", by clicking it the new row appears and you can describe next job. They provide neither button "remove item" nor UI to change items order. But I was lucky and typed everything correct.&lt;br /&gt;&lt;br /&gt;Finally I reached the form end. I didn't attached my picture yet but clicked on checkbox "Sign the form", I guess that should be similar to the statement "all information I pointed above is true".&amp;nbsp; But to all appearances it wasn't right guess because I've got an alert message saying that I can sign the form in Internet Explorer browser 6.0 or higher only. I'm Firefox user. I'm Mac user. I don't have IE. I hung for a couple minutes thinking in pretty warm way of site developers. And then I saw the last-hope button "save the form on your computer", I clicked it. The form was cleared and I didn't noticed anything else. Firefox downloads dialog doesn't have anything downloaded. Downloads folder is empty.&lt;br /&gt;&lt;br /&gt;I think it's too much for me to repeat these steps today if I find IE 6.0 or higher. I'll fill up the form next time.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/564396784419613484-3269178586982375348?l=asurkov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://asurkov.blogspot.com/feeds/3269178586982375348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://asurkov.blogspot.com/2011/05/travel-passport-online-in-russia.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/3269178586982375348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/3269178586982375348'/><link rel='alternate' type='text/html' href='http://asurkov.blogspot.com/2011/05/travel-passport-online-in-russia.html' title='Travel passport online in Russia!'/><author><name>Alex Surkov</name><uri>http://www.blogger.com/profile/05042790799045807105</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-564396784419613484.post-8408227225797186433</id><published>2011-03-29T04:53:00.000-07:00</published><updated>2011-11-24T06:51:46.007-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='a11y'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox-for-AT'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Firefox 4 for AT developers</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Finally Firefox 4 was released (and finally I finished this post). Marco &lt;a href="http://www.marcozehe.de/2011/03/22/firefox-4-is-here/"&gt;gave&lt;/a&gt;  an overview of new accessibility features from user and web developers  perspective. I want to tell about technical side, what's new in Firefox 4  for AT developers.&lt;br /&gt;&lt;br /&gt;This post doesn't cover all changes introduced in  Firefox 4 that may be interesting for AT developers since it's really  big area for one blog post. Really, Firefox 4 was developed more than 1.5 year. Near 400 accessibility bugs  were fixed. The code is much different than Gecko 1.9.2 (Firefox 3.6)  and I don't lie if say more than third of a11y code was changed,  redesigned and reworked.&lt;br /&gt;&lt;br /&gt;The primary propose of this post is to overview the changes in implementation of &lt;a href="http://library.gnome.org/devel/atk/stable/"&gt;ATK&lt;/a&gt; and &lt;a href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/"&gt;IAccessible2&lt;/a&gt; APIs and  highlight important features that come from "under the hood" work.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Performance improvements&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tree traversal.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The accessible tree traversal methods are much faster.&lt;br /&gt;&lt;br /&gt;Child by index:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ATK: &lt;a class="link" href="http://library.gnome.org/devel/atk/stable/AtkObject.html#atk-object-ref-accessible-child" title="atk_object_ref_accessible_child ()"&gt;atk_object_ref_accessible_child&lt;/a&gt;&lt;/li&gt;&lt;li&gt; MSAA: &lt;a href="http://msdn.microsoft.com/en-us/library/dd318475.aspx"&gt;get_accChild &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Children count:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt; ATK: &lt;a class="link" href="http://library.gnome.org/devel/atk/stable/AtkObject.html#atk-object-get-n-accessible-children" title="atk_object_get_n_accessible_children"&gt;atk_object_get_n_accessible_children&lt;/a&gt;&lt;/li&gt;&lt;li&gt; MSAA: &lt;a href="http://msdn.microsoft.com/en-us/library/dd318476.aspx"&gt;get_accChildCount&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;Index of the child in parent:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt; ATK: &lt;a class="link" href="http://library.gnome.org/devel/atk/stable/AtkObject.html#atk-object-get-index-in-parent" title="atk_object_get_index_in_parent ()"&gt;atk_object_get_index_in_parent&lt;/a&gt;&lt;/li&gt;&lt;li&gt; IA2: &lt;a href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/interface_i_accessible2.html#bb15435b93ce645afdb5eccf0fec5365"&gt;indexInParent&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;Methods implementation depends on platform and thus the speed of  the first call varies. On Windows all necessary data is calculated when  accessible tree is created, thus method evaluation is always o(1). On  Linux the data is cached on demand in some cases, so when method is  called for the first time then it can take o(n). The second time it'll  be o(1) too. The difference lies in discrepancy between accessible trees  on Windows and Linux.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Relations.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Relation calculation is much faster now. That concerns to relations  defined by ARIA and native markups both. There are cases when relations  from native markup are more complex than o(1) but no heavy tree  traversals anymore.&lt;br /&gt;&lt;br /&gt;It's time to start to use &lt;a href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/interface_i_accessible2.html"&gt;IAccessbile2&lt;/a&gt; relation methods over MSAA's &lt;a href="http://msdn.microsoft.com/en-us/library/dd318473.aspx"&gt;accNavigate&lt;/a&gt; extension of Firefox if you need multiple relation  targets. Of course getting all relations is slower than accNavigate but  it shouldn't be a bottleneck.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Group position.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Group position is supplied by:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ATK: &lt;a class="link" href="http://library.gnome.org/devel/atk/stable/AtkObject.html#atk-object-get-attributes" title="atk_object_get_attributes ()"&gt;atk_object_get_attributes&lt;/a&gt;, 'level', 'posinset', 'setsize' object attributes&lt;/li&gt;&lt;li&gt;IA2: &lt;a href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/interface_i_accessible2.html#94d4d84e000ef2fa3f2abf1148779941"&gt;groupPosition&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Group position calculation is smart for most cases. If you request  group position for every item in the set then it takes o(n) now, while it took o(n^2) in Firefox 3.6. However there are a few cases where Firefox 4 is not optimal.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Text/Hyperlink/Hypertext interfaces.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Implementation of the following methods shares the same cached data. So  the first call of any method calculates the data that is associated with the given hypertext  accessible. Performance of the fist call is o(n), where n is a child index pointed by  given offset. All s&lt;span class="short_text" id="result_box" lang="en"&gt;&lt;span class="hps" title="Click for alternate translations"&gt;ubsequent&lt;/span&gt;&lt;/span&gt;  calls deals with the cached data until the accessible tree mutates.  When tree was altered then cache is cleared and will be constructed  again on demand. Firefox 3.6 performance is o(n) and permanent what may  be a bottleneck under certain circumstances, e.g. when AT collect  information for every hyperlink.&lt;br /&gt;&lt;br /&gt;The following methods take o(1) when data is cached.&lt;br /&gt;&lt;br /&gt;Character count:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ATK: &lt;a class="link" href="http://library.gnome.org/devel/atk/stable/AtkText.html#atk-text-get-character-count" title="atk_text_get_character_count ()"&gt;atk_text_get_character_count&lt;/a&gt;&lt;/li&gt;&lt;li&gt;IA2: &lt;a href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/interface_i_accessible_text.html#ed43718add41e541ab3c30c9e4ad36be"&gt;nCharacters&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Hyperlink start and end offsets:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ATK: &lt;a class="link" href="http://library.gnome.org/devel/atk/stable/AtkHyperlink.html#atk-hyperlink-get-start-index" title="atk_hyperlink_get_start_index ()"&gt;atk_hyperlink_get_start_index&lt;/a&gt; and &lt;a class="link" href="http://library.gnome.org/devel/atk/stable/AtkHyperlink.html#atk-hyperlink-get-end-index" title="atk_hyperlink_get_end_index ()"&gt;atk_hyperlink_get_end_index&lt;/a&gt; &lt;/li&gt;&lt;li&gt;IA2: &lt;a href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/interface_i_accessible_hyperlink.html#1348351c5a5ad3adcec1a2e86c40d533"&gt;startIndex&lt;/a&gt; and &lt;a href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/interface_i_accessible_hyperlink.html#7008e8f6422e75212eacbff8554cec00"&gt;endIndex&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;Hyperlink count:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ATK: &lt;a class="link" href="http://library.gnome.org/devel/atk/stable/AtkHypertext.html#atk-hypertext-get-n-links" title="atk_hypertext_get_n_links ()"&gt;atk_hypertext_get_n_links&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;IA2: &lt;a href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/interface_i_accessible_hypertext.html#85634fbacd96e4d8f42431ce22ebb420"&gt;nHyperlinks&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;Hyperlink by index:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ATK: &lt;a class="link" href="http://library.gnome.org/devel/atk/stable/AtkHypertext.html#atk-hypertext-get-link" title="atk_hypertext_get_link ()"&gt;atk_hypertext_get_link&lt;/a&gt;&lt;/li&gt;&lt;li&gt;IA2: &lt;a href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/interface_i_accessible_hypertext.html#a2bd890f9fcb0a2fbb7b38fc7be345cc"&gt;hyperlink&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The following methods take o(log n) when data is cached.&lt;br /&gt;&lt;br /&gt;Text between offsets:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ATK: &lt;a href="http://library.gnome.org/devel/atk/stable/AtkText.html#atk-text-get-text"&gt;atk_text_get_text&lt;/a&gt;&lt;/li&gt;&lt;li&gt;IA2: &lt;a href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/interface_i_accessible_text.html#84497731096e4563e28a191a46086725"&gt;text&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Character at/before/after offset:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ATK: &lt;a class="link" href="http://library.gnome.org/devel/atk/stable/AtkText.html#atk-text-get-text-at-offset" title="atk_text_get_text_at_offset ()"&gt;atk_text_get_text_at_offset&lt;/a&gt;,&lt;a class="link" href="http://library.gnome.org/devel/atk/stable/AtkText.html#atk-text-get-text-after-offset" title="atk_text_get_text_after_offset ()"&gt; atk_text_get_text_after_offset&lt;/a&gt; and &lt;a class="link" href="http://library.gnome.org/devel/atk/stable/AtkText.html#atk-text-get-text-before-offset" title="atk_text_get_text_before_offset ()"&gt;atk_text_get_text_before_offset&lt;/a&gt; for ATK_TEXT_BOUNDARY_CHAR&lt;/li&gt;&lt;li&gt;IA2: &lt;a class="el" href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/interface_i_accessible_text.html#9bd84b099ac7ce2435280549e90c8827"&gt;textAtOffset&lt;/a&gt;, &lt;a class="el" href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/interface_i_accessible_text.html#34af8ca28848fdc81851cb5ac51486c6"&gt;textAfterOffset&lt;/a&gt; and &lt;a class="el" href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/interface_i_accessible_text.html#433f3acd436ddbcc76ed0b712b13961f"&gt;textBeforeOffset&lt;/a&gt; for &lt;a class="el" href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/_accessible_text_8idl.html#d3da05c9bed9f44b1e52eb4adb2924f65b1c4aacc1ed49164b8c9cd0610f6fa9"&gt;IA2_TEXT_BOUNDARY_CHAR&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Hyperlink at offset:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;ATK: &lt;a class="link" href="http://library.gnome.org/devel/atk/stable/AtkHypertext.html#atk-hypertext-get-link-index" title="atk_hypertext_get_link_index ()"&gt;atk_hypertext_get_link_index&lt;/a&gt;&lt;/li&gt;&lt;li&gt;IA2: &lt;a href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/interface_i_accessible_hypertext.html#7fa6ce00d98774228e6238097fea4fbf"&gt;hyperlinkIndex&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Redesigned processing of web pages&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lazy tree construction.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Firefox doesn't update accessible tree immediately when the page    mutates, it happens asynchronously always. So JS scripts that  mutates the DOM heavily can't   block UI.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Correct tree.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Firefox 4 got more powerful logic to create accessible tree so that tree creation is performed in unified way. Most discoverable result of the new logic is:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;CSS generated content is exposed (CSS :before and :after pseudo-elements)&lt;/li&gt;&lt;li&gt;no DOM text nodes that don't have rendered text are in tree&lt;/li&gt;&lt;li&gt;nested CSS visibility props are handled correctly (for example, the case when hidden contains visible children)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Tree update.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The accessible tree update process is much more robust. Firefox 3.6 had lot of cases when accessible tree wasn't updated properly and therefore  Gecko tried to fix it when related information is requested by AT. Correct fix wasn't always possible and led to broken tree (i.e.  parent to child and child to parent navigation wasn't consistent) on a case by case basis. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mutation events.&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Another advantage of new tree update logic is mutation events are fired always  and don't get lost because of tree update logic gaps. In the other words  AT can trust the mutation events to update their cache:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;MSAA: EVENT_OBJECT_REORDER, EVENT_OBJECT_SHOW and EVENT_OBJECT_HIDE&lt;/li&gt;&lt;li&gt;ATK: children_chnaged::add and children_changed::remove events.&lt;/li&gt;&lt;/ul&gt;A note for AT developers on Windows: it's time to consider  seriously whether to use show/hide events instead the reorder event. It  may be more performant to update accessibles that were added or removed  rather than update all child accessibles of the parent the reorder event  is delivered for.&lt;br /&gt;&lt;br /&gt;Firefox 4 has much smarter event coalescence  algorithm that it was, dupe mutation  events is not wide case anymore so AT developers can stop the own  coalescence and rely on Firefox. It will make AT faster when  page is altered in several unrelated places.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Event dispatching.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Firefox 4 practices async event dispatching. The tree can be changed  before event is fired. So hide event is delivered for the accessible  that is not in tree and text remove events are delivered when text is  removed already.&lt;br /&gt;&lt;br /&gt;The new design lead to a problem with text removed events on ATK. There  are ongoing changes both on Gecko and ATK side. To all appearances the  next Firefox and Gnome will get the fix.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Text interface changes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Except the performance improvements introduced in text interface  implementation that were said above there are few things worth to mention.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Text attributes.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The text attributes computation algorithm was modified. The range gets splitted by embedded characters, embedded characters are combined into  one range. Opposite to Firefox 4 the Firefox 3.6 looks into embedded  characters and break a range iff style is changed.&lt;br /&gt;&lt;br /&gt;The following example can illustrate new algorithm:&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;&amp;lt;img&amp;gt;plain&amp;lt;img&amp;gt;plain&amp;lt;img&amp;gt;&amp;lt;img&amp;gt;&amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt;&amp;lt;img&amp;gt;&amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt;&amp;lt;img&amp;gt;&lt;/div&gt;&lt;br /&gt;The text attributes ranges can be presented by notation:&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;[*)[plain)[*)[plain)[**)[bold)[*)[bold)[*)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;* - embedded character, used for image accessible&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;plain - text without formatting&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;bold - text with altered text weight&lt;/div&gt;&lt;br /&gt;&lt;b&gt;List bullets.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Firefox 4 uses Unicode characters for unordered HTML list bullets depending on bullet type. Firefox 3.6 used the unique '&lt;span id="the-code"&gt;0x2022' character for disc, square and circle list style types.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Polished IAccessibleTable2 implementation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Firefox  3.6 got implementation of &lt;a href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/interface_i_accessible_table2.html"&gt; IAccessibleTable2&lt;/a&gt; and &lt;a href="http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/interface_i_accessible_table_cell.html"&gt;IAccessibleTableCell&lt;/a&gt; interfaces, but not all changes were ready for  Firefox 3.6. Firefox 4  gained near complete table support. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Windows hierarchy changes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Shortly the windows hierarchy in Firefox 4 is quite different than in Firefox 3.6. You can read about consequences of this change and approaches how to deal with new hierarchy in &lt;a href="http://mindforks.blogspot.com/2010/09/firefox-4-beta-at-vender-relief.html"&gt;David's&lt;/a&gt; blog post.&lt;br /&gt;&lt;br /&gt;For the reference hierarchies are the following.&lt;br /&gt;&lt;br /&gt;The Firefox 3.6 hierarchy:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;MozillaUIWindowClass - main window, contains titlebar&lt;/li&gt;&lt;ul&gt;&lt;li&gt; MozillaWindowClass - Firefox window&lt;/li&gt;&lt;ul&gt;&lt;li&gt;MozillaContentWindowClass - window for tab document&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&amp;nbsp;Firefox 4 hierarchy:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;MozillaWindowClass&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/564396784419613484-8408227225797186433?l=asurkov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://asurkov.blogspot.com/feeds/8408227225797186433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://asurkov.blogspot.com/2011/03/firefox-4-for-at-developers.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/8408227225797186433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/564396784419613484/posts/default/8408227225797186433'/><link rel='alternate' type='text/html' href='http://asurkov.blogspot.com/2011/03/firefox-4-for-at-developers.html' title='Firefox 4 for AT developers'/><author><name>Alex Surkov</name><uri>http://www.blogger.com/profile/05042790799045807105</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
