| Index: chrome/browser/renderer_host/render_widget_host_view_win.cc
|
| ===================================================================
|
| --- chrome/browser/renderer_host/render_widget_host_view_win.cc (revision 46908)
|
| +++ chrome/browser/renderer_host/render_widget_host_view_win.cc (working copy)
|
| @@ -13,6 +13,7 @@
|
| #include "base/process_util.h"
|
| #include "base/thread.h"
|
| #include "base/win_util.h"
|
| +#include "chrome/browser/browser_accessibility.h"
|
| #include "chrome/browser/browser_accessibility_manager.h"
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/browser_trial.h"
|
| @@ -26,6 +27,7 @@
|
| #include "chrome/common/chrome_constants.h"
|
| #include "chrome/common/chrome_switches.h"
|
| #include "chrome/common/native_web_keyboard_event.h"
|
| +#include "chrome/common/notification_service.h"
|
| #include "chrome/common/plugin_messages.h"
|
| #include "chrome/common/render_messages.h"
|
| #include "gfx/canvas.h"
|
| @@ -285,6 +287,9 @@
|
| renderer_accessible_ =
|
| CommandLine::ForCurrentProcess()->HasSwitch(
|
| switches::kEnableRendererAccessibility);
|
| + registrar_.Add(this,
|
| + NotificationType::RENDERER_PROCESS_TERMINATED,
|
| + NotificationService::AllSources());
|
| }
|
|
|
| RenderWidgetHostViewWin::~RenderWidgetHostViewWin() {
|
| @@ -1472,40 +1477,64 @@
|
| return MA_ACTIVATE;
|
| }
|
|
|
| +void RenderWidgetHostViewWin::UpdateAccessibilityTree(
|
| + const webkit_glue::WebAccessibility& tree) {
|
| + browser_accessibility_manager_.reset(
|
| + new BrowserAccessibilityManager(m_hWnd, tree));
|
| +}
|
| +
|
| +void RenderWidgetHostViewWin::OnAccessibilityFocusChange(int acc_obj_id) {
|
| + if (browser_accessibility_manager_.get()) {
|
| + browser_accessibility_manager_->OnAccessibilityFocusChange(acc_obj_id);
|
| + }
|
| +}
|
| +
|
| +void RenderWidgetHostViewWin::OnAccessibilityObjectStateChange(int acc_obj_id) {
|
| + if (browser_accessibility_manager_.get()) {
|
| + browser_accessibility_manager_->OnAccessibilityObjectStateChange(
|
| + acc_obj_id);
|
| + }
|
| +}
|
| +
|
| +void RenderWidgetHostViewWin::Observe(NotificationType type,
|
| + const NotificationSource& source,
|
| + const NotificationDetails& details) {
|
| + DCHECK(type == NotificationType::RENDERER_PROCESS_TERMINATED);
|
| +
|
| + // Get the RenderProcessHost that posted this notification, and exit
|
| + // if it's not the one associated with this host view.
|
| + RenderProcessHost* render_process_host =
|
| + Source<RenderProcessHost>(source).ptr();
|
| + DCHECK(render_process_host);
|
| + if (!render_widget_host_ ||
|
| + render_process_host != render_widget_host_->process())
|
| + return;
|
| +
|
| + // If it was our RenderProcessHost that posted the notification,
|
| + // clear the BrowserAccessibilityManager, because the renderer is
|
| + // dead and any accessibility information we have is now stale.
|
| + browser_accessibility_manager_.reset(NULL);
|
| +}
|
| +
|
| LRESULT RenderWidgetHostViewWin::OnGetObject(UINT message, WPARAM wparam,
|
| LPARAM lparam, BOOL& handled) {
|
| - LRESULT reference_result = static_cast<LRESULT>(0L);
|
| - // TODO(jcampan): http://b/issue?id=1432077 Disabling accessibility in the
|
| + // TODO(dmazzoni): http://crbug.com/25564 Disabling accessibility in the
|
| // renderer is a temporary work-around until that bug is fixed.
|
| - if (!renderer_accessible_)
|
| - return reference_result;
|
| + if (!renderer_accessible_) {
|
| + handled = false;
|
| + return static_cast<LRESULT>(0L);
|
| + }
|
|
|
| - // Accessibility readers will send an OBJID_CLIENT message.
|
| - if (OBJID_CLIENT == lparam) {
|
| - // If our MSAA DOM root is already created, reuse that pointer. Otherwise,
|
| - // create a new one.
|
| - if (!browser_accessibility_root_) {
|
| - // Create a new instance of IAccessible. Root id is 1000, to avoid
|
| - // conflicts with the ids used by MSAA.
|
| - BrowserAccessibilityManager::GetInstance()->CreateAccessibilityInstance(
|
| - IID_IAccessible, 1000,
|
| - render_widget_host_->routing_id(),
|
| - render_widget_host_->process()->id(),
|
| - m_hWnd,
|
| - reinterpret_cast<void **>(browser_accessibility_root_.Receive()));
|
| -
|
| - if (!browser_accessibility_root_) {
|
| - // No valid root found, return with failure.
|
| - return static_cast<LRESULT>(0L);
|
| - }
|
| + if (lparam == OBJID_CLIENT && browser_accessibility_manager_.get()) {
|
| + BrowserAccessibility* root = browser_accessibility_manager_->GetRoot();
|
| + if (root) {
|
| + return LresultFromObject(IID_IAccessible, wparam,
|
| + static_cast<IAccessible*>(root->NewReference()));
|
| }
|
| + }
|
|
|
| - // Create a reference to BrowserAccessibility which MSAA will marshall to
|
| - // the client.
|
| - reference_result = LresultFromObject(IID_IAccessible, wparam,
|
| - static_cast<IAccessible*>(browser_accessibility_root_));
|
| - }
|
| - return reference_result;
|
| + handled = false;
|
| + return static_cast<LRESULT>(0L);
|
| }
|
|
|
| void RenderWidgetHostViewWin::OnFinalMessage(HWND window) {
|
|
|