AXObjectCacheWin.cpp [plain text]
#include "config.h"
#include "AXObjectCache.h"
#include "AccessibilityObject.h"
#include "Document.h"
#include "Page.h"
#include <wtf/StdLibExtras.h>
using namespace std;
namespace WebCore {
static const String& AXScrolledToAnchor()
{
DEFINE_STATIC_LOCAL(const String, value, ("AXScrolledToAnchor"));
return value;
}
static const String& AXFocusedUIElementChanged()
{
DEFINE_STATIC_LOCAL(const String, value, ("AXFocusedUIElementChanged"));
return value;
}
void AXObjectCache::detachWrapper(AccessibilityObject* obj)
{
if (AccessibilityObjectWrapper* wrapper = obj->wrapper())
wrapper->detach();
}
void AXObjectCache::attachWrapper(AccessibilityObject*)
{
}
void AXObjectCache::postPlatformNotification(AccessibilityObject* obj, const String& notification)
{
if (!obj)
return;
Document* document = obj->document();
if (!document)
return;
Page* page = document->page();
if (!page || !page->chrome()->platformWindow())
return;
DWORD msaaEvent;
if (notification == AXScrolledToAnchor())
msaaEvent = EVENT_SYSTEM_SCROLLINGSTART;
else if (notification == AXFocusedUIElementChanged())
msaaEvent = EVENT_OBJECT_FOCUS;
else
return;
ASSERT(obj->axObjectID() >= 1);
ASSERT(obj->axObjectID() <= numeric_limits<LONG>::max());
NotifyWinEvent(msaaEvent, page->chrome()->platformWindow(), OBJID_CLIENT, -static_cast<LONG>(obj->axObjectID()));
}
AXID AXObjectCache::platformGenerateAXID() const
{
static AXID lastUsedID = 0;
AXID objID = lastUsedID;
do {
++objID;
objID %= std::numeric_limits<LONG>::max();
} while (objID == 0 || HashTraits<AXID>::isDeletedValue(objID) || m_idsInUse.contains(objID));
ASSERT(objID >= 1 && objID <= std::numeric_limits<LONG>::max());
lastUsedID = objID;
return objID;
}
void AXObjectCache::handleScrolledToAnchor(const Node* anchorNode)
{
postPlatformNotification(AccessibilityObject::firstAccessibleObjectFromNode(anchorNode), AXScrolledToAnchor());
}
void AXObjectCache::handleFocusedUIElementChanged()
{
Page* page = m_document->page();
if (!page || !page->chrome()->platformWindow())
return;
AccessibilityObject* focusedObject = focusedUIElementForPage(page);
if (!focusedObject)
return;
ASSERT(!focusedObject->accessibilityIsIgnored());
postPlatformNotification(focusedObject, AXFocusedUIElementChanged());
}
}