void TextFinder::reportFindInPageResultToAccessibility(int identifier) { if (!m_activeMatch) return; AXObjectCacheImpl* axObjectCache = toAXObjectCacheImpl( ownerFrame().frame()->document()->existingAXObjectCache()); if (!axObjectCache) return; AXObject* startObject = axObjectCache->get(m_activeMatch->startContainer()); AXObject* endObject = axObjectCache->get(m_activeMatch->endContainer()); if (!startObject || !endObject) return; // Notify the client of new text marker data. axObjectCache->postNotification( startObject, AXObjectCache::AXNotification::AXChildrenChanged); if (startObject != endObject) axObjectCache->postNotification( endObject, AXObjectCache::AXNotification::AXChildrenChanged); if (ownerFrame().client()) { ownerFrame().client()->handleAccessibilityFindInPageResult( identifier, m_activeMatchIndex + 1, WebAXObject(startObject), m_activeMatch->startOffset(), WebAXObject(endObject), m_activeMatch->endOffset()); } }
void InspectorAccessibilityAgent::getAXNode(ErrorString* errorString, int nodeId, RefPtr<AXNode>& accessibilityNode) { Frame* mainFrame = m_page->mainFrame(); if (!mainFrame->isLocalFrame()) { *errorString = "Can't inspect out of process frames yet"; return; } InspectorDOMAgent* domAgent = toLocalFrame(mainFrame)->instrumentingAgents()->inspectorDOMAgent(); if (!domAgent) { *errorString = "DOM agent must be enabled"; return; } Node* node = domAgent->assertNode(errorString, nodeId); if (!node) return; Document& document = node->document(); OwnPtr<ScopedAXObjectCache> cache = ScopedAXObjectCache::create(document); AXObjectCacheImpl* cacheImpl = toAXObjectCacheImpl(cache->get()); AXObject* axObject = cacheImpl->getOrCreate(node); if (!axObject || axObject->accessibilityIsIgnored()) { accessibilityNode = buildObjectForIgnoredNode(node, axObject, cacheImpl); return; } RefPtr<TypeBuilder::Array<AXProperty>> properties = TypeBuilder::Array<AXProperty>::create(); fillLiveRegionProperties(axObject, properties); fillGlobalStates(axObject, properties); fillWidgetProperties(axObject, properties); fillWidgetStates(axObject, properties); fillRelationships(axObject, properties); accessibilityNode = buildObjectForNode(node, axObject, cacheImpl, properties); }
WebAXObject WebDocument::accessibilityObject() const { const Document* document = constUnwrap<Document>(); AXObjectCacheImpl* cache = toAXObjectCacheImpl(document->axObjectCache()); return cache ? WebAXObject(cache->getOrCreate( toLayoutView(LayoutAPIShim::layoutObjectFrom( document->layoutViewItem())))) : WebAXObject(); }
void AXSlider::addChildren() { ASSERT(!m_haveChildren); m_haveChildren = true; AXObjectCacheImpl* cache = axObjectCache(); AXSliderThumb* thumb = static_cast<AXSliderThumb*>(cache->getOrCreate(SliderThumbRole)); thumb->setParent(this); // Before actually adding the value indicator to the hierarchy, // allow the platform to make a final decision about it. if (thumb->accessibilityIsIgnored()) cache->remove(thumb->axObjectID()); else m_children.append(thumb); }
void TextFinder::reportFindInPageResultToAccessibility(int identifier) { AXObjectCacheImpl* axObjectCache = toAXObjectCacheImpl(ownerFrame().frame()->document()->existingAXObjectCache()); if (!axObjectCache) return; AXObject* startObject = axObjectCache->get(m_activeMatch->startContainer()); AXObject* endObject = axObjectCache->get(m_activeMatch->endContainer()); if (!startObject || !endObject) return; WebLocalFrameImpl* mainFrameImpl = ownerFrame().viewImpl()->mainFrameImpl(); if (mainFrameImpl && mainFrameImpl->client()) { mainFrameImpl->client()->handleAccessibilityFindInPageResult( identifier, m_activeMatchIndexInCurrentFrame + 1, WebAXObject(startObject), m_activeMatch->startOffset(), WebAXObject(endObject), m_activeMatch->endOffset()); } }
WebAXObject WebDocument::focusedAccessibilityObject() const { const Document* document = constUnwrap<Document>(); AXObjectCacheImpl* cache = toAXObjectCacheImpl(document->axObjectCache()); return cache ? WebAXObject(cache->focusedObject()) : WebAXObject(); }
WebAXObject WebDocument::accessibilityObjectFromID(int axID) const { const Document* document = constUnwrap<Document>(); AXObjectCacheImpl* cache = toAXObjectCacheImpl(document->axObjectCache()); return cache ? WebAXObject(cache->objectFromAXID(axID)) : WebAXObject(); }
void AXTable::addChildren() { if (!isAXTable()) { AXLayoutObject::addChildren(); return; } ASSERT(!m_haveChildren); m_haveChildren = true; if (!m_layoutObject || !m_layoutObject->isTable()) return; LayoutTable* table = toLayoutTable(m_layoutObject); AXObjectCacheImpl* axCache = axObjectCache(); Node* tableNode = table->node(); if (!isHTMLTableElement(tableNode)) return; // Add caption if (HTMLTableCaptionElement* caption = toHTMLTableElement(tableNode)->caption()) { AXObject* captionObject = axCache->getOrCreate(caption); if (captionObject && !captionObject->accessibilityIsIgnored()) m_children.append(captionObject); } // Go through all the available sections to pull out the rows and add them as children. table->recalcSectionsIfNeeded(); LayoutTableSection* tableSection = table->topSection(); if (!tableSection) return; LayoutTableSection* initialTableSection = tableSection; while (tableSection) { HashSet<AXObject*> appendedRows; unsigned numRows = tableSection->numRows(); for (unsigned rowIndex = 0; rowIndex < numRows; ++rowIndex) { LayoutTableRow* layoutRow = tableSection->rowRendererAt(rowIndex); if (!layoutRow) continue; AXObject* rowObject = axCache->getOrCreate(layoutRow); if (!rowObject || !rowObject->isTableRow()) continue; AXTableRow* row = toAXTableRow(rowObject); // We need to check every cell for a new row, because cell spans // can cause us to miss rows if we just check the first column. if (appendedRows.contains(row)) continue; row->setRowIndex(static_cast<int>(m_rows.size())); m_rows.append(row); if (!row->accessibilityIsIgnored()) m_children.append(row); appendedRows.add(row); } tableSection = table->sectionBelow(tableSection, SkipEmptySections); } // make the columns based on the number of columns in the first body unsigned length = initialTableSection->numColumns(); for (unsigned i = 0; i < length; ++i) { AXTableColumn* column = toAXTableColumn(axCache->getOrCreate(ColumnRole)); column->setColumnIndex((int)i); column->setParent(this); m_columns.append(column); if (!column->accessibilityIsIgnored()) m_children.append(column); } AXObject* headerContainerObject = headerContainer(); if (headerContainerObject && !headerContainerObject->accessibilityIsIgnored()) m_children.append(headerContainerObject); }