WebPageAccessibilityObject.cpp [plain text]
#include "config.h"
#include "WebPageAccessibilityObject.h"
#include "WebPage.h"
#include <WebCore/AXObjectCache.h>
#include <WebCore/Frame.h>
#include <WebCore/Page.h>
using namespace WebKit;
using namespace WebCore;
G_DEFINE_TYPE(WebPageAccessibilityObject, web_page_accessibility_object, ATK_TYPE_PLUG)
static AtkObject* accessibilityRootObjectWrapper(AtkObject* atkObject)
{
if (!AXObjectCache::accessibilityEnabled())
AXObjectCache::enableAccessibility();
WebPageAccessibilityObject* accessible = WEB_PAGE_ACCESSIBILITY_OBJECT(atkObject);
if (!accessible->m_page)
return 0;
Page* page = accessible->m_page->corePage();
if (!page)
return 0;
Frame* core = page->mainFrame();
if (!core || !core->document())
return 0;
AccessibilityObject* root = core->document()->axObjectCache()->rootObject();
if (!root)
return 0;
AtkObject* axRoot = root->wrapper();
if (!axRoot || !ATK_IS_OBJECT(axRoot))
return 0;
return axRoot;
}
static void webPageAccessibilityObjectInitialize(AtkObject* atkObject, gpointer data)
{
if (ATK_OBJECT_CLASS(web_page_accessibility_object_parent_class)->initialize)
ATK_OBJECT_CLASS(web_page_accessibility_object_parent_class)->initialize(atkObject, data);
WEB_PAGE_ACCESSIBILITY_OBJECT(atkObject)->m_page = reinterpret_cast<WebPage*>(data);
atk_object_set_role(atkObject, ATK_ROLE_FILLER);
}
static gint webPageAccessibilityObjectGetIndexInParent(AtkObject *atkObject)
{
return 0;
}
static gint webPageAccessibilityObjectGetNChildren(AtkObject* atkObject)
{
AtkObject* rootObject = accessibilityRootObjectWrapper(atkObject);
if (!rootObject)
return 0;
return 1;
}
static AtkObject* webPageAccessibilityObjectRefChild(AtkObject* atkObject, gint index)
{
if (index && index != 1)
return 0;
AtkObject* rootObject = accessibilityRootObjectWrapper(atkObject);
if (!rootObject)
return 0;
atk_object_set_parent(rootObject, atkObject);
g_object_ref(rootObject);
return rootObject;
}
static void web_page_accessibility_object_init(WebPageAccessibilityObject* accessible)
{
}
static void web_page_accessibility_object_class_init(WebPageAccessibilityObjectClass* klass)
{
AtkObjectClass* atkObjectClass = ATK_OBJECT_CLASS(klass);
atkObjectClass->initialize = webPageAccessibilityObjectInitialize;
atkObjectClass->get_index_in_parent = webPageAccessibilityObjectGetIndexInParent;
atkObjectClass->get_n_children = webPageAccessibilityObjectGetNChildren;
atkObjectClass->ref_child = webPageAccessibilityObjectRefChild;
}
WebPageAccessibilityObject* webPageAccessibilityObjectNew(WebPage* page)
{
AtkObject* object = ATK_OBJECT(g_object_new(WEB_TYPE_PAGE_ACCESSIBILITY_OBJECT, NULL));
atk_object_initialize(object, page);
return WEB_PAGE_ACCESSIBILITY_OBJECT(object);
}
void webPageAccessibilityObjectRefresh(WebPageAccessibilityObject* accessible)
{
AtkObject* rootObject = accessibilityRootObjectWrapper(ATK_OBJECT(accessible));
if (!rootObject)
return;
atk_object_set_parent(rootObject, ATK_OBJECT(accessible));
}