Index: content/renderer/renderer_accessibility.cc |
=================================================================== |
--- content/renderer/renderer_accessibility.cc (revision 112764) |
+++ content/renderer/renderer_accessibility.cc (working copy) |
@@ -10,6 +10,8 @@ |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebAccessibilityObject.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputElement.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebNode.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
#include "webkit/glue/webaccessibility.h" |
@@ -18,6 +20,7 @@ |
using WebKit::WebDocument; |
using WebKit::WebFrame; |
using WebKit::WebNode; |
+using WebKit::WebSize; |
using WebKit::WebView; |
using webkit_glue::WebAccessibility; |
@@ -104,6 +107,10 @@ |
OnAccessibilityDoDefaultAction) |
IPC_MESSAGE_HANDLER(ViewMsg_AccessibilityNotifications_ACK, |
OnAccessibilityNotificationsAck) |
+ IPC_MESSAGE_HANDLER(ViewMsg_AccessibilityChangeScrollPosition, |
+ OnChangeScrollPosition) |
+ IPC_MESSAGE_HANDLER(ViewMsg_AccessibilitySetTextSelection, |
+ OnSetTextSelection) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
return handled; |
@@ -373,6 +380,75 @@ |
obj.performDefaultAction(); |
} |
+void RendererAccessibility::OnChangeScrollPosition( |
+ int acc_obj_id, int scroll_x, int scroll_y) { |
+ if (!WebAccessibilityObject::accessibilityEnabled()) |
+ return; |
+ |
+ const WebDocument& document = GetMainDocument(); |
+ if (document.isNull()) |
+ return; |
+ |
+ WebAccessibilityObject root = document.accessibilityObject(); |
+ |
+ // TODO(dmazzoni): Support scrolling of any scrollable container, |
+ // not just the main document frame. |
+ if (acc_obj_id != root.axID()) |
+ return; |
+ |
+ WebFrame* frame = document.frame(); |
+ if (!frame) |
+ return; |
+ |
+ WebSize min_offset = frame->minimumScrollOffset(); |
+ WebSize max_offset = frame->maximumScrollOffset(); |
+ scroll_x = std::max(min_offset.width, scroll_x); |
+ scroll_x = std::min(max_offset.width, scroll_x); |
+ scroll_y = std::max(min_offset.height, scroll_y); |
+ scroll_y = std::min(max_offset.height, scroll_y); |
+ |
+ frame->setScrollOffset(WebSize(scroll_x, scroll_y)); |
+ if (frame->view()) |
+ frame->view()->layout(); |
+ |
+ // Make sure the browser gets a notification when the scroll |
+ // position actually changes. |
+ // TODO(dmazzoni): remove this once this bug is fixed: |
+ // https://bugs.webkit.org/show_bug.cgi?id=73460 |
+ PostAccessibilityNotification( |
+ root, |
+ WebKit::WebAccessibilityNotificationLayoutComplete); |
+} |
+ |
+void RendererAccessibility::OnSetTextSelection( |
+ int acc_obj_id, int start_offset, int end_offset) { |
+ if (!WebAccessibilityObject::accessibilityEnabled()) |
+ return; |
+ |
+ const WebDocument& document = GetMainDocument(); |
+ if (document.isNull()) |
+ return; |
+ |
+ WebAccessibilityObject obj = document.accessibilityObjectFromID(acc_obj_id); |
+ if (!obj.isValid()) { |
+#ifndef NDEBUG |
+ if (logging_) |
+ LOG(WARNING) << "SetTextSelection on invalid object id " << acc_obj_id; |
+#endif |
+ return; |
+ } |
+ |
+ // TODO(dmazzoni): support elements other than <input>. |
+ WebKit::WebNode node = obj.node(); |
+ if (!node.isNull() && node.isElementNode()) { |
+ WebKit::WebElement element = node.to<WebKit::WebElement>(); |
+ WebKit::WebInputElement* input_element = |
+ WebKit::toWebInputElement(&element); |
+ if (input_element && input_element->isTextField()) |
+ input_element->setSelectionRange(start_offset, end_offset); |
+ } |
+} |
+ |
void RendererAccessibility::OnAccessibilityNotificationsAck() { |
DCHECK(ack_pending_); |
ack_pending_ = false; |