There is a concern that IATable has a limitation of children being cells. Andres requested support for other structures such as the case where the children are rows which in turn have cells as children. There is production code relying on the current IDL. And compatibility with Linux is important. However the IDL should provide for the requested use case.
The accessible hierarchy needs to be traversable through MSAA's methods. There needs to be a natural hierarchy from table at the top and cells (or cell contents) at the bottom. The request is that rows could be intermediate accessible objects.
One concern is for the common case of a table which manages its children. One design is for the table to fire an "active decendant changed" event. Then the AT would need an IATable method to fetch the accessible of the changed child. IA2 does not have such a getter at this time. Another design is for the "transient" cell (or its contents, e.g. a PARAGRAPH) to fire a focus event. This is what is done in Firefox. Also, the Lotus Word Processor maps the UNO active decendant changed event fired by a table to a focus event fired on the cell (or its contents). If the AT needs to get to the table it can traverse up the tree past any intermediate ROW objects to the table.
If cells are not direct decendants of tables what should the following three methods return?
HRESULT childIndex ([in] long rowIndex,[in] long columnIndex,[out, retval] long *childIndex)
HRESULT columnIndex ([in] long childIndex,[out, retval] long *columnIndex)
HRESULT rowIndex ([in] long childIndex,[out, retval] long *rowIndex)
S_FALSE - The method succeeded in part. This happens when the method succeeds, but the requested information is not available. For example, Active Accessibility returns S_FALSE if you call IAccessible::accHitTest to retrieve a child object at a given point, and the specified point is not within the object or the object's child.
DISP_E_MEMBERNOTFOUND - The object does not support the requested property or action. For example, a push button returns this value if you request its Value property, since it does not have a Value property.
E_NOTIMPL - The method is not implemented. This value occurs when a client calls a method that is not yet supported in that operating system.
Based on that DISP_E_MEMBERNOTFOUND is the best fit. Is this acceptable?
What are the remaining issues that need to be discussed and resolved?
IAValue - Issue raised by Aaron
AT-SPI uses a double for the parameters. IA2 uses a VARIANT. The current thinking is that IA2 should be documented to indicate that the VARIANT should always be a double. There are two use cases related to conveying end user usable text related to the corresponding doubles that IAValue would return:
If there is a related string for any controller positions return it via get_accValue (MSAA convention). (On Linux use accessible name to provide an end user value and if the control is labeled use the labelledBy relation.)
If there is a related text area that changes (like the slider on the Privacy tab of Internet Options) use a controllerFor relation.
Is this acceptable?
IA2::relation/relations - Issue raised by Aaron.
Aaron has indicated that there is already a means in FF2 for fetching single relations via new nav constants for MSAA's accNavigate. If that is still acceptable we can stay with the current IA2 IDL. There is no performance issue in non-browsers so those apps don't need a means to fetch single relations.
Is using accNavigate with the new nav constants an acceptable solution?
Inspect tool - Mike Squillace
Eclipse - Barry Feigenbaum
Firefox - Aaron Leventhal
Proxy DLL - Pete Brunet
Info about how to create the proxy DLL needs to be published.
JAWS doesn't need it. But Window-Eyes does.
No progress last week
Waiting for IBM legal approval to release as BSD.
No progress last week.
Documentation of memory management issues for [out] parameters - the following need to be understood and documented.
No progress last week.
Here is a rough first draft:
BSTRs need to be SysFreeString'd at end of life; ditto for when they are in structs or arrays.
COM interfaces need to be AddRef'd when used and Release'd at end of life.
Single longs, HWNDs, booleans, and structs are allocated by the caller and passed by reference. The marshaller does all the memory management. (I don't believe there are any structs with BSTRs or interface pointers.)
Arrays of longs - the server allocates the top level array and anything it points to; nothing needs to be free'd by the client. The marshalling code handles freeing anything on the client side.
TBD: How are VARIANTs handled? Like interfaces? These methods return VARIANTs: IAHyperlink::anchor/anchorTarget, IAValue::current/maximum/minimumValue
TBD: Are arrays of IUnknowns, e.g. IARelation::targets, correctly specified as **IUnknown?