diff options
Diffstat (limited to 'Tools/DumpRenderTree/chromium/TestRunner/AccessibilityControllerChromium.cpp')
| -rw-r--r-- | Tools/DumpRenderTree/chromium/TestRunner/AccessibilityControllerChromium.cpp | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/Tools/DumpRenderTree/chromium/TestRunner/AccessibilityControllerChromium.cpp b/Tools/DumpRenderTree/chromium/TestRunner/AccessibilityControllerChromium.cpp index b1d2948ae..89d5d5877 100644 --- a/Tools/DumpRenderTree/chromium/TestRunner/AccessibilityControllerChromium.cpp +++ b/Tools/DumpRenderTree/chromium/TestRunner/AccessibilityControllerChromium.cpp @@ -32,9 +32,11 @@ #include "AccessibilityControllerChromium.h" #include "WebAccessibilityObject.h" +#include "WebElement.h" #include "WebFrame.h" +#include "WebNode.h" #include "WebView.h" -#include "platform/WebString.h" +#include "platform/WebCString.h" using namespace WebKit; @@ -49,6 +51,8 @@ AccessibilityController::AccessibilityController() bindProperty("focusedElement", &AccessibilityController::focusedElementGetterCallback); bindProperty("rootElement", &AccessibilityController::rootElementGetterCallback); + bindMethod("accessibleElementById", &AccessibilityController::accessibleElementByIdGetterCallback); + bindFallbackMethod(&AccessibilityController::fallbackCallback); } @@ -86,6 +90,36 @@ AccessibilityUIElement* AccessibilityController::getRootElement() return m_elements.createRoot(m_rootElement); } +AccessibilityUIElement* AccessibilityController::findAccessibleElementByIdRecursive(const WebAccessibilityObject& obj, const WebString& id) +{ + if (obj.isNull() || obj.isDetached()) + return 0; + + WebNode node = obj.node(); + if (!node.isNull() && node.isElementNode()) { + WebElement element = node.to<WebElement>(); + element.getAttribute("id"); + if (element.getAttribute("id") == id) + return m_elements.getOrCreate(obj); + } + + unsigned childCount = obj.childCount(); + for (unsigned i = 0; i < childCount; i++) { + if (AccessibilityUIElement* result = findAccessibleElementByIdRecursive(obj.childAt(i), id)) + return result; + } + + return 0; +} + +AccessibilityUIElement* AccessibilityController::getAccessibleElementById(const std::string& id) +{ + if (m_rootElement.isNull()) + m_rootElement = m_webView->accessibilityObject(); + + return findAccessibleElementByIdRecursive(m_rootElement, WebString::fromUTF8(id.c_str())); +} + bool AccessibilityController::shouldLogAccessibilityEvents() { return m_logAccessibilityEvents; @@ -141,6 +175,21 @@ void AccessibilityController::rootElementGetterCallback(CppVariant* result) result->set(*(getRootElement()->getAsCppVariant())); } +void AccessibilityController::accessibleElementByIdGetterCallback(const CppArgumentList& arguments, CppVariant* result) +{ + result->setNull(); + + if (arguments.size() < 1 || !arguments[0].isString()) + return; + + std::string id = arguments[0].toString(); + AccessibilityUIElement* foundElement = getAccessibleElementById(id); + if (!foundElement) + return; + + result->set(*(foundElement->getAsCppVariant())); +} + void AccessibilityController::fallbackCallback(const CppArgumentList&, CppVariant* result) { printf("CONSOLE MESSAGE: JavaScript ERROR: unknown method called on " |
