| Index: Source/modules/accessibility/InspectorAccessibilityAgent.cpp
|
| diff --git a/Source/modules/accessibility/InspectorAccessibilityAgent.cpp b/Source/modules/accessibility/InspectorAccessibilityAgent.cpp
|
| index fe1664975ef649c729a11bc6d63cb6b452e2ebc6..b609a876e20047000a92b2b8d6bf488a17eeb4d8 100644
|
| --- a/Source/modules/accessibility/InspectorAccessibilityAgent.cpp
|
| +++ b/Source/modules/accessibility/InspectorAccessibilityAgent.cpp
|
| @@ -15,6 +15,7 @@
|
| #include "core/page/Page.h"
|
| #include "modules/accessibility/AXObject.h"
|
| #include "modules/accessibility/AXObjectCacheImpl.h"
|
| +#include "modules/accessibility/InspectorTypeBuilderHelper.h"
|
| #include "platform/JSONValues.h"
|
|
|
| namespace blink {
|
| @@ -33,107 +34,6 @@ using TypeBuilder::Accessibility::AXWidgetStates;
|
|
|
| namespace {
|
|
|
| -PassRefPtr<AXProperty> createProperty(String name, PassRefPtr<AXValue> value)
|
| -{
|
| - RefPtr<AXProperty> property = AXProperty::create().setName(name).setValue(value);
|
| - return property;
|
| -}
|
| -
|
| -PassRefPtr<AXProperty> createProperty(AXGlobalStates::Enum name, PassRefPtr<AXValue> value)
|
| -{
|
| - return createProperty(TypeBuilder::getEnumConstantValue(name), value);
|
| -}
|
| -
|
| -PassRefPtr<AXProperty> createProperty(AXLiveRegionAttributes::Enum name, PassRefPtr<AXValue> value)
|
| -{
|
| - return createProperty(TypeBuilder::getEnumConstantValue(name), value);
|
| -}
|
| -
|
| -
|
| -PassRefPtr<AXProperty> createProperty(AXRelationshipAttributes::Enum name, PassRefPtr<AXValue> value)
|
| -{
|
| - return createProperty(TypeBuilder::getEnumConstantValue(name), value);
|
| -}
|
| -
|
| -PassRefPtr<AXProperty> createProperty(AXWidgetAttributes::Enum name, PassRefPtr<AXValue> value)
|
| -{
|
| - return createProperty(TypeBuilder::getEnumConstantValue(name), value);
|
| -}
|
| -
|
| -PassRefPtr<AXProperty> createProperty(AXWidgetStates::Enum name, PassRefPtr<AXValue> value)
|
| -{
|
| - return createProperty(TypeBuilder::getEnumConstantValue(name), value);
|
| -}
|
| -
|
| -
|
| -PassRefPtr<AXValue> createValue(String value, AXValueType::Enum type = AXValueType::String)
|
| -{
|
| - RefPtr<AXValue> axValue = AXValue::create().setType(type);
|
| - axValue->setValue(JSONString::create(value));
|
| - return axValue;
|
| -}
|
| -
|
| -PassRefPtr<AXValue> createValue(int value, AXValueType::Enum type = AXValueType::Integer)
|
| -{
|
| - RefPtr<AXValue> axValue = AXValue::create().setType(type);
|
| - axValue->setValue(JSONBasicValue::create(value));
|
| - return axValue;
|
| -}
|
| -
|
| -PassRefPtr<AXValue> createValue(float value, AXValueType::Enum type = AXValueType::Number)
|
| -{
|
| - RefPtr<AXValue> axValue = AXValue::create().setType(type);
|
| - axValue->setValue(JSONBasicValue::create(value));
|
| - return axValue;
|
| -}
|
| -
|
| -PassRefPtr<AXValue> createBooleanValue(bool value, AXValueType::Enum type = AXValueType::Boolean)
|
| -{
|
| - RefPtr<AXValue> axValue = AXValue::create().setType(type);
|
| - axValue->setValue(JSONBasicValue::create(value));
|
| - return axValue;
|
| -}
|
| -
|
| -PassRefPtr<AXRelatedNode> relatedNodeForAXObject(const AXObject* axObject)
|
| -{
|
| - Node* node = axObject->node();
|
| - if (!node)
|
| - return PassRefPtr<AXRelatedNode>();
|
| - int backendNodeId = DOMNodeIds::idForNode(node);
|
| - if (!backendNodeId)
|
| - return PassRefPtr<AXRelatedNode>();
|
| - RefPtr<AXRelatedNode> relatedNode = AXRelatedNode::create().setBackendNodeId(backendNodeId);
|
| - if (!node->isElementNode())
|
| - return relatedNode;
|
| -
|
| - Element* element = toElement(node);
|
| - const AtomicString& idref = element->getIdAttribute();
|
| - if (!idref.isEmpty())
|
| - relatedNode->setIdref(idref);
|
| - return relatedNode;
|
| -}
|
| -
|
| -
|
| -PassRefPtr<AXValue> createRelatedNodeValue(const AXObject* axObject)
|
| -{
|
| - RefPtr<AXValue> axValue = AXValue::create().setType(AXValueType::Idref);
|
| - RefPtr<AXRelatedNode> relatedNode = relatedNodeForAXObject(axObject);
|
| - axValue->setRelatedNodeValue(relatedNode);
|
| - return axValue;
|
| -}
|
| -
|
| -PassRefPtr<AXValue> createRelatedNodeListValue(AXObject::AccessibilityChildrenVector axObjects)
|
| -{
|
| - RefPtr<TypeBuilder::Array<AXRelatedNode>> relatedNodes = TypeBuilder::Array<AXRelatedNode>::create();
|
| - for (unsigned i = 0; i < axObjects.size(); i++) {
|
| - if (RefPtr<AXRelatedNode> relatedNode = relatedNodeForAXObject(axObjects[i].get()))
|
| - relatedNodes->addItem(relatedNode);
|
| - }
|
| - RefPtr<AXValue> axValue = AXValue::create().setType(AXValueType::IdrefList);
|
| - axValue->setRelatedNodeArrayValue(relatedNodes);
|
| - return axValue;
|
| -}
|
| -
|
| void fillCoreProperties(AXObject* axObject, PassRefPtr<AXNode> nodeObject)
|
| {
|
| // core properties
|
| @@ -381,9 +281,8 @@ void fillRelationships(AXObject* axObject, PassRefPtr<TypeBuilder::Array<AXPrope
|
| results.clear();
|
| }
|
|
|
| -PassRefPtr<AXNode> buildObjectForNode(Node* node, AXObject* axObject, AXObjectCacheImpl* cacheImpl, PassRefPtr<TypeBuilder::Array<AXProperty>> properties)
|
| +PassRefPtr<AXValue> createRoleNameValue(AccessibilityRole role)
|
| {
|
| - AccessibilityRole role = axObject->roleValue();
|
| AtomicString roleName = AXObject::roleName(role);
|
| RefPtr<AXValue> roleNameValue;
|
| if (!roleName.isNull()) {
|
| @@ -391,7 +290,38 @@ PassRefPtr<AXNode> buildObjectForNode(Node* node, AXObject* axObject, AXObjectCa
|
| } else {
|
| roleNameValue = createValue(AXObject::internalRoleName(role), AXValueType::InternalRole);
|
| }
|
| - RefPtr<AXNode> nodeObject = AXNode::create().setNodeId(String::number(axObject->axObjectID())).setRole(roleNameValue).setProperties(properties);
|
| + return roleNameValue;
|
| +}
|
| +
|
| +PassRefPtr<AXNode> buildObjectForIgnoredNode(Node* node, AXObject* axObject, AXObjectCacheImpl* cacheImpl)
|
| +{
|
| + AXObject::IgnoredReasons ignoredReasons;
|
| +
|
| + AXID axID = 0;
|
| + RefPtr<AXNode> ignoredNodeObject = AXNode::create().setNodeId(String::number(axID)).setIgnored(true);
|
| + if (axObject) {
|
| + axObject->computeAccessibilityIsIgnored(&ignoredReasons);
|
| + axID = axObject->axObjectID();
|
| + AccessibilityRole role = axObject->roleValue();
|
| + ignoredNodeObject->setRole(createRoleNameValue(role));
|
| + } else if (!node->layoutObject()) {
|
| + ignoredReasons.append(IgnoredReason(AXNotRendered));
|
| + }
|
| +
|
| + RefPtr<TypeBuilder::Array<AXProperty>> ignoredReasonProperties = TypeBuilder::Array<AXProperty>::create();
|
| + for (size_t i = 0; i < ignoredReasons.size(); i++)
|
| + ignoredReasonProperties->addItem(createProperty(ignoredReasons[i]));
|
| + ignoredNodeObject->setIgnoredReasons(ignoredReasonProperties);
|
| +
|
| + return ignoredNodeObject;
|
| +}
|
| +
|
| +PassRefPtr<AXNode> buildObjectForNode(Node* node, AXObject* axObject, AXObjectCacheImpl* cacheImpl, PassRefPtr<TypeBuilder::Array<AXProperty>> properties)
|
| +{
|
| + AccessibilityRole role = axObject->roleValue();
|
| + RefPtr<AXNode> nodeObject = AXNode::create().setNodeId(String::number(axObject->axObjectID())).setIgnored(false);
|
| + nodeObject->setRole(createRoleNameValue(role));
|
| + nodeObject->setProperties(properties);
|
| String computedName = cacheImpl->computedNameForNode(node);
|
| if (!computedName.isEmpty())
|
| nodeObject->setName(createValue(computedName));
|
| @@ -424,12 +354,15 @@ void InspectorAccessibilityAgent::getAXNode(ErrorString* errorString, int nodeId
|
| Node* node = domAgent->assertNode(errorString, nodeId);
|
| if (!node)
|
| return;
|
| +
|
| Document& document = node->document();
|
| RefPtr<ScopedAXObjectCache> cache(adoptRef(new ScopedAXObjectCache(document)));
|
| AXObjectCacheImpl* cacheImpl = toAXObjectCacheImpl(cache->get());
|
| AXObject* axObject = cacheImpl->getOrCreate(node);
|
| - if (!axObject)
|
| + if (!axObject || axObject->accessibilityIsIgnored()) {
|
| + accessibilityNode = buildObjectForIgnoredNode(node, axObject, cacheImpl);
|
| return;
|
| + }
|
|
|
| RefPtr<TypeBuilder::Array<AXProperty>> properties = TypeBuilder::Array<AXProperty>::create();
|
| fillLiveRegionProperties(axObject, properties);
|
|
|