summaryrefslogtreecommitdiff
path: root/Tools/DumpRenderTree/chromium/TestRunner/AccessibilityControllerChromium.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/DumpRenderTree/chromium/TestRunner/AccessibilityControllerChromium.cpp')
-rw-r--r--Tools/DumpRenderTree/chromium/TestRunner/AccessibilityControllerChromium.cpp51
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 "