| Index: chrome/renderer/render_view.cc
|
| ===================================================================
|
| --- chrome/renderer/render_view.cc (revision 60480)
|
| +++ chrome/renderer/render_view.cc (working copy)
|
| @@ -665,6 +665,8 @@
|
| const CommandLine& command_line = *CommandLine::ForCurrentProcess();
|
| if (command_line.HasSwitch(switches::kDomAutomationController))
|
| enabled_bindings_ |= BindingsPolicy::DOM_AUTOMATION;
|
| + if (command_line.HasSwitch(switches::kEnableAccessibility))
|
| + WebAccessibilityCache::enableAccessibility();
|
|
|
| audio_message_filter_ = new AudioMessageFilter(routing_id_);
|
| render_thread_->AddFilter(audio_message_filter_);
|
| @@ -804,7 +806,7 @@
|
| OnCustomContextMenuAction)
|
| IPC_MESSAGE_HANDLER(ViewMsg_TranslatePage, OnTranslatePage)
|
| IPC_MESSAGE_HANDLER(ViewMsg_RevertTranslation, OnRevertTranslation)
|
| - IPC_MESSAGE_HANDLER(ViewMsg_GetAccessibilityTree, OnGetAccessibilityTree)
|
| + IPC_MESSAGE_HANDLER(ViewMsg_EnableAccessibility, OnEnableAccessibility)
|
| IPC_MESSAGE_HANDLER(ViewMsg_SetAccessibilityFocus, OnSetAccessibilityFocus)
|
| IPC_MESSAGE_HANDLER(ViewMsg_AccessibilityDoDefaultAction,
|
| OnAccessibilityDoDefaultAction)
|
| @@ -1478,8 +1480,8 @@
|
| if (accessibility_.get() && !navigation_state->was_within_same_page()) {
|
| accessibility_->clear();
|
| accessibility_.reset();
|
| + pending_accessibility_notifications_.clear();
|
| }
|
| - pending_accessibility_notifications_.clear();
|
| }
|
|
|
| // Tell the embedding application that the title of the active page has changed
|
| @@ -4398,16 +4400,20 @@
|
| browser_window_id_ = window_id;
|
| }
|
|
|
| -void RenderView::OnGetAccessibilityTree() {
|
| - if (accessibility_.get())
|
| - accessibility_->clear();
|
| - accessibility_.reset(WebAccessibilityCache::create());
|
| - accessibility_->initialize(webview());
|
| - pending_accessibility_notifications_.clear();
|
| +void RenderView::OnEnableAccessibility() {
|
| + if (WebAccessibilityCache::accessibilityEnabled())
|
| + return;
|
|
|
| - WebAccessibilityObject src_tree = webview()->accessibilityObject();
|
| - WebAccessibility dst_tree(src_tree, accessibility_.get());
|
| - Send(new ViewHostMsg_AccessibilityTree(routing_id_, dst_tree));
|
| + WebAccessibilityCache::enableAccessibility();
|
| +
|
| + if (webview()) {
|
| + // It's possible that the webview has already loaded a webpage without
|
| + // accessibility being enabled. Initialize the browser's cached
|
| + // accessibility tree by sending it a 'load complete' notification.
|
| + postAccessibilityNotification(
|
| + webview()->accessibilityObject(),
|
| + WebKit::WebAccessibilityNotificationLoadComplete);
|
| + }
|
| }
|
|
|
| void RenderView::OnSetAccessibilityFocus(int acc_obj_id) {
|
| @@ -5467,34 +5473,22 @@
|
| << url.spec();
|
| }
|
|
|
| -void RenderView::focusAccessibilityObject(
|
| - const WebAccessibilityObject& acc_obj) {
|
| -#if defined(OS_WIN)
|
| - // TODO(dglazkov): Current logic implies that focus change can only be made
|
| - // after at least one call to RenderView::OnGetAccessibilityInfo, which is
|
| - // where accessibility is initialized. We should determine whether that's
|
| - // right.
|
| - if (!accessibility_.get())
|
| - return;
|
| -
|
| - // Retrieve the accessibility object id of the AccessibilityObject.
|
| - int acc_obj_id = accessibility_->addOrGetId(acc_obj);
|
| -
|
| - // If id is valid, alert the browser side that an accessibility focus change
|
| - // occurred.
|
| - if (acc_obj_id >= 0)
|
| - Send(new ViewHostMsg_AccessibilityFocusChange(routing_id_, acc_obj_id));
|
| -
|
| -#else // defined(OS_WIN)
|
| - // TODO(port): accessibility not yet implemented
|
| - NOTIMPLEMENTED();
|
| -#endif
|
| -}
|
| -
|
| void RenderView::postAccessibilityNotification(
|
| const WebAccessibilityObject& obj,
|
| WebAccessibilityNotification notification) {
|
| - if (!accessibility_.get() || (accessibility_->addOrGetId(obj) < 0))
|
| + if (!accessibility_.get() && webview()) {
|
| + // Load complete should be our first notification sent.
|
| + // TODO(ctguil): Investigate if a different notification is a WebCore bug.
|
| + if (notification != WebKit::WebAccessibilityNotificationLoadComplete)
|
| + return;
|
| +
|
| + // Create and initialize our accessibility cache
|
| + accessibility_.reset(WebAccessibilityCache::create());
|
| + accessibility_->initialize(webview());
|
| + }
|
| +
|
| + // Add the accessibility object to our cache and ensure it's valid.
|
| + if (accessibility_->addOrGetId(obj) < 0)
|
| return;
|
|
|
| ViewHostMsg_AccessibilityNotification_Params param;
|
| @@ -5509,6 +5503,16 @@
|
| ViewHostMsg_AccessibilityNotification_Params::
|
| NOTIFICATION_TYPE_CHILDREN_CHANGED;
|
| break;
|
| + case WebKit::WebAccessibilityNotificationFocusedUIElementChanged:
|
| + param.notification_type =
|
| + ViewHostMsg_AccessibilityNotification_Params::
|
| + NOTIFICATION_TYPE_FOCUS_CHANGED;
|
| + break;
|
| + case WebKit::WebAccessibilityNotificationLoadComplete:
|
| + param.notification_type =
|
| + ViewHostMsg_AccessibilityNotification_Params::
|
| + NOTIFICATION_TYPE_LOAD_COMPLETE;
|
| + break;
|
| case WebKit::WebAccessibilityNotificationValueChanged:
|
| param.notification_type =
|
| ViewHostMsg_AccessibilityNotification_Params::
|
|
|