转载,请注明出处!
Accessibility的全称是Microsoft Active Accessibility,是windows平台实现的一套技术。这套技术实现的效果是:允许某进程查询、操作另一进程的UI元素。WebKit引擎也实现了这套理念:允许应用查询、操作Render树。
Accessibility Framework有重要的2个子组件。1)Accessibility对象,即实现了IAccessible接口的对象。WebKit定义了3个类AccessibleBase、AccessibleDocument、AccessibleImage,这三个类实现了接口IAccessible。2)获得Accessibility对象的方法。WebKit也提供了获得IAccessible对象的方法。如下代码:
HRESULT hr = WebKitCreateInstance(CLSID_WebFrame, 0, IID_IWebFrame, pOut);
if (FAILED(hr))
goto exit;
COMPtr<IAccessible> renderTRoot = pOut->accessible()
renderTRoot是Render树根对应的Accessibility对象。
WebCore:: AXObjectCache类负责创建、维护Accessible对象树。在Render树创建完成后,Document对象会执行AXObjectCache:: getOrCreate(RenderTRoot)创建Render树根的Accessible对象。注意,此时之创建了Render树根的Accessible对象,而非所有Render结点的Accessible对象。Render树其余结点的Accessible对象是按需创建的,只有被请求才会被创建。如下代码:
int cnt = 0;
HRESULT rc = renderTRoot->get_accChildCount(&cnt);
执行这行代码之后,Render树其余节点的Accessible对象才会被创建。AXObjectCache会将所有的Accessible对象存储于HashMap中。HashMap的定义为:
HashMap<AXID, RefPtr<AccessibilityObject> > m_objects;
如此,只要知道了Accessiblity对象的id,那么就可以快速找到Accessibility对象。