We need to investigate this. An <iframe> could represent an AJAX widget. The author of the widget may have put in some ARIA, but the user of the widgets may also wish to set them (e.g. labelledby). Possibly the properties should be combined or the outer properties should override the inner properties.
Testcase of a listbox using an iframe: http://www.mozilla.org/access/dhtml/listbox-in-iframe Rules for dealing with iframes: http://developer.mozilla.org/en/docs/ARIA_UA_Best_Practices#11.3.17_Documents.2C_Handling_.3Cframe.3Es_and_.3Ciframe.3Es
Created attachment 308684 [details] [diff] [review] WIP Feedback on the rules I'm implementing would be great -- section 11.3.17 at: http://developer.mozilla.org/en/docs/ARIA_UA_Best_Practices#11.3.17_Documents.2C_Handling_.3Cframe.3Es_and_.3Ciframe.3Es
In addition the listbox ends up in the tab order twice -- I need to work on that in a separate bug.
Created attachment 308937 [details] [diff] [review] Described in comment Changes by file: Index: accessible/public/nsPIAccessible.idl Add getARIAState() so that we can independently override built-in states after they have been calculated. First we will use the states from the <body> and then from the owner node on the outer doc. Index: accessible/src/base/nsAccessibilityService.cpp Use the ARIA role for document nodes Index: accessible/src/base/nsAccessibilityUtils.cpp New method to set container-foo object attributes appropriately for a parent chain within a single document. Index: accessible/src/base/nsAccessible.cpp 1) GetRoleContent() -- only use <body>/<frameset> for HTML -- never the doc element 2) GetAttributes() -- allow array of preexisting attributes to be passed in as a starting point so that we can override doc accessible object attributes with that from frame/iframe. 3) GetAttributesInternal() -- move GetLastEventAttributes() here. It doesn't need to be calculated twice. Also move container-foo object attribute calc here. We need special rules to deal with full parent chain, because outer docs override. Within the same doc inner nodes override. 4) GetARIAState() -- pass in previous state so we can modify and override states Index: accessible/src/base/nsDocAccessible.cpp 1) GetName() -- Prefer name from outer node 2) GetValue() -- this is an MSAA hack -- move to MSAA code 3) SetRoleMapEntry() -- prefer role from outer node 4) GetDescription() -- prefer from outer node 5) GetARIAState() -- prefer ARIA state from outer node 6) GetAttributes() -- prefer ARIA object props from outer node 7) Init() -- ensure creation of parent and don't restrict role used by iframe Index: accessible/src/base/nsOuterDocAccessible.cpp Override GetAttributesInternal() so that only ARIA attributes done in nsAccessible::GetAttributes() get overriden Index: accessible/src/base/nsRootAccessible.cpp Allow aria-activedescendant on <body> Index: accessible/src/msaa/nsAccessibleWrap.cpp Return NULL and PR_FALSE if no value. This is what IE does -- we have that wrong. Index: accessible/src/msaa/nsDocAccessibleWrap.cpp Check for actual accessible value. If no value and we're some kind of doc, then use URL value hack.
Created attachment 309171 [details] [diff] [review] Updated to trunk, otherwise the same.
Created attachment 309182 [details] [diff] [review] 1)Move class object attr impl so doc can have it's own, 2) Fix DOCUMENT -> DIALOG in nsDocAccessibleWrap::get_accValue()
Comment on attachment 309182 [details] [diff] [review] 1)Move class object attr impl so doc can have it's own, 2) Fix DOCUMENT -> DIALOG in nsDocAccessibleWrap::get_accValue() a1.9+=damons