Accessibility/IA2 1.3

From MozillaWiki
Jump to navigation Jump to search

Summary

This page describes proposed changes to next IAccessible2 specification.

Proposal

Relations

Propose: a way to get relations by type

interface IAccessible2_2: public IAccessible
{
  /**
   * Return IEnumVariant of IAccessible2 objects for the given type.
   */
  [propget] HRESULT relationTargets
  (
    [in] BSTR type,
    [out, retval] IEnumVariant* relations
  );
};

See IA2 thread for discussion.

Object attribute

Propose: performant way to get object attribute value by name.

interface IAccessible2_2: public IAccessible
{
  [propget] HRESULT attribute
  (
    [in] BSTR name,
    [out, retval] BSTR* value
  );
};

See IA2 thread for discussion.

Text attributes

Propose: way to get range for list of text attributes.

interface IAccessibleText2 : public IAccessibleText
{
  /**
   * Return range (start and end offsets) and text attributes that corresponds
   * the given attributes filter (filter format: "attr1, attr2") at the given
   * offset.
   */
  [propget] HRESULT attributeRange
    (
     [in] long offset,
     [in] BSTR attributesFilter,
     [out] long *startOffset,
     [out] long *endOffset,	
     [out, retval] BSTR *textAttributes
    );
};


Hyperlinks from hypertext

Propose: performant way to iterate through hyper links

interface IAccessibleHypertext2 : public IAccessibleText
{
  /**
   * Return IEnumVariant of IAccessibleHyperlink objects.
   */
  [propget] HRESULT hyperlinks
  (
    [out, retval] IEnumVariant* hyperlinks
  );
};

See IA2 thread for discussion.

Caret offset and accessible containing the caret

Propose: performant way to get caret offset within direct hypertext accessible containing the caret.

interface IAccessible2_2 : public IAccessible2
{
  /**
   * Return hypertext accessible in subtree of the accessible and caret
   * offset within it.
   */
  [propget] HRESULT accessibleWithCaret
  (
    [out, retval] IUnknown **accessible,
    [out] long* caretOffset
  );
};

Note: AT should call the method on document accessible for performance reason.

See IA2 thread for discussion.

Anchor target

Propose: a way to get anchor target (#anchor URL) if any since AT may miss scrolling_start event due to various reasons.

interface IAccessibleDocument : public IAccessible2
{
  /**
   * Return anchor target if any and still valid.
   */
  [propget] HRESULT anchorTarget
  (
    [out, retval] IUnknown **accessible
  );
};

See bug 617544 for original propose.

Document accessible

Propose: performant way to get a document accessible (IAccessibleDocument) the given accessible resides in.

interface IAccessible2_2 : public IAccessible2
{
  /**
   * Return document accessible (IAccessibleDocument) containing the accessible.
   */
  [propget] HRESULT document
  (
    [out, retval] IUnknown **accessible
  );
};

New relation types

Propose: be compatible with ATK and for relation types symmetry.

/** This object is a parent of a target object. */
const WCHAR *const IA2_RELATION_NODE_PARENT_OF = L"nodeParentOf";

/** opposite to IA2_RELATION_MEMBER_OF (Pete's possible addition) */
const WCHAR *const IA2_RELATION_GROUPING_OBJECT_FOR  = L"groupingObjectFor";

/** opposite to IA2_RELATION_POPUP_INITIATOR_FOR (Pete's possible addition) */
const WCHAR *const IA2_RELATION_POPUP_INITIATOR_FOR  = L"popupInitiatorFor";

See IA2 thread for discussion.

Reorder event details

Propose: performant way to update virtual buffers.

typedef struct IA2ChildrenChange
{
  bool isInserted;
  long startIndex;
  long endIndex;
};

interface IAccessible2_2: public IAccessible2
{
  [propget] HRESULT childrenChange
  (
    [in] long maxChanges, 
    [out, size_is(maxChanges), length_is(*nChanges)]
      IA2ChildrenChange **relations, 
    [out, retval] long *nChanges
  )
};

Explicit name

Propose: let AT to ignore fallback names, i.e. names calculated from subtree of the object

interface IAccessible2_2 : public IAccessible2
{
  /**
   * Return accessible name pointed by author.
   */
  [propget] HRESULT explicitName
  (
    [out, retval] BSTR* name
  );
};

See bug 637578 for original idea.

Other ideas

Registry API

Note: IsWinEventHookInstalled may do all we need. See Mick's suggestion.

Propose: a way to enable set of features.

interface IAccessibleApplication2 : public IAccessibleApplication
{
  /**
   * Enable set of features. Return set of features that were enabled.
   */
  HRESULT requestFeature(
    [in] long features,
    [out] long supportedFeatures]
};

Initially proposed features:

  1. Events
    1. ShowHideEvents - fire show/hide events
    2. ReorderEvent - fire reorder event
    3. TextEvents - fire text inserted/deleted/modified events
    4. TableEvents - fire table events
    5. HyperlinkEvents - fire hyper link events
    6. HypertextEvents - fire hyper text events
  2. Interfaces (?)
    1. davidb: Alexander do you mean something like IAccessible2 or more granular? - alex: more granular
  3. Accessible Tree (?)
    1. davidb: Alexander, what did you mean here?

Server implementation: it's up to the server to define set of base features that's always enabled (e.g. focus events); others are considered as optional and should be enabled on request. In order not to break existing AT, the server should maintain a whitelist of ATs for which the current support is preserved.

See IA2 list for discussion.