Index: Source/modules/accessibility/AXObjectCacheImpl.cpp |
diff --git a/Source/modules/accessibility/AXObjectCacheImpl.cpp b/Source/modules/accessibility/AXObjectCacheImpl.cpp |
index a17b75167db5f827637e0a16f3a91891736c9e7d..720c601a95ddca028e25398e2a325e31d7bb5835 100644 |
--- a/Source/modules/accessibility/AXObjectCacheImpl.cpp |
+++ b/Source/modules/accessibility/AXObjectCacheImpl.cpp |
@@ -177,60 +177,83 @@ AXObject* AXObjectCacheImpl::focusedUIElementForPage(const Page* page) |
AXObject* AXObjectCacheImpl::get(Widget* widget) |
{ |
+ fprintf(stderr, "AXObjectCacheImpl.get(widget)\n"); |
if (!widget) |
return 0; |
+ fprintf(stderr, "about to call m_widgetObjectMapping(%p)\n", widget); |
AXID axID = m_widgetObjectMapping.get(widget); |
ASSERT(!HashTraits<AXID>::isDeletedValue(axID)); |
if (!axID) |
return 0; |
+ fprintf(stderr, "about to call m_objects.get(%d)\n", axID); |
return m_objects.get(axID); |
} |
AXObject* AXObjectCacheImpl::get(RenderObject* renderer) |
{ |
+ fprintf(stderr, "AXObjectCacheImpl::get(renderer)\n"); |
if (!renderer) |
return 0; |
+ fprintf(stderr, "about to call m_renderObjectMapping.get(%p)\n", renderer); |
AXID axID = m_renderObjectMapping.get(renderer); |
ASSERT(!HashTraits<AXID>::isDeletedValue(axID)); |
if (!axID) |
return 0; |
+ fprintf(stderr, "about to call m_objects.get(%d)\n", axID); |
return m_objects.get(axID); |
} |
AXObject* AXObjectCacheImpl::get(Node* node) |
{ |
+ fprintf(stderr, "AXObjectCacheImpl.get(node)\n"); |
if (!node) |
return 0; |
+ fprintf(stderr, "about to call m_renderObjectMapping(%p)\n", node->renderer()); |
AXID renderID = node->renderer() ? m_renderObjectMapping.get(node->renderer()) : 0; |
+ fprintf(stderr, "got renderID: %d\n", renderID); |
ASSERT(!HashTraits<AXID>::isDeletedValue(renderID)); |
+ fprintf(stderr, "about to call m_nodeObjectMapping(%p)\n", node); |
AXID nodeID = m_nodeObjectMapping.get(node); |
+ fprintf(stderr, "got nodeID %d\n", nodeID); |
ASSERT(!HashTraits<AXID>::isDeletedValue(nodeID)); |
+ fprintf(stderr, "Assert passed\n"); |
if (node->renderer() && nodeID && !renderID) { |
+ fprintf(stderr, "about to call remove(%d)\n", nodeID); |
// This can happen if an AXNodeObject is created for a node that's not |
// rendered, but later something changes and it gets a renderer (like if it's |
// reparented). |
remove(nodeID); |
return 0; |
+ } else { |
+ fprintf(stderr, "not removing nodeID\n"); |
} |
- if (renderID) |
+ if (renderID) { |
+ fprintf(stderr, "about to call m_objects.get(%d)\n", renderID); |
return m_objects.get(renderID); |
+ } |
+ fprintf(stderr, "%d was false\n", renderID); |
- if (!nodeID) |
+ if (!nodeID) { |
+ fprintf(stderr, "returning 0\n"); |
return 0; |
+ } |
+ fprintf(stderr, "!%d was false\n", nodeID); |
+ fprintf(stderr, "about to call m_objects.get(%d)\n", nodeID); |
return m_objects.get(nodeID); |
} |
AXObject* AXObjectCacheImpl::get(AbstractInlineTextBox* inlineTextBox) |
{ |
+ fprintf(stderr, "get(AbstractInlineTextBox)\n"); |
if (!inlineTextBox) |
return 0; |
@@ -252,7 +275,7 @@ bool nodeHasRole(Node* node, const String& role) |
return equalIgnoringCase(toElement(node)->getAttribute(roleAttr), role); |
} |
-static PassRefPtr<AXObject> createFromRenderer(RenderObject* renderer) |
+PassRefPtr<AXObject> AXObjectCacheImpl::createFromRenderer(RenderObject* renderer) |
{ |
// FIXME: How could renderer->node() ever not be an Element? |
Node* node = renderer->node(); |
@@ -261,61 +284,61 @@ static PassRefPtr<AXObject> createFromRenderer(RenderObject* renderer) |
// ul/ol/dl type (it shouldn't be a list if aria says otherwise). |
if (node && ((nodeHasRole(node, "list") || nodeHasRole(node, "directory")) |
|| (nodeHasRole(node, nullAtom) && (isHTMLUListElement(*node) || isHTMLOListElement(*node) || isHTMLDListElement(*node))))) |
- return AXList::create(renderer); |
+ return AXList::create(renderer, this); |
// aria tables |
if (nodeHasRole(node, "grid") || nodeHasRole(node, "treegrid")) |
- return AXARIAGrid::create(renderer); |
+ return AXARIAGrid::create(renderer, this); |
if (nodeHasRole(node, "row")) |
- return AXARIAGridRow::create(renderer); |
+ return AXARIAGridRow::create(renderer, this); |
if (nodeHasRole(node, "gridcell") || nodeHasRole(node, "columnheader") || nodeHasRole(node, "rowheader")) |
- return AXARIAGridCell::create(renderer); |
+ return AXARIAGridCell::create(renderer, this); |
// media controls |
if (node && node->isMediaControlElement()) |
- return AccessibilityMediaControl::create(renderer); |
+ return AccessibilityMediaControl::create(renderer, this); |
if (isHTMLOptionElement(node)) |
- return AXListBoxOption::create(renderer); |
+ return AXListBoxOption::create(renderer, this); |
if (renderer->isSVGRoot()) |
- return AXSVGRoot::create(renderer); |
+ return AXSVGRoot::create(renderer, this); |
if (renderer->isBoxModelObject()) { |
RenderBoxModelObject* cssBox = toRenderBoxModelObject(renderer); |
if (cssBox->isListBox()) |
- return AXListBox::create(toRenderListBox(cssBox)); |
+ return AXListBox::create(toRenderListBox(cssBox), this); |
if (cssBox->isMenuList()) |
- return AXMenuList::create(toRenderMenuList(cssBox)); |
+ return AXMenuList::create(toRenderMenuList(cssBox), this); |
// standard tables |
if (cssBox->isTable()) |
- return AXTable::create(toRenderTable(cssBox)); |
+ return AXTable::create(toRenderTable(cssBox), this); |
if (cssBox->isTableRow()) |
- return AXTableRow::create(toRenderTableRow(cssBox)); |
+ return AXTableRow::create(toRenderTableRow(cssBox), this); |
if (cssBox->isTableCell()) |
- return AXTableCell::create(toRenderTableCell(cssBox)); |
+ return AXTableCell::create(toRenderTableCell(cssBox), this); |
// progress bar |
if (cssBox->isProgress()) |
- return AXProgressIndicator::create(toRenderProgress(cssBox)); |
+ return AXProgressIndicator::create(toRenderProgress(cssBox), this); |
// input type=range |
if (cssBox->isSlider()) |
- return AXSlider::create(toRenderSlider(cssBox)); |
+ return AXSlider::create(toRenderSlider(cssBox), this); |
} |
- return AXRenderObject::create(renderer); |
+ return AXRenderObject::create(renderer, this); |
} |
-static PassRefPtr<AXObject> createFromNode(Node* node) |
+PassRefPtr<AXObject> AXObjectCacheImpl::createFromNode(Node* node) |
{ |
- return AXNodeObject::create(node); |
+ return AXNodeObject::create(node, this); |
} |
-static PassRefPtr<AXObject> createFromInlineTextBox(AbstractInlineTextBox* inlineTextBox) |
+PassRefPtr<AXObject> AXObjectCacheImpl::createFromInlineTextBox(AbstractInlineTextBox* inlineTextBox) |
{ |
- return AXInlineTextBox::create(inlineTextBox); |
+ return AXInlineTextBox::create(inlineTextBox, this); |
} |
AXObject* AXObjectCacheImpl::getOrCreate(Widget* widget) |
@@ -328,9 +351,9 @@ AXObject* AXObjectCacheImpl::getOrCreate(Widget* widget) |
RefPtr<AXObject> newObj = nullptr; |
if (widget->isFrameView()) |
- newObj = AXScrollView::create(toFrameView(widget)); |
+ newObj = AXScrollView::create(toFrameView(widget), this); |
else if (widget->isScrollbar()) |
- newObj = AXScrollbar::create(toScrollbar(widget)); |
+ newObj = AXScrollbar::create(toScrollbar(widget), this); |
// Will crash later if we have two objects for the same widget. |
ASSERT(!get(widget)); |
@@ -356,8 +379,13 @@ AXObject* AXObjectCacheImpl::getOrCreate(Node* node) |
if (AXObject* obj = get(node)) |
return obj; |
- if (node->renderer()) |
+ fprintf(stderr, "get(node) returned nil\n"); |
+ |
+ if (node->renderer()) { |
+ fprintf(stderr, "calling getOrCreate(Renderer)\n"); |
return getOrCreate(node->renderer()); |
+ } |
+ fprintf(stderr, "renderer was null\n"); |
if (!node->parentElement()) |
return 0; |
@@ -445,28 +473,28 @@ AXObject* AXObjectCacheImpl::getOrCreate(AccessibilityRole role) |
// will be filled in... |
switch (role) { |
case ImageMapLinkRole: |
- obj = AXImageMapLink::create(); |
+ obj = AXImageMapLink::create(this); |
break; |
case ColumnRole: |
- obj = AXTableColumn::create(); |
+ obj = AXTableColumn::create(this); |
break; |
case TableHeaderContainerRole: |
- obj = AXTableHeaderContainer::create(); |
+ obj = AXTableHeaderContainer::create(this); |
break; |
case SliderThumbRole: |
- obj = AXSliderThumb::create(); |
+ obj = AXSliderThumb::create(this); |
break; |
case MenuListPopupRole: |
- obj = AXMenuListPopup::create(); |
+ obj = AXMenuListPopup::create(this); |
break; |
case MenuListOptionRole: |
- obj = AXMenuListOption::create(); |
+ obj = AXMenuListOption::create(this); |
break; |
case SpinButtonRole: |
- obj = AXSpinButton::create(); |
+ obj = AXSpinButton::create(this); |
break; |
case SpinButtonPartRole: |
- obj = AXSpinButtonPart::create(); |
+ obj = AXSpinButtonPart::create(this); |
break; |
default: |
obj = nullptr; |
@@ -1053,6 +1081,14 @@ void AXObjectCacheImpl::handleScrollPositionChanged(RenderObject* renderObject) |
postPlatformNotification(getOrCreate(renderObject), AXScrollPositionChanged); |
} |
+PublicAXObject* AXObjectCacheImpl::publicAXObjectForNode(Node* node) |
+{ |
+ fprintf(stderr, "publicAXObjectForNode(%p)\n", node); |
+ AXObject* obj = getOrCreate(node); |
+ fprintf(stderr, "Got AXObject %p\n", obj); |
+ return new PublicAXObjectImpl(obj); |
+} |
+ |
void AXObjectCacheImpl::setCanvasObjectBounds(Element* element, const LayoutRect& rect) |
{ |
AXObject* obj = getOrCreate(element); |
@@ -1062,4 +1098,32 @@ void AXObjectCacheImpl::setCanvasObjectBounds(Element* element, const LayoutRect |
obj->setElementRect(rect); |
} |
+PublicAXObjectImpl::PublicAXObjectImpl(AXObject* axObject) |
+ : m_object(axObject) |
+{ |
+ fprintf(stderr, "PublicAXObjectImpl constructor\n"); |
+} |
+ |
+PublicAXObjectImpl::~PublicAXObjectImpl() { } |
+ |
+const AtomicString& PublicAXObjectImpl::computedRole() |
+{ |
+ fprintf(stderr, "computedRole()\n"); |
+ if (!m_object) |
+ return AXObject::roleName(NoRole); |
+ |
+ AccessibilityRole role = m_object->roleValue(); |
+ return AXObject::roleName(role); |
+} |
+ |
+const String PublicAXObjectImpl::computedText() |
+{ |
+ fprintf(stderr, "publicaxobjectimpl::computedText()\n"); |
+ if (!m_object) { |
+ fprintf(stderr, "!m_object\n"); |
+ return ""; |
+ } |
+ return m_object->title(); |
+} |
+ |
} // namespace blink |