diff options
author | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-18 03:33:21 +0000 |
---|---|---|
committer | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-18 03:33:21 +0000 |
commit | aded1c52e3de6dbbd56c68067c1023b50b01e4be (patch) | |
tree | 878cc59303f43757e8466db0647a8dc6d38ddf89 | |
parent | 25402eb26f2f05b5105523057f06532eaac58764 (diff) | |
download | chromium_src-aded1c52e3de6dbbd56c68067c1023b50b01e4be.zip chromium_src-aded1c52e3de6dbbd56c68067c1023b50b01e4be.tar.gz chromium_src-aded1c52e3de6dbbd56c68067c1023b50b01e4be.tar.bz2 |
Migrate accessibility from RenderView to RenderFrame and RVH to RFH.
In preparation for out-of-process iframes, move almost all accessibility
functionality from RenderView to RenderFrame, and from RVHI and RWHI
to RFHI.
In addition, the accessibility mode is moved to WebContents, and changing
the mode triggers changing it on all frames.
BUG=368298
R=jam@chromium.org, kenrb@chromium.org, nick@chromium.org
Review URL: https://codereview.chromium.org/273423004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@283994 0039d316-1c4b-4281-b951-d872f2087c98
72 files changed, 1353 insertions, 833 deletions
diff --git a/chrome/browser/chrome_browser_application_mac.mm b/chrome/browser/chrome_browser_application_mac.mm index 3368c06..c48d6cc 100644 --- a/chrome/browser/chrome_browser_application_mac.mm +++ b/chrome/browser/chrome_browser_application_mac.mm @@ -538,11 +538,6 @@ void SwizzleInit() { if ([attribute isEqualToString:@"AXEnhancedUserInterface"] && [value intValue] == 1) { content::BrowserAccessibilityState::GetInstance()->OnScreenReaderDetected(); - for (TabContentsIterator it; !it.done(); it.Next()) { - if (content::WebContents* contents = *it) - if (content::RenderViewHost* rvh = contents->GetRenderViewHost()) - rvh->EnableFullAccessibilityMode(); - } } return [super accessibilitySetValue:value forAttribute:attribute]; } diff --git a/chrome/browser/extensions/api/automation/automation_apitest.cc b/chrome/browser/extensions/api/automation/automation_apitest.cc index a3e48e6..c05e123 100644 --- a/chrome/browser/extensions/api/automation/automation_apitest.cc +++ b/chrome/browser/extensions/api/automation/automation_apitest.cc @@ -75,12 +75,8 @@ IN_PROC_BROWSER_TEST_F(AutomationApiTest, TestRendererAccessibilityEnabled) { ASSERT_EQ(1, browser()->tab_strip_model()->count()); content::WebContents* const tab = browser()->tab_strip_model()->GetWebContentsAt(0); - content::RenderWidgetHost* rwh = - tab->GetRenderWidgetHostView()->GetRenderWidgetHost(); - ASSERT_NE((content::RenderWidgetHost*)NULL, rwh) - << "Couldn't get RenderWidgetHost"; - ASSERT_FALSE(rwh->IsFullAccessibilityModeForTesting()); - ASSERT_FALSE(rwh->IsTreeOnlyAccessibilityModeForTesting()); + ASSERT_FALSE(tab->IsFullAccessibilityModeForTesting()); + ASSERT_FALSE(tab->IsTreeOnlyAccessibilityModeForTesting()); base::FilePath extension_path = test_data_dir_.AppendASCII("automation/tests/basic"); @@ -88,11 +84,8 @@ IN_PROC_BROWSER_TEST_F(AutomationApiTest, TestRendererAccessibilityEnabled) { LoadExtension(extension_path); ASSERT_TRUE(got_tree.WaitUntilSatisfied()); - rwh = tab->GetRenderWidgetHostView()->GetRenderWidgetHost(); - ASSERT_NE((content::RenderWidgetHost*)NULL, rwh) - << "Couldn't get RenderWidgetHost"; - ASSERT_FALSE(rwh->IsFullAccessibilityModeForTesting()); - ASSERT_TRUE(rwh->IsTreeOnlyAccessibilityModeForTesting()); + ASSERT_FALSE(tab->IsFullAccessibilityModeForTesting()); + ASSERT_TRUE(tab->IsTreeOnlyAccessibilityModeForTesting()); } #if defined(ADDRESS_SANITIZER) diff --git a/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc b/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc index 62b038e..a2b93f8 100644 --- a/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc +++ b/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc @@ -16,8 +16,8 @@ #include "chrome/common/extensions/api/automation_internal.h" #include "chrome/common/extensions/manifest_handlers/automation.h" #include "content/public/browser/ax_event_notification_details.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" -#include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host.h" #include "content/public/browser/render_widget_host_view.h" #include "content/public/browser/web_contents.h" @@ -78,11 +78,11 @@ class AutomationWebContentsObserver details, browser_context_); } - virtual void RenderViewDeleted( - content::RenderViewHost* render_view_host) OVERRIDE { + virtual void RenderFrameDeleted( + content::RenderFrameHost* render_frame_host) OVERRIDE { automation_util::DispatchTreeDestroyedEventToAutomation( - render_view_host->GetProcess()->GetID(), - render_view_host->GetRoutingID(), + render_frame_host->GetProcess()->GetID(), + render_frame_host->GetRoutingID(), browser_context_); } @@ -99,35 +99,35 @@ class AutomationWebContentsObserver DISALLOW_COPY_AND_ASSIGN(AutomationWebContentsObserver); }; -// Helper class that implements an action adapter for a |RenderWidgetHost|. -class RenderWidgetHostActionAdapter : public AutomationActionAdapter { +// Helper class that implements an action adapter for a |RenderFrameHost|. +class RenderFrameHostActionAdapter : public AutomationActionAdapter { public: - explicit RenderWidgetHostActionAdapter(content::RenderWidgetHost* rwh) - : rwh_(rwh) {} + explicit RenderFrameHostActionAdapter(content::RenderFrameHost* rfh) + : rfh_(rfh) {} - virtual ~RenderWidgetHostActionAdapter() {} + virtual ~RenderFrameHostActionAdapter() {} // AutomationActionAdapter implementation. virtual void DoDefault(int32 id) OVERRIDE { - rwh_->AccessibilityDoDefaultAction(id); + rfh_->AccessibilityDoDefaultAction(id); } virtual void Focus(int32 id) OVERRIDE { - rwh_->AccessibilitySetFocus(id); + rfh_->AccessibilitySetFocus(id); } virtual void MakeVisible(int32 id) OVERRIDE { - rwh_->AccessibilityScrollToMakeVisible(id, gfx::Rect()); + rfh_->AccessibilityScrollToMakeVisible(id, gfx::Rect()); } virtual void SetSelection(int32 id, int32 start, int32 end) OVERRIDE { - rwh_->AccessibilitySetTextSelection(id, start, end); + rfh_->AccessibilitySetTextSelection(id, start, end); } private: - content::RenderWidgetHost* rwh_; + content::RenderFrameHost* rfh_; - DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostActionAdapter); + DISALLOW_COPY_AND_ASSIGN(RenderFrameHostActionAdapter); }; ExtensionFunction::ResponseAction @@ -156,9 +156,8 @@ AutomationInternalEnableTabFunction::Run() { if (!contents) return RespondNow(Error("No active tab")); } - content::RenderWidgetHost* rwh = - contents->GetRenderWidgetHostView()->GetRenderWidgetHost(); - if (!rwh) + content::RenderFrameHost* rfh = contents->GetMainFrame(); + if (!rfh) return RespondNow(Error("Could not enable accessibility for active tab")); if (!CanRequestAutomation(GetExtension(), automation_info, contents)) { @@ -166,10 +165,10 @@ AutomationInternalEnableTabFunction::Run() { Error(kCannotRequestAutomationOnPage, contents->GetURL().spec())); } AutomationWebContentsObserver::CreateForWebContents(contents); - rwh->EnableTreeOnlyAccessibilityMode(); + contents->EnableTreeOnlyAccessibilityMode(); return RespondNow( ArgumentList(api::automation_internal::EnableTab::Results::Create( - rwh->GetProcess()->GetID(), rwh->GetRoutingID()))); + rfh->GetProcess()->GetID(), rfh->GetRoutingID()))); } ExtensionFunction::ResponseAction @@ -192,21 +191,20 @@ AutomationInternalPerformActionFunction::Run() { " platform does not support desktop automation")); #endif // defined(OS_CHROMEOS) } - content::RenderWidgetHost* rwh = content::RenderWidgetHost::FromID( - params->args.process_id, params->args.routing_id); - - if (!rwh) + content::RenderFrameHost* rfh = + content::RenderFrameHost::FromID(params->args.process_id, + params->args.routing_id); + if (!rfh) return RespondNow(Error("Ignoring action on destroyed node")); - if (rwh->IsRenderView()) { - const content::RenderViewHost* rvh = content::RenderViewHost::From(rwh); - const content::WebContents* contents = - content::WebContents::FromRenderViewHost(rvh); - if (!CanRequestAutomation(GetExtension(), automation_info, contents)) { - return RespondNow( - Error(kCannotRequestAutomationOnPage, contents->GetURL().spec())); - } + + const content::WebContents* contents = + content::WebContents::FromRenderFrameHost(rfh); + if (!CanRequestAutomation(GetExtension(), automation_info, contents)) { + return RespondNow( + Error(kCannotRequestAutomationOnPage, contents->GetURL().spec())); } - RenderWidgetHostActionAdapter adapter(rwh); + + RenderFrameHostActionAdapter adapter(rfh); return RouteActionToAdapter(params.get(), &adapter); } diff --git a/content/browser/accessibility/#browser_accessibility_manager.cc# b/content/browser/accessibility/#browser_accessibility_manager.cc# new file mode 100644 index 0000000..b84ff23 --- /dev/null +++ b/content/browser/accessibility/#browser_accessibility_manager.cc# @@ -0,0 +1,401 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/accessibility/browser_accessibility_manager.h" + +#include "base/logging.h" +#include "content/browser/accessibility/browser_accessibility.h" +#include "content/common/accessibility_messages.h" + +namespace content { + +ui::AXTreeUpdate MakeAXTreeUpdate( + const ui::AXNodeData& node1, + const ui::AXNodeData& node2 /* = ui::AXNodeData() */, + const ui::AXNodeData& node3 /* = ui::AXNodeData() */, + const ui::AXNodeData& node4 /* = ui::AXNodeData() */, + const ui::AXNodeData& node5 /* = ui::AXNodeData() */, + const ui::AXNodeData& node6 /* = ui::AXNodeData() */, + const ui::AXNodeData& node7 /* = ui::AXNodeData() */, + const ui::AXNodeData& node8 /* = ui::AXNodeData() */, + const ui::AXNodeData& node9 /* = ui::AXNodeData() */) { + CR_DEFINE_STATIC_LOCAL(ui::AXNodeData, empty_data, ()); + int32 no_id = empty_data.id; + + ui::AXTreeUpdate update; + update.nodes.push_back(node1); + if (node2.id != no_id) + update.nodes.push_back(node2); + if (node3.id != no_id) + update.nodes.push_back(node3); + if (node4.id != no_id) + update.nodes.push_back(node4); + if (node5.id != no_id) + update.nodes.push_back(node5); + if (node6.id != no_id) + update.nodes.push_back(node6); + if (node7.id != no_id) + update.nodes.push_back(node7); + if (node8.id != no_id) + update.nodes.push_back(node8); + if (node9.id != no_id) + update.nodes.push_back(node9); + return update; +} + +BrowserAccessibility* BrowserAccessibilityFactory::Create() { + return BrowserAccessibility::Create(); +} + +#if !defined(OS_MACOSX) && \ + !defined(OS_WIN) && \ + !defined(OS_ANDROID) \ +// We have subclassess of BrowserAccessibilityManager on Mac, Win, and Android. +// These are the default implementations of these functions + +// static +BrowserAccessibilityManager* BrowserAccessibilityManager::Create( + const ui::AXTreeUpdate& initial_tree, + BrowserAccessibilityDelegate* delegate, + BrowserAccessibilityFactory* factory) { + return new BrowserAccessibilityManager(initial_tree, delegate, factory); +} + +// static +ui::AXTreeUpdate BrowserAccessibilityManager::GetEmptyDocument() { + ui::AXNodeData empty_document; + empty_document.id = 0; + empty_document.role = ui::AX_ROLE_ROOT_WEB_AREA; + ui::AXTreeUpdate update; + update.nodes.push_back(empty_document); + return update; +} +#endif + +BrowserAccessibilityManager::BrowserAccessibilityManager( + BrowserAccessibilityDelegate* delegate, + BrowserAccessibilityFactory* factory) + : delegate_(delegate), + factory_(factory), + tree_(new ui::AXTree()), + focus_(NULL), + osk_state_(OSK_ALLOWED) { + tree_->SetDelegate(this); +} + +BrowserAccessibilityManager::BrowserAccessibilityManager( + const ui::AXTreeUpdate& initial_tree, + BrowserAccessibilityDelegate* delegate, + BrowserAccessibilityFactory* factory) + : delegate_(delegate), + factory_(factory), + tree_(new ui::AXTree()), + focus_(NULL), + osk_state_(OSK_ALLOWED) { + tree_->SetDelegate(this); + Initialize(initial_tree); +} + +BrowserAccessibilityManager::~BrowserAccessibilityManager() { + tree_.reset(NULL); +} + +void BrowserAccessibilityManager::Initialize( + const ui::AXTreeUpdate& initial_tree) { + if (!tree_->Unserialize(initial_tree)) { + if (delegate_) { + LOG(ERROR) << tree_->error(); + delegate_->AccessibilityFatalError(); + } else { + LOG(FATAL) << tree_->error(); + } + } + + if (!focus_) + SetFocus(tree_->GetRoot(), false); +} + +BrowserAccessibility* BrowserAccessibilityManager::GetRoot() { + return GetFromAXNode(tree_->GetRoot()); +} + +BrowserAccessibility* BrowserAccessibilityManager::GetFromAXNode( + ui::AXNode* node) { + return GetFromID(node->id()); +} + +BrowserAccessibility* BrowserAccessibilityManager::GetFromID(int32 id) { + base::hash_map<int32, BrowserAccessibility*>::iterator iter = + id_wrapper_map_.find(id); + if (iter != id_wrapper_map_.end()) + return iter->second; + return NULL; +} + +void BrowserAccessibilityManager::OnWindowFocused() { + if (focus_) + NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, GetFromAXNode(focus_)); +} + +void BrowserAccessibilityManager::OnWindowBlurred() { + if (focus_) + NotifyAccessibilityEvent(ui::AX_EVENT_BLUR, GetFromAXNode(focus_)); +} + +void BrowserAccessibilityManager::OnNavigation(bool is_reload) { + // Exit if we don't even have the first document loaded yet. + if (GetRoot()->GetId() == 0) + return; + + LOG(ERROR) << "AX: BrowserAccessibilityManager::OnNavigation " << is_reload; + // Create an update that replaces the current tree with an empty document + // (which should be in the "busy" state by default) and apply it. + ui::AXTreeUpdate update = GetEmptyDocument(); + + LOG(ERROR) << "AX: OnNavigation empty doc update state: " + << update.nodes[0].state; + + update.nodes[0].id = GetRoot()->GetId(); + + LOG(ERROR) << "AX: State before unserializing the empty doc: " + << GetRoot()->GetState(); + LOG(ERROR) << "AX: Root id before unserializing the empty doc: " + << GetRoot()->GetId(); + LOG(ERROR) << "AX: Root children before: " + << GetRoot()->PlatformChildCount(); + + LOG(ERROR) << "AX: State of first node in update: " + << update.nodes[0].state; + + CHECK(tree_->Unserialize(update)); + LOG(ERROR) << "AX: State after unserializing the empty doc: " + << GetRoot()->GetState(); + LOG(ERROR) << "AX: Root id after unserializing the empty doc: " + << GetRoot()->GetId(); + LOG(ERROR) << "AX: Root children after: " + << GetRoot()->PlatformChildCount(); +} + +void BrowserAccessibilityManager::GotMouseDown() { + osk_state_ = OSK_ALLOWED_WITHIN_FOCUSED_OBJECT; + NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, GetFromAXNode(focus_)); +} + +bool BrowserAccessibilityManager::UseRootScrollOffsetsWhenComputingBounds() { + return true; +} + +void BrowserAccessibilityManager::OnAccessibilityEvents( + const std::vector<AccessibilityHostMsg_EventParams>& params) { + bool should_send_initial_focus = false; + + // Process all changes to the accessibility tree first. + for (uint32 index = 0; index < params.size(); index++) { + const AccessibilityHostMsg_EventParams& param = params[index]; + if (!tree_->Unserialize(param.update)) { + if (delegate_) { + LOG(ERROR) << tree_->error(); + delegate_->AccessibilityFatalError(); + } else { + CHECK(false) << tree_->error(); + } + return; + } + + // Set focus to the root if it's not anywhere else. + if (!focus_) { + SetFocus(tree_->GetRoot(), false); + should_send_initial_focus = true; + } + } + + OnTreeUpdateFinished(); + + if (should_send_initial_focus && + (!delegate_ || delegate_->AccessibilityViewHasFocus())) { + NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, GetFromAXNode(focus_)); + } + + // Now iterate over the events again and fire the events. + for (uint32 index = 0; index < params.size(); index++) { + const AccessibilityHostMsg_EventParams& param = params[index]; + + // Find the node corresponding to the id that's the target of the + // event (which may not be the root of the update tree). + ui::AXNode* node = tree_->GetFromId(param.id); + if (!node) + continue; + + ui::AXEvent event_type = param.event_type; + if (event_type == ui::AX_EVENT_FOCUS || + event_type == ui::AX_EVENT_BLUR) { + SetFocus(node, false); + + if (osk_state_ != OSK_DISALLOWED_BECAUSE_TAB_HIDDEN && + osk_state_ != OSK_DISALLOWED_BECAUSE_TAB_JUST_APPEARED) + osk_state_ = OSK_ALLOWED; + + // Don't send a native focus event if the window itself doesn't + // have focus. + if (delegate_ && !delegate_->AccessibilityViewHasFocus()) + continue; + } + + // Send the event event to the operating system. + NotifyAccessibilityEvent(event_type, GetFromAXNode(node)); + } +} + +void BrowserAccessibilityManager::OnLocationChanges( + const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { + for (size_t i = 0; i < params.size(); ++i) { + BrowserAccessibility* obj = GetFromID(params[i].id); + if (!obj) + continue; + ui::AXNode* node = obj->node(); + node->SetLocation(params[i].new_location); + obj->OnLocationChanged(); + } +} + +BrowserAccessibility* BrowserAccessibilityManager::GetActiveDescendantFocus( + BrowserAccessibility* root) { + BrowserAccessibility* node = BrowserAccessibilityManager::GetFocus(root); + if (!node) + return NULL; + + int active_descendant_id; + if (node->GetIntAttribute(ui::AX_ATTR_ACTIVEDESCENDANT_ID, + &active_descendant_id)) { + BrowserAccessibility* active_descendant = + node->manager()->GetFromID(active_descendant_id); + if (active_descendant) + return active_descendant; + } + return node; +} + +BrowserAccessibility* BrowserAccessibilityManager::GetFocus( + BrowserAccessibility* root) { + if (focus_ && (!root || focus_->IsDescendantOf(root->node()))) + return GetFromAXNode(focus_); + + return NULL; +} + +void BrowserAccessibilityManager::SetFocus(ui::AXNode* node, bool notify) { + if (focus_ != node) + focus_ = node; + + if (notify && node && delegate_) + delegate_->AccessibilitySetFocus(node->id()); +} + +void BrowserAccessibilityManager::SetFocus( + BrowserAccessibility* obj, bool notify) { + if (obj->node()) + SetFocus(obj->node(), notify); +} + +void BrowserAccessibilityManager::DoDefaultAction( + const BrowserAccessibility& node) { + if (delegate_) + delegate_->AccessibilityDoDefaultAction(node.GetId()); +} + +void BrowserAccessibilityManager::ScrollToMakeVisible( + const BrowserAccessibility& node, gfx::Rect subfocus) { + if (delegate_) { + delegate_->AccessibilityScrollToMakeVisible(node.GetId(), subfocus); + } +} + +void BrowserAccessibilityManager::ScrollToPoint( + const BrowserAccessibility& node, gfx::Point point) { + if (delegate_) { + delegate_->AccessibilityScrollToPoint(node.GetId(), point); + } +} + +void BrowserAccessibilityManager::SetTextSelection( + const BrowserAccessibility& node, int start_offset, int end_offset) { + if (delegate_) { + delegate_->AccessibilitySetTextSelection( + node.GetId(), start_offset, end_offset); + } +} + +gfx::Rect BrowserAccessibilityManager::GetViewBounds() { + if (delegate_) + return delegate_->AccessibilityGetViewBounds(); + return gfx::Rect(); +} + +BrowserAccessibility* BrowserAccessibilityManager::NextInTreeOrder( + BrowserAccessibility* node) { + if (!node) + return NULL; + + if (node->PlatformChildCount() > 0) + return node->PlatformGetChild(0); + while (node) { + if (node->GetParent() && + node->GetIndexInParent() < + static_cast<int>(node->GetParent()->PlatformChildCount()) - 1) { + return node->GetParent()->PlatformGetChild(node->GetIndexInParent() + 1); + } + node = node->GetParent(); + } + + return NULL; +} + +BrowserAccessibility* BrowserAccessibilityManager::PreviousInTreeOrder( + BrowserAccessibility* node) { + if (!node) + return NULL; + + if (node->GetParent() && node->GetIndexInParent() > 0) { + node = node->GetParent()->PlatformGetChild(node->GetIndexInParent() - 1); + while (node->PlatformChildCount() > 0) + node = node->PlatformGetChild(node->PlatformChildCount() - 1); + return node; + } + + return node->GetParent(); +} + +void BrowserAccessibilityManager::OnNodeWillBeDeleted(ui::AXNode* node) { + if (node == focus_ && tree_) { + if (node != tree_->GetRoot()) + SetFocus(tree_->GetRoot(), false); + else + focus_ = NULL; + } + if (id_wrapper_map_.find(node->id()) == id_wrapper_map_.end()) + return; + GetFromAXNode(node)->Destroy(); + id_wrapper_map_.erase(node->id()); +} + +void BrowserAccessibilityManager::OnNodeCreated(ui::AXNode* node) { + BrowserAccessibility* wrapper = factory_->Create(); + wrapper->Init(this, node); + id_wrapper_map_[node->id()] = wrapper; + wrapper->OnDataChanged(); +} + +void BrowserAccessibilityManager::OnNodeChanged(ui::AXNode* node) { + GetFromAXNode(node)->OnDataChanged(); +} + +void BrowserAccessibilityManager::OnNodeCreationFinished(ui::AXNode* node) { + GetFromAXNode(node)->OnUpdateFinished(); +} + +void BrowserAccessibilityManager::OnNodeChangeFinished(ui::AXNode* node) { + GetFromAXNode(node)->OnUpdateFinished(); +} + +} // namespace content diff --git a/content/browser/accessibility/accessibility_mode_browsertest.cc b/content/browser/accessibility/accessibility_mode_browsertest.cc index 5e191bd..9e85a9a 100644 --- a/content/browser/accessibility/accessibility_mode_browsertest.cc +++ b/content/browser/accessibility/accessibility_mode_browsertest.cc @@ -5,6 +5,7 @@ #include "content/browser/renderer_host/render_view_host_impl.h" #include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" +#include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host.h" #include "content/public/browser/render_widget_host_view.h" @@ -23,29 +24,20 @@ const char kMinimalPageDataURL[] = class AccessibilityModeTest : public ContentBrowserTest { protected: - WebContents* web_contents() { - return shell()->web_contents(); - } - - RenderWidgetHostImpl* rwhi() { - RenderWidgetHost* rwh = - web_contents()->GetRenderWidgetHostView()->GetRenderWidgetHost(); - return RenderWidgetHostImpl::From(rwh); - } - - RenderWidgetHostViewBase* host_view() { - return static_cast<RenderWidgetHostViewBase*>( - shell()->web_contents()->GetRenderWidgetHostView()); + WebContentsImpl* web_contents() { + return static_cast<WebContentsImpl*>(shell()->web_contents()); } void ExpectBrowserAccessibilityManager(bool expect_bam, std::string message = "") { if (expect_bam) { - EXPECT_NE((BrowserAccessibilityManager*)NULL, - host_view()->GetBrowserAccessibilityManager()) << message; + EXPECT_NE( + (BrowserAccessibilityManager*)NULL, + web_contents()->GetRootBrowserAccessibilityManager()) << message; } else { - EXPECT_EQ((BrowserAccessibilityManager*)NULL, - host_view()->GetBrowserAccessibilityManager()) << message; + EXPECT_EQ( + (BrowserAccessibilityManager*)NULL, + web_contents()->GetRootBrowserAccessibilityManager()) << message; } } }; @@ -53,28 +45,28 @@ class AccessibilityModeTest : public ContentBrowserTest { IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, AccessibilityModeOff) { NavigateToURL(shell(), GURL(kMinimalPageDataURL)); - EXPECT_EQ(AccessibilityModeOff, rwhi()->accessibility_mode()); + EXPECT_EQ(AccessibilityModeOff, web_contents()->GetAccessibilityMode()); ExpectBrowserAccessibilityManager(false); } IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, AccessibilityModeComplete) { NavigateToURL(shell(), GURL(kMinimalPageDataURL)); - ASSERT_EQ(AccessibilityModeOff, rwhi()->accessibility_mode()); + ASSERT_EQ(AccessibilityModeOff, web_contents()->GetAccessibilityMode()); AccessibilityNotificationWaiter waiter(shell()); - rwhi()->AddAccessibilityMode(AccessibilityModeComplete); - EXPECT_EQ(AccessibilityModeComplete, rwhi()->accessibility_mode()); + web_contents()->AddAccessibilityMode(AccessibilityModeComplete); + EXPECT_EQ(AccessibilityModeComplete, web_contents()->GetAccessibilityMode()); waiter.WaitForNotification(); ExpectBrowserAccessibilityManager(true); } IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, AccessibilityModeTreeOnly) { NavigateToURL(shell(), GURL(kMinimalPageDataURL)); - ASSERT_EQ(AccessibilityModeOff, rwhi()->accessibility_mode()); + ASSERT_EQ(AccessibilityModeOff, web_contents()->GetAccessibilityMode()); AccessibilityNotificationWaiter waiter(shell()); - rwhi()->AddAccessibilityMode(AccessibilityModeTreeOnly); - EXPECT_EQ(AccessibilityModeTreeOnly, rwhi()->accessibility_mode()); + web_contents()->AddAccessibilityMode(AccessibilityModeTreeOnly); + EXPECT_EQ(AccessibilityModeTreeOnly, web_contents()->GetAccessibilityMode()); waiter.WaitForNotification(); // No BrowserAccessibilityManager expected for AccessibilityModeTreeOnly ExpectBrowserAccessibilityManager(false); @@ -84,16 +76,16 @@ IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, AddingModes) { NavigateToURL(shell(), GURL(kMinimalPageDataURL)); AccessibilityNotificationWaiter waiter(shell()); - rwhi()->AddAccessibilityMode(AccessibilityModeTreeOnly); - EXPECT_EQ(AccessibilityModeTreeOnly, rwhi()->accessibility_mode()); + web_contents()->AddAccessibilityMode(AccessibilityModeTreeOnly); + EXPECT_EQ(AccessibilityModeTreeOnly, web_contents()->GetAccessibilityMode()); waiter.WaitForNotification(); ExpectBrowserAccessibilityManager(false, "Should be no BrowserAccessibilityManager " "for AccessibilityModeTreeOnly"); AccessibilityNotificationWaiter waiter2(shell()); - rwhi()->AddAccessibilityMode(AccessibilityModeComplete); - EXPECT_EQ(AccessibilityModeComplete, rwhi()->accessibility_mode()); + web_contents()->AddAccessibilityMode(AccessibilityModeComplete); + EXPECT_EQ(AccessibilityModeComplete, web_contents()->GetAccessibilityMode()); waiter2.WaitForNotification(); ExpectBrowserAccessibilityManager(true, "Should be a BrowserAccessibilityManager " diff --git a/content/browser/accessibility/accessibility_mode_helper.cc b/content/browser/accessibility/accessibility_mode_helper.cc index 7988595..a8cacb3 100644 --- a/content/browser/accessibility/accessibility_mode_helper.cc +++ b/content/browser/accessibility/accessibility_mode_helper.cc @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/logging.h" #include "content/browser/accessibility/accessibility_mode_helper.h" #if defined(OS_WIN) diff --git a/content/browser/accessibility/accessibility_mode_helper.h b/content/browser/accessibility/accessibility_mode_helper.h index c12c206..3885ddc 100644 --- a/content/browser/accessibility/accessibility_mode_helper.h +++ b/content/browser/accessibility/accessibility_mode_helper.h @@ -5,8 +5,8 @@ #ifndef CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_MODE_HELPER_H_ #define CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_MODE_HELPER_H_ +#include "content/common/accessibility_mode_enums.h" #include "content/common/content_export.h" -#include "content/common/view_message_enums.h" namespace content { diff --git a/content/browser/accessibility/accessibility_tree_formatter.cc b/content/browser/accessibility/accessibility_tree_formatter.cc index cca61a5..97ce7fe 100644 --- a/content/browser/accessibility/accessibility_tree_formatter.cc +++ b/content/browser/accessibility/accessibility_tree_formatter.cc @@ -12,7 +12,7 @@ #include "base/strings/utf_string_conversions.h" #include "content/browser/accessibility/browser_accessibility_manager.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" -#include "content/public/browser/render_view_host.h" +#include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/web_contents.h" namespace content { @@ -30,12 +30,10 @@ AccessibilityTreeFormatter::AccessibilityTreeFormatter( // static AccessibilityTreeFormatter* AccessibilityTreeFormatter::Create( - RenderViewHost* rvh) { - RenderWidgetHostViewBase* host_view = static_cast<RenderWidgetHostViewBase*>( - WebContents::FromRenderViewHost(rvh)->GetRenderWidgetHostView()); - + WebContents* web_contents) { BrowserAccessibilityManager* manager = - host_view->GetBrowserAccessibilityManager(); + static_cast<WebContentsImpl*>(web_contents)-> + GetRootBrowserAccessibilityManager(); if (!manager) return NULL; diff --git a/content/browser/accessibility/accessibility_tree_formatter.h b/content/browser/accessibility/accessibility_tree_formatter.h index a290886..39c6a4aa 100644 --- a/content/browser/accessibility/accessibility_tree_formatter.h +++ b/content/browser/accessibility/accessibility_tree_formatter.h @@ -16,7 +16,7 @@ namespace content { -class RenderViewHost; +class WebContents; // A utility class for formatting platform-specific accessibility information, // for use in testing, debugging, and developer tools. @@ -27,7 +27,7 @@ class CONTENT_EXPORT AccessibilityTreeFormatter { explicit AccessibilityTreeFormatter(BrowserAccessibility* root); virtual ~AccessibilityTreeFormatter(); - static AccessibilityTreeFormatter* Create(RenderViewHost* rvh); + static AccessibilityTreeFormatter* Create(WebContents* wc); // Populates the given DictionaryValue with the accessibility tree. // The dictionary contains a key/value pair for each attribute of the node, diff --git a/content/browser/accessibility/accessibility_ui.cc b/content/browser/accessibility/accessibility_ui.cc index 628c545..155a1e9 100644 --- a/content/browser/accessibility/accessibility_ui.cc +++ b/content/browser/accessibility/accessibility_ui.cc @@ -15,6 +15,7 @@ #include "content/browser/accessibility/browser_accessibility_state_impl.h" #include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" +#include "content/browser/web_contents/web_contents_impl.h" #include "content/common/view_message_enums.h" #include "content/public/browser/favicon_status.h" #include "content/public/browser/navigation_entry.h" @@ -63,11 +64,11 @@ base::DictionaryValue* BuildTargetDescriptor( } base::DictionaryValue* BuildTargetDescriptor(RenderViewHost* rvh) { - WebContents* web_contents = WebContents::FromRenderViewHost(rvh); - std::string title; - RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(rvh); - AccessibilityMode accessibility_mode = rwhi->accessibility_mode(); + WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( + WebContents::FromRenderViewHost(rvh)); + AccessibilityMode accessibility_mode = web_contents->GetAccessibilityMode(); + std::string title; GURL url; GURL favicon_url; if (web_contents) { @@ -178,14 +179,15 @@ void AccessibilityUI::ToggleAccessibility(const base::ListValue* args) { RenderViewHost* rvh = RenderViewHost::FromID(process_id, route_id); if (!rvh) return; - RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(rvh); - if (!rwhi) - return; - AccessibilityMode mode = rwhi->accessibility_mode(); - if ((mode & AccessibilityModeComplete) != AccessibilityModeComplete) - rwhi->AddAccessibilityMode(AccessibilityModeComplete); - else - rwhi->ResetAccessibilityMode(); + WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( + WebContents::FromRenderViewHost(rvh)); + AccessibilityMode mode = web_contents->GetAccessibilityMode(); + if ((mode & AccessibilityModeComplete) != AccessibilityModeComplete) { + web_contents->AddAccessibilityMode(AccessibilityModeComplete); + } else { + web_contents->SetAccessibilityMode( + BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode()); + } } void AccessibilityUI::ToggleGlobalAccessibility(const base::ListValue* args) { @@ -220,25 +222,10 @@ void AccessibilityUI::RequestAccessibilityTree(const base::ListValue* args) { } scoped_ptr<base::DictionaryValue> result(BuildTargetDescriptor(rvh)); - RenderWidgetHostViewBase* host_view = static_cast<RenderWidgetHostViewBase*>( - WebContents::FromRenderViewHost(rvh)->GetRenderWidgetHostView()); - if (!host_view) { - result->Set("error", - new base::StringValue("Could not get accessibility tree.")); - web_ui()->CallJavascriptFunction("accessibility.showTree", *(result.get())); - return; - } + WebContents* web_contents = WebContents::FromRenderViewHost(rvh); scoped_ptr<AccessibilityTreeFormatter> formatter( - AccessibilityTreeFormatter::Create(rvh)); + AccessibilityTreeFormatter::Create(web_contents)); base::string16 accessibility_contents_utf16; - BrowserAccessibilityManager* manager = - host_view->GetBrowserAccessibilityManager(); - if (!manager) { - result->Set("error", - new base::StringValue("Could not get accessibility tree.")); - web_ui()->CallJavascriptFunction("accessibility.showTree", *(result.get())); - return; - } std::vector<AccessibilityTreeFormatter::Filter> filters; filters.push_back(AccessibilityTreeFormatter::Filter( base::ASCIIToUTF16("*"), diff --git a/content/browser/accessibility/android_hit_testing_browsertest.cc b/content/browser/accessibility/android_hit_testing_browsertest.cc index 1070f6e..1e54cd8 100644 --- a/content/browser/accessibility/android_hit_testing_browsertest.cc +++ b/content/browser/accessibility/android_hit_testing_browsertest.cc @@ -17,8 +17,7 @@ #include "content/browser/accessibility/accessibility_tree_formatter.h" #include "content/browser/accessibility/browser_accessibility.h" #include "content/browser/accessibility/browser_accessibility_manager.h" -#include "content/browser/renderer_host/render_view_host_impl.h" -#include "content/browser/renderer_host/render_widget_host_view_base.h" +#include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_paths.h" #include "content/public/common/content_switches.h" @@ -59,10 +58,10 @@ IN_PROC_BROWSER_TEST_F(AndroidHitTestingBrowserTest, waiter.WaitForNotification(); // Get the BrowserAccessibilityManager. - RenderWidgetHostViewBase* host_view = static_cast<RenderWidgetHostViewBase*>( - shell()->web_contents()->GetRenderWidgetHostView()); + WebContentsImpl* web_contents = + static_cast<WebContentsImpl*>(shell()->web_contents()); BrowserAccessibilityManager* manager = - host_view->GetBrowserAccessibilityManager(); + web_contents->GetRootBrowserAccessibilityManager(); // Send a hit test request, and wait for the hover event in response. AccessibilityNotificationWaiter hover_waiter( diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm index 2ed21f4..bdc96d3 100644 --- a/content/browser/accessibility/browser_accessibility_cocoa.mm +++ b/content/browser/accessibility/browser_accessibility_cocoa.mm @@ -1550,7 +1550,12 @@ NSDictionary* attributeToMethodNameMap = nil; [self delegate]->AccessibilityDoDefaultAction( browserAccessibility_->GetId()); } else if ([action isEqualToString:NSAccessibilityShowMenuAction]) { - [self delegate]->AccessibilityShowMenu(browserAccessibility_->GetId()); + NSPoint objOrigin = [self origin]; + NSSize size = [[self size] sizeValue]; + gfx::Point origin = [self delegate]->AccessibilityOriginInScreen( + gfx::Rect(objOrigin.x, objOrigin.y, size.width, size.height)); + origin.Offset(size.width / 2, size.height / 2); + [self delegate]->AccessibilityShowMenu(origin); } } @@ -1575,10 +1580,11 @@ NSDictionary* attributeToMethodNameMap = nil; return; if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) { + BrowserAccessibilityManager* manager = browserAccessibility_->manager(); NSNumber* focusedNumber = value; BOOL focused = [focusedNumber intValue]; if (focused) - [self delegate]->AccessibilitySetFocus(browserAccessibility_->GetId()); + manager->SetFocus(browserAccessibility_, true); } if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute]) { NSRange range = [(NSValue*)value rangeValue]; diff --git a/content/browser/accessibility/browser_accessibility_manager.h b/content/browser/accessibility/browser_accessibility_manager.h index ae0bc30..4898e4e 100644 --- a/content/browser/accessibility/browser_accessibility_manager.h +++ b/content/browser/accessibility/browser_accessibility_manager.h @@ -47,11 +47,11 @@ class CONTENT_EXPORT BrowserAccessibilityDelegate { virtual ~BrowserAccessibilityDelegate() {} virtual void AccessibilitySetFocus(int acc_obj_id) = 0; virtual void AccessibilityDoDefaultAction(int acc_obj_id) = 0; - virtual void AccessibilityShowMenu(int acc_obj_id) = 0; + virtual void AccessibilityShowMenu(const gfx::Point& global_point) = 0; virtual void AccessibilityScrollToMakeVisible( - int acc_obj_id, gfx::Rect subfocus) = 0; + int acc_obj_id, const gfx::Rect& subfocus) = 0; virtual void AccessibilityScrollToPoint( - int acc_obj_id, gfx::Point point) = 0; + int acc_obj_id, const gfx::Point& point) = 0; virtual void AccessibilitySetTextSelection( int acc_obj_id, int start_offset, int end_offset) = 0; virtual bool AccessibilityViewHasFocus() const = 0; @@ -183,6 +183,9 @@ class CONTENT_EXPORT BrowserAccessibilityManager : public ui::AXTreeDelegate { virtual void OnRootChanged(ui::AXNode* new_root) OVERRIDE {} BrowserAccessibilityDelegate* delegate() const { return delegate_; } + void set_delegate(BrowserAccessibilityDelegate* delegate) { + delegate_ = delegate; + } protected: BrowserAccessibilityManager( diff --git a/content/browser/accessibility/browser_accessibility_manager_unittest.cc b/content/browser/accessibility/browser_accessibility_manager_unittest.cc index ddff85f..55925e1 100644 --- a/content/browser/accessibility/browser_accessibility_manager_unittest.cc +++ b/content/browser/accessibility/browser_accessibility_manager_unittest.cc @@ -69,11 +69,11 @@ class TestBrowserAccessibilityDelegate virtual void AccessibilitySetFocus(int acc_obj_id) OVERRIDE {} virtual void AccessibilityDoDefaultAction(int acc_obj_id) OVERRIDE {} - virtual void AccessibilityShowMenu(int acc_obj_id) OVERRIDE {} + virtual void AccessibilityShowMenu(const gfx::Point& point) OVERRIDE {} virtual void AccessibilityScrollToMakeVisible( - int acc_obj_id, gfx::Rect subfocus) OVERRIDE {} + int acc_obj_id, const gfx::Rect& subfocus) OVERRIDE {} virtual void AccessibilityScrollToPoint( - int acc_obj_id, gfx::Point point) OVERRIDE {} + int acc_obj_id, const gfx::Point& point) OVERRIDE {} virtual void AccessibilitySetTextSelection( int acc_obj_id, int start_offset, int end_offset) OVERRIDE {} virtual bool AccessibilityViewHasFocus() const OVERRIDE { diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc index 0bb3b60..05e2fd5 100644 --- a/content/browser/accessibility/browser_accessibility_manager_win.cc +++ b/content/browser/accessibility/browser_accessibility_manager_win.cc @@ -55,7 +55,7 @@ BrowserAccessibilityManagerWin::~BrowserAccessibilityManagerWin() { tracked_scroll_object_ = NULL; } if (accessible_hwnd_) - accessible_hwnd_->OnManagerDeleted(); + accessible_hwnd_->OnManagerDeleted(this); } // static @@ -75,7 +75,11 @@ ui::AXTreeUpdate BrowserAccessibilityManagerWin::GetEmptyDocument() { void BrowserAccessibilityManagerWin::SetAccessibleHWND( LegacyRenderWidgetHostHWND* accessible_hwnd) { + if (accessible_hwnd_) + accessible_hwnd_->OnManagerDeleted(this); + accessible_hwnd_ = accessible_hwnd; + if (accessible_hwnd_) { accessible_hwnd_->set_browser_accessibility_manager(this); parent_hwnd_ = accessible_hwnd_->GetParent(); diff --git a/content/browser/accessibility/browser_accessibility_state_impl.cc b/content/browser/accessibility/browser_accessibility_state_impl.cc index f45c31d..7fdab1a 100644 --- a/content/browser/accessibility/browser_accessibility_state_impl.cc +++ b/content/browser/accessibility/browser_accessibility_state_impl.cc @@ -9,9 +9,8 @@ #include "base/timer/timer.h" #include "content/browser/accessibility/accessibility_mode_helper.h" #include "content/browser/renderer_host/render_widget_host_impl.h" +#include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/browser_thread.h" -#include "content/public/browser/render_process_host.h" -#include "content/public/browser/render_widget_host_iterator.h" #include "content/public/common/content_switches.h" #include "ui/gfx/sys_color_change_listener.h" @@ -99,20 +98,10 @@ void BrowserAccessibilityStateImpl::ResetAccessibilityModeValue() { void BrowserAccessibilityStateImpl::ResetAccessibilityMode() { ResetAccessibilityModeValue(); - // Iterate over all RenderWidgetHosts, even swapped out ones in case - // they become active again. - scoped_ptr<RenderWidgetHostIterator> widgets( - RenderWidgetHostImpl::GetAllRenderWidgetHosts()); - while (RenderWidgetHost* widget = widgets->GetNextHost()) { - // Ignore processes that don't have a connection, such as crashed tabs. - if (!widget->GetProcess()->HasConnection()) - continue; - if (!widget->IsRenderView()) - continue; - - RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); - rwhi->ResetAccessibilityMode(); - } + std::vector<WebContentsImpl*> web_contents_vector = + WebContentsImpl::GetAllWebContents(); + for (size_t i = 0; i < web_contents_vector.size(); ++i) + web_contents_vector[i]->SetAccessibilityMode(accessibility_mode()); } bool BrowserAccessibilityStateImpl::IsAccessibleBrowser() { @@ -158,7 +147,7 @@ void BrowserAccessibilityStateImpl::AddAccessibilityMode( accessibility_mode_ = content::AddAccessibilityModeTo(accessibility_mode_, mode); - AddOrRemoveFromRenderWidgets(mode, true); + AddOrRemoveFromAllWebContents(mode, true); } void BrowserAccessibilityStateImpl::RemoveAccessibilityMode( @@ -172,28 +161,19 @@ void BrowserAccessibilityStateImpl::RemoveAccessibilityMode( accessibility_mode_ = content::RemoveAccessibilityModeFrom(accessibility_mode_, mode); - AddOrRemoveFromRenderWidgets(mode, false); + AddOrRemoveFromAllWebContents(mode, false); } -void BrowserAccessibilityStateImpl::AddOrRemoveFromRenderWidgets( +void BrowserAccessibilityStateImpl::AddOrRemoveFromAllWebContents( AccessibilityMode mode, bool add) { - // Iterate over all RenderWidgetHosts, even swapped out ones in case - // they become active again. - scoped_ptr<RenderWidgetHostIterator> widgets( - RenderWidgetHostImpl::GetAllRenderWidgetHosts()); - while (RenderWidgetHost* widget = widgets->GetNextHost()) { - // Ignore processes that don't have a connection, such as crashed tabs. - if (!widget->GetProcess()->HasConnection()) - continue; - if (!widget->IsRenderView()) - continue; - - RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); + std::vector<WebContentsImpl*> web_contents_vector = + WebContentsImpl::GetAllWebContents(); + for (size_t i = 0; i < web_contents_vector.size(); ++i) { if (add) - rwhi->AddAccessibilityMode(mode); + web_contents_vector[i]->AddAccessibilityMode(mode); else - rwhi->RemoveAccessibilityMode(mode); + web_contents_vector[i]->RemoveAccessibilityMode(mode); } } diff --git a/content/browser/accessibility/browser_accessibility_state_impl.h b/content/browser/accessibility/browser_accessibility_state_impl.h index 2a1b1c6..6529d2d 100644 --- a/content/browser/accessibility/browser_accessibility_state_impl.h +++ b/content/browser/accessibility/browser_accessibility_state_impl.h @@ -10,7 +10,7 @@ #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/singleton.h" -#include "content/common/view_message_enums.h" +#include "content/common/accessibility_mode_enums.h" #include "content/public/browser/browser_accessibility_state.h" namespace content { @@ -76,9 +76,9 @@ class CONTENT_EXPORT BrowserAccessibilityStateImpl void UpdatePlatformSpecificHistograms(); - // Updates the accessibility mode of all render widgets, including swapped out + // Updates the accessibility mode of all web contents, including swapped out // ones. |add| specifies whether the mode should be added or removed. - void AddOrRemoveFromRenderWidgets(AccessibilityMode mode, bool add); + void AddOrRemoveFromAllWebContents(AccessibilityMode mode, bool add); AccessibilityMode accessibility_mode_; diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index 543b06c..b97da81 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc @@ -19,6 +19,7 @@ #include "content/browser/accessibility/browser_accessibility_manager.h" #include "content/browser/renderer_host/render_view_host_impl.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" +#include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_paths.h" #include "content/public/common/content_switches.h" @@ -181,10 +182,10 @@ void DumpAccessibilityTreeTest::RunTest( NavigateToURL(shell(), url); waiter.WaitForNotification(); - RenderWidgetHostViewBase* host_view = static_cast<RenderWidgetHostViewBase*>( - shell()->web_contents()->GetRenderWidgetHostView()); + WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( + shell()->web_contents()); AccessibilityTreeFormatter formatter( - host_view->GetBrowserAccessibilityManager()->GetRoot()); + web_contents->GetRootBrowserAccessibilityManager()->GetRoot()); // Parse filters in the test file. std::vector<Filter> filters; diff --git a/content/browser/android/content_view_core_impl.cc b/content/browser/android/content_view_core_impl.cc index dabf69c9..6f54245 100644 --- a/content/browser/android/content_view_core_impl.cc +++ b/content/browser/android/content_view_core_impl.cc @@ -17,6 +17,7 @@ #include "cc/layers/layer.h" #include "cc/layers/solid_color_layer.h" #include "cc/output/begin_frame_args.h" +#include "content/browser/accessibility/browser_accessibility_state_impl.h" #include "content/browser/android/gesture_event_type.h" #include "content/browser/android/interstitial_page_delegate_android.h" #include "content/browser/android/java/gin_java_bridge_dispatcher_host.h" @@ -41,7 +42,6 @@ #include "content/common/input/web_input_event_traits.h" #include "content/common/input_messages.h" #include "content/common/view_messages.h" -#include "content/public/browser/browser_accessibility_state.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/favicon_status.h" @@ -1513,24 +1513,21 @@ bool ContentViewCoreImpl::IsFullscreenRequiredForOrientationLock() const { void ContentViewCoreImpl::SetAccessibilityEnabledInternal(bool enabled) { accessibility_enabled_ = enabled; - RenderWidgetHostViewAndroid* host_view = GetRenderWidgetHostViewAndroid(); - if (!host_view) - return; - RenderWidgetHostImpl* host_impl = RenderWidgetHostImpl::From( - host_view->GetRenderWidgetHost()); - BrowserAccessibilityState* accessibility_state = - BrowserAccessibilityState::GetInstance(); + BrowserAccessibilityStateImpl* accessibility_state = + BrowserAccessibilityStateImpl::GetInstance(); if (enabled) { // This enables accessibility globally unless it was explicitly disallowed // by a command-line flag. accessibility_state->OnScreenReaderDetected(); // If it was actually enabled globally, enable it for this RenderWidget now. - if (accessibility_state->IsAccessibleBrowser() && host_impl) - host_impl->AddAccessibilityMode(AccessibilityModeComplete); + if (accessibility_state->IsAccessibleBrowser() && web_contents_) + web_contents_->AddAccessibilityMode(AccessibilityModeComplete); } else { accessibility_state->ResetAccessibilityMode(); - if (host_impl) - host_impl->ResetAccessibilityMode(); + if (web_contents_) { + web_contents_->SetAccessibilityMode( + accessibility_state->accessibility_mode()); + } } } diff --git a/content/browser/frame_host/interstitial_page_impl.cc b/content/browser/frame_host/interstitial_page_impl.cc index a4ea299..1a1ed43 100644 --- a/content/browser/frame_host/interstitial_page_impl.cc +++ b/content/browser/frame_host/interstitial_page_impl.cc @@ -432,6 +432,13 @@ void InterstitialPageImpl::UpdateTitle( controller_->delegate()->NotifyNavigationStateChanged(INVALIDATE_TYPE_TITLE); } +AccessibilityMode InterstitialPageImpl::GetAccessibilityMode() const { + if (web_contents_) + return static_cast<WebContentsImpl*>(web_contents_)->GetAccessibilityMode(); + else + return AccessibilityModeOff; +} + RenderViewHostDelegateView* InterstitialPageImpl::GetDelegateView() { return rvh_delegate_view_.get(); } @@ -533,7 +540,11 @@ void InterstitialPageImpl::HandleKeyboardEvent( #if defined(OS_WIN) gfx::NativeViewAccessible InterstitialPageImpl::GetParentNativeViewAccessible() { - return render_widget_host_delegate_->GetParentNativeViewAccessible(); + if (web_contents_) { + WebContentsImpl* wci = static_cast<WebContentsImpl*>(web_contents_); + return wci->GetParentNativeViewAccessible(); + } + return NULL; } #endif diff --git a/content/browser/frame_host/interstitial_page_impl.h b/content/browser/frame_host/interstitial_page_impl.h index 8068fd3..7f2d4d7 100644 --- a/content/browser/frame_host/interstitial_page_impl.h +++ b/content/browser/frame_host/interstitial_page_impl.h @@ -119,6 +119,7 @@ class CONTENT_EXPORT InterstitialPageImpl int32 page_id, const base::string16& title, base::i18n::TextDirection title_direction) OVERRIDE; + virtual AccessibilityMode GetAccessibilityMode() const OVERRIDE; // RenderViewHostDelegate implementation: virtual RenderViewHostDelegateView* GetDelegateView() OVERRIDE; diff --git a/content/browser/frame_host/render_frame_host_delegate.cc b/content/browser/frame_host/render_frame_host_delegate.cc index d333185..f5d07e3 100644 --- a/content/browser/frame_host/render_frame_host_delegate.cc +++ b/content/browser/frame_host/render_frame_host_delegate.cc @@ -7,6 +7,7 @@ #include "base/callback.h" #include "base/strings/string16.h" #include "content/browser/frame_host/render_frame_host_delegate.h" +#include "ui/gfx/native_widget_types.h" #include "url/gurl.h" namespace content { @@ -43,4 +44,15 @@ void RenderFrameHostDelegate::RequestMediaAccessPermission( scoped_ptr<MediaStreamUI>()); } +AccessibilityMode RenderFrameHostDelegate::GetAccessibilityMode() const { + return AccessibilityModeOff; +} + +#if defined(OS_WIN) +gfx::NativeViewAccessible + RenderFrameHostDelegate::GetParentNativeViewAccessible() { + return NULL; +} +#endif // defined(OS_WIN) + } // namespace content diff --git a/content/browser/frame_host/render_frame_host_delegate.h b/content/browser/frame_host/render_frame_host_delegate.h index 4d53936..6150d46 100644 --- a/content/browser/frame_host/render_frame_host_delegate.h +++ b/content/browser/frame_host/render_frame_host_delegate.h @@ -5,12 +5,19 @@ #ifndef CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_DELEGATE_H_ #define CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_DELEGATE_H_ +#include <vector> + #include "base/basictypes.h" #include "base/i18n/rtl.h" #include "content/common/content_export.h" +#include "content/common/frame_message_enums.h" #include "content/public/common/javascript_message_type.h" #include "content/public/common/media_stream_request.h" +#if defined(OS_WIN) +#include "ui/gfx/native_widget_types.h" +#endif + class GURL; namespace IPC { @@ -20,6 +27,7 @@ class Message; namespace content { class RenderFrameHost; class WebContents; +struct AXEventNotificationDetails; struct ContextMenuParams; // An interface implemented by an object interested in knowing about the state @@ -119,6 +127,18 @@ class CONTENT_EXPORT RenderFrameHostDelegate { const MediaStreamRequest& request, const MediaResponseCallback& callback); + // Get the accessibility mode for the WebContents that owns this frame. + virtual AccessibilityMode GetAccessibilityMode() const; + + // Invoked when an accessibility event is received from the renderer. + virtual void AccessibilityEventReceived( + const std::vector<AXEventNotificationDetails>& details) {} + +#if defined(OS_WIN) + // Returns the frame's parent's NativeViewAccessible. + virtual gfx::NativeViewAccessible GetParentNativeViewAccessible(); +#endif + protected: virtual ~RenderFrameHostDelegate() {} }; diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index 7e017ee..72dcc54 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc @@ -9,6 +9,9 @@ #include "base/lazy_instance.h" #include "base/metrics/user_metrics_action.h" #include "base/time/time.h" +#include "content/browser/accessibility/accessibility_mode_helper.h" +#include "content/browser/accessibility/browser_accessibility_manager.h" +#include "content/browser/accessibility/browser_accessibility_state_impl.h" #include "content/browser/child_process_security_policy_impl.h" #include "content/browser/frame_host/cross_process_frame_connector.h" #include "content/browser/frame_host/cross_site_transferring_request.h" @@ -22,13 +25,17 @@ #include "content/browser/renderer_host/render_process_host_impl.h" #include "content/browser/renderer_host/render_view_host_impl.h" #include "content/browser/renderer_host/render_widget_host_impl.h" +#include "content/browser/renderer_host/render_widget_host_view_base.h" #include "content/browser/transition_request_manager.h" +#include "content/common/accessibility_messages.h" #include "content/common/desktop_notification_messages.h" #include "content/common/frame_messages.h" #include "content/common/input_messages.h" #include "content/common/inter_process_time_ticks_converter.h" #include "content/common/render_frame_setup.mojom.h" #include "content/common/swapped_out_messages.h" +#include "content/public/browser/ax_event_notification_details.h" +#include "content/public/browser/browser_accessibility_state.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/content_browser_client.h" #include "content/public/browser/desktop_notification_delegate.h" @@ -38,6 +45,7 @@ #include "content/public/common/content_constants.h" #include "content/public/common/url_constants.h" #include "content/public/common/url_utils.h" +#include "ui/accessibility/ax_tree.h" #include "url/gurl.h" using base::TimeDelta; @@ -346,11 +354,80 @@ bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { OnCancelDesktopNotification) IPC_MESSAGE_HANDLER(FrameHostMsg_TextSurroundingSelectionResponse, OnTextSurroundingSelectionResponse) + IPC_MESSAGE_HANDLER(AccessibilityHostMsg_Events, OnAccessibilityEvents) + IPC_MESSAGE_HANDLER(AccessibilityHostMsg_LocationChanges, + OnAccessibilityLocationChanges) IPC_END_MESSAGE_MAP() return handled; } +void RenderFrameHostImpl::AccessibilitySetFocus(int object_id) { + Send(new AccessibilityMsg_SetFocus(routing_id_, object_id)); +} + +void RenderFrameHostImpl::AccessibilityDoDefaultAction(int object_id) { + Send(new AccessibilityMsg_DoDefaultAction(routing_id_, object_id)); +} + +void RenderFrameHostImpl::AccessibilityShowMenu( + const gfx::Point& global_point) { + RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( + render_view_host_->GetView()); + if (view) + view->AccessibilityShowMenu(global_point); +} + +void RenderFrameHostImpl::AccessibilityScrollToMakeVisible( + int acc_obj_id, const gfx::Rect& subfocus) { + Send(new AccessibilityMsg_ScrollToMakeVisible( + routing_id_, acc_obj_id, subfocus)); +} + +void RenderFrameHostImpl::AccessibilityScrollToPoint( + int acc_obj_id, const gfx::Point& point) { + Send(new AccessibilityMsg_ScrollToPoint( + routing_id_, acc_obj_id, point)); +} + +void RenderFrameHostImpl::AccessibilitySetTextSelection( + int object_id, int start_offset, int end_offset) { + Send(new AccessibilityMsg_SetTextSelection( + routing_id_, object_id, start_offset, end_offset)); +} + +bool RenderFrameHostImpl::AccessibilityViewHasFocus() const { + RenderWidgetHostView* view = render_view_host_->GetView(); + if (view) + return view->HasFocus(); + return false; +} + +gfx::Rect RenderFrameHostImpl::AccessibilityGetViewBounds() const { + RenderWidgetHostView* view = render_view_host_->GetView(); + if (view) + return view->GetViewBounds(); + return gfx::Rect(); +} + +gfx::Point RenderFrameHostImpl::AccessibilityOriginInScreen( + const gfx::Rect& bounds) const { + RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( + render_view_host_->GetView()); + if (view) + return view->AccessibilityOriginInScreen(bounds); + return gfx::Point(); +} + +void RenderFrameHostImpl::AccessibilityHitTest(const gfx::Point& point) { + Send(new AccessibilityMsg_HitTest(routing_id_, point)); +} + +void RenderFrameHostImpl::AccessibilityFatalError() { + Send(new AccessibilityMsg_FatalError(routing_id_)); + browser_accessibility_manager_.reset(NULL); +} + void RenderFrameHostImpl::Init() { GetProcess()->ResumeRequestsForView(routing_id_); } @@ -772,6 +849,7 @@ void RenderFrameHostImpl::OnUpdateEncoding(const std::string& encoding_name) { delegate_->UpdateEncoding(this, encoding_name); } + void RenderFrameHostImpl::OnBeginNavigation( const FrameHostMsg_BeginNavigation_Params& params) { #if defined(USE_BROWSER_SIDE_NAVIGATION) @@ -779,6 +857,78 @@ void RenderFrameHostImpl::OnBeginNavigation( #endif } +void RenderFrameHostImpl::OnAccessibilityEvents( + const std::vector<AccessibilityHostMsg_EventParams>& params) { + RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( + render_view_host_->GetView()); + + + AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); + if ((accessibility_mode != AccessibilityModeOff) && view && + RenderViewHostImpl::IsRVHStateActive(render_view_host_->rvh_state())) { + if (accessibility_mode & AccessibilityModeFlagPlatform) { + GetOrCreateBrowserAccessibilityManager(); + if (browser_accessibility_manager_) + browser_accessibility_manager_->OnAccessibilityEvents(params); + } + + std::vector<AXEventNotificationDetails> details; + details.reserve(params.size()); + for (size_t i = 0; i < params.size(); ++i) { + const AccessibilityHostMsg_EventParams& param = params[i]; + AXEventNotificationDetails detail(param.update.node_id_to_clear, + param.update.nodes, + param.event_type, + param.id, + GetProcess()->GetID(), + routing_id_); + details.push_back(detail); + } + + delegate_->AccessibilityEventReceived(details); + } + + // Always send an ACK or the renderer can be in a bad state. + Send(new AccessibilityMsg_Events_ACK(routing_id_)); + + // The rest of this code is just for testing; bail out if we're not + // in that mode. + if (accessibility_testing_callback_.is_null()) + return; + + for (size_t i = 0; i < params.size(); i++) { + const AccessibilityHostMsg_EventParams& param = params[i]; + if (static_cast<int>(param.event_type) < 0) + continue; + if (!ax_tree_for_testing_) { + ax_tree_for_testing_.reset(new ui::AXTree(param.update)); + } else { + CHECK(ax_tree_for_testing_->Unserialize(param.update)) + << ax_tree_for_testing_->error(); + } + accessibility_testing_callback_.Run(param.event_type, param.id); + } +} + +void RenderFrameHostImpl::OnAccessibilityLocationChanges( + const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { + RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( + render_view_host_->GetView()); + if (view && + RenderViewHostImpl::IsRVHStateActive(render_view_host_->rvh_state())) { + AccessibilityMode accessibility_mode = delegate_->GetAccessibilityMode(); + if (accessibility_mode & AccessibilityModeFlagPlatform) { + if (!browser_accessibility_manager_) { + browser_accessibility_manager_.reset( + view->CreateBrowserAccessibilityManager(this)); + } + if (browser_accessibility_manager_) + browser_accessibility_manager_->OnLocationChanges(params); + } + // TODO(aboxhall): send location change events to web contents observers too + } +} + void RenderFrameHostImpl::SetPendingShutdown(const base::Closure& on_swap_out) { render_view_host_->SetPendingShutdown(on_swap_out); } @@ -946,6 +1096,46 @@ void RenderFrameHostImpl::DesktopNotificationPermissionRequestDone( routing_id_, callback_context)); } +void RenderFrameHostImpl::SetAccessibilityMode(AccessibilityMode mode) { + Send(new FrameMsg_SetAccessibilityMode(routing_id_, mode)); +} + +void RenderFrameHostImpl::SetAccessibilityCallbackForTesting( + const base::Callback<void(ui::AXEvent, int)>& callback) { + accessibility_testing_callback_ = callback; +} + +const ui::AXTree* RenderFrameHostImpl::GetAXTreeForTesting() { + return ax_tree_for_testing_.get(); +} + +BrowserAccessibilityManager* + RenderFrameHostImpl::GetOrCreateBrowserAccessibilityManager() { + RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( + render_view_host_->GetView()); + if (view && + !browser_accessibility_manager_) { + browser_accessibility_manager_.reset( + view->CreateBrowserAccessibilityManager(this)); + } + return browser_accessibility_manager_.get(); +} + +#if defined(OS_WIN) +void RenderFrameHostImpl::SetParentNativeViewAccessible( + gfx::NativeViewAccessible accessible_parent) { + RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( + render_view_host_->GetView()); + if (view) + view->SetParentNativeViewAccessible(accessible_parent); +} + +gfx::NativeViewAccessible +RenderFrameHostImpl::GetParentNativeViewAccessible() const { + return delegate_->GetParentNativeViewAccessible(); +} +#endif // defined(OS_WIN) + void RenderFrameHostImpl::SetHasPendingTransitionRequest( bool has_pending_request) { BrowserThread::PostTask( diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index 86e05d6..0aeb37f 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h @@ -13,14 +13,19 @@ #include "base/memory/weak_ptr.h" #include "base/strings/string16.h" #include "base/time/time.h" +#include "content/browser/accessibility/browser_accessibility_manager.h" +#include "content/common/accessibility_mode_enums.h" #include "content/common/content_export.h" #include "content/common/mojo/service_registry_impl.h" #include "content/public/browser/render_frame_host.h" #include "content/public/common/javascript_message_type.h" #include "content/public/common/page_transition_types.h" #include "third_party/WebKit/public/web/WebTextDirection.h" +#include "ui/accessibility/ax_node_data.h" class GURL; +struct AccessibilityHostMsg_EventParams; +struct AccessibilityHostMsg_LocationChangeParams; struct FrameHostMsg_DidFailProvisionalLoadWithError_Params; struct FrameHostMsg_OpenURL_Params; struct FrameHostMsg_BeginNavigation_Params; @@ -47,7 +52,9 @@ struct GlobalRequestID; struct Referrer; struct ShowDesktopNotificationHostMsgParams; -class CONTENT_EXPORT RenderFrameHostImpl : public RenderFrameHost { +class CONTENT_EXPORT RenderFrameHostImpl + : public RenderFrameHost, + public BrowserAccessibilityDelegate { public: static RenderFrameHostImpl* FromID(int process_id, int routing_id); @@ -76,6 +83,23 @@ class CONTENT_EXPORT RenderFrameHostImpl : public RenderFrameHost { // IPC::Listener virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; + // BrowserAccessibilityDelegate + virtual void AccessibilitySetFocus(int acc_obj_id) OVERRIDE; + virtual void AccessibilityDoDefaultAction(int acc_obj_id) OVERRIDE; + virtual void AccessibilityShowMenu(const gfx::Point& global_point) OVERRIDE; + virtual void AccessibilityScrollToMakeVisible( + int acc_obj_id, const gfx::Rect& subfocus) OVERRIDE; + virtual void AccessibilityScrollToPoint( + int acc_obj_id, const gfx::Point& point) OVERRIDE; + virtual void AccessibilitySetTextSelection( + int acc_obj_id, int start_offset, int end_offset) OVERRIDE; + virtual bool AccessibilityViewHasFocus() const OVERRIDE; + virtual gfx::Rect AccessibilityGetViewBounds() const OVERRIDE; + virtual gfx::Point AccessibilityOriginInScreen(const gfx::Rect& bounds) + const OVERRIDE; + virtual void AccessibilityHitTest(const gfx::Point& point) OVERRIDE; + virtual void AccessibilityFatalError() OVERRIDE; + void Init(); int routing_id() const { return routing_id_; } void OnCreateChildFrame(int new_routing_id, @@ -179,6 +203,37 @@ class CONTENT_EXPORT RenderFrameHostImpl : public RenderFrameHost { // hear the response or commit. void SetHasPendingTransitionRequest(bool has_pending_request); + // Send a message to the renderer process to change the accessibility mode. + void SetAccessibilityMode(AccessibilityMode AccessibilityMode); + + // Turn on accessibility testing. The given callback will be run + // every time an accessibility notification is received from the + // renderer process, and the accessibility tree it sent can be + // retrieved using GetAXTreeForTesting(). + void SetAccessibilityCallbackForTesting( + const base::Callback<void(ui::AXEvent, int)>& callback); + + // Returns a snapshot of the accessibility tree received from the + // renderer as of the last time an accessibility notification was + // received. + const ui::AXTree* GetAXTreeForTesting(); + + // Access the BrowserAccessibilityManager if it already exists. + BrowserAccessibilityManager* browser_accessibility_manager() const { + return browser_accessibility_manager_.get(); + } + + // If accessibility is enabled, get the BrowserAccessibilityManager for + // this frame, or create one if it doesn't exist yet, otherwise return + // NULL. + BrowserAccessibilityManager* GetOrCreateBrowserAccessibilityManager(); + +#if defined(OS_WIN) + void SetParentNativeViewAccessible( + gfx::NativeViewAccessible accessible_parent); + gfx::NativeViewAccessible GetParentNativeViewAccessible() const; +#endif + protected: friend class RenderFrameHostFactory; @@ -249,6 +304,10 @@ class CONTENT_EXPORT RenderFrameHostImpl : public RenderFrameHost { void OnUpdateEncoding(const std::string& encoding); void OnBeginNavigation( const FrameHostMsg_BeginNavigation_Params& params); + void OnAccessibilityEvents( + const std::vector<AccessibilityHostMsg_EventParams>& params); + void OnAccessibilityLocationChanges( + const std::vector<AccessibilityHostMsg_LocationChangeParams>& params); // Returns whether the given URL is allowed to commit in the current process. // This is a more conservative check than RenderProcessHost::FilterURL, since @@ -310,6 +369,13 @@ class CONTENT_EXPORT RenderFrameHostImpl : public RenderFrameHost { base::WeakPtrFactory<RenderFrameHostImpl> weak_ptr_factory_; + scoped_ptr<BrowserAccessibilityManager> browser_accessibility_manager_; + + // Callback when an event is received, for testing. + base::Callback<void(ui::AXEvent, int)> accessibility_testing_callback_; + // The most recently received accessibility tree - for testing only. + scoped_ptr<ui::AXTree> ax_tree_for_testing_; + DISALLOW_COPY_AND_ASSIGN(RenderFrameHostImpl); }; diff --git a/content/browser/renderer_host/legacy_render_widget_host_win.cc b/content/browser/renderer_host/legacy_render_widget_host_win.cc index 9c2e1a2..db8ca80 100644 --- a/content/browser/renderer_host/legacy_render_widget_host_win.cc +++ b/content/browser/renderer_host/legacy_render_widget_host_win.cc @@ -70,8 +70,10 @@ HWND LegacyRenderWidgetHostHWND::GetParent() { return ::GetParent(hwnd()); } -void LegacyRenderWidgetHostHWND::OnManagerDeleted() { - manager_ = NULL; +void LegacyRenderWidgetHostHWND::OnManagerDeleted( + content::BrowserAccessibilityManagerWin* manager) { + if (manager_ == manager) + manager_ = NULL; } void LegacyRenderWidgetHostHWND::Show() { diff --git a/content/browser/renderer_host/legacy_render_widget_host_win.h b/content/browser/renderer_host/legacy_render_widget_host_win.h index eb7d832..ce08a0e 100644 --- a/content/browser/renderer_host/legacy_render_widget_host_win.h +++ b/content/browser/renderer_host/legacy_render_widget_host_win.h @@ -99,7 +99,7 @@ class CONTENT_EXPORT LegacyRenderWidgetHostHWND manager_ = manager; } - void OnManagerDeleted(); + void OnManagerDeleted(content::BrowserAccessibilityManagerWin* manager); // Functions to show and hide the window. void Show(); diff --git a/content/browser/renderer_host/render_view_host_delegate.h b/content/browser/renderer_host/render_view_host_delegate.h index a9dea8b..4a44123 100644 --- a/content/browser/renderer_host/render_view_host_delegate.h +++ b/content/browser/renderer_host/render_view_host_delegate.h @@ -51,7 +51,6 @@ class SessionStorageNamespace; class SiteInstance; class WebContents; class WebContentsImpl; -struct AXEventNotificationDetails; struct FileChooserParams; struct GlobalRequestID; struct NativeWebKeyboardEvent; @@ -284,10 +283,6 @@ class CONTENT_EXPORT RenderViewHostDelegate { // created by the RenderViewHost. virtual FrameTree* GetFrameTree(); - // Invoked when an accessibility event is received from the renderer. - virtual void AccessibilityEventReceived( - const std::vector<AXEventNotificationDetails>& details) {} - protected: virtual ~RenderViewHostDelegate() {} }; diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 4184fde..a5b1d60 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc @@ -23,7 +23,6 @@ #include "base/time/time.h" #include "base/values.h" #include "cc/base/switches.h" -#include "content/browser/accessibility/browser_accessibility_manager.h" #include "content/browser/child_process_security_policy_impl.h" #include "content/browser/cross_site_request_manager.h" #include "content/browser/dom_storage/session_storage_namespace_impl.h" @@ -41,7 +40,6 @@ #include "content/browser/renderer_host/render_view_host_delegate.h" #include "content/browser/renderer_host/render_view_host_delegate_view.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" -#include "content/common/accessibility_messages.h" #include "content/common/browser_plugin/browser_plugin_messages.h" #include "content/common/content_switches_internal.h" #include "content/common/drag_messages.h" @@ -76,7 +74,6 @@ #include "net/base/network_change_notifier.h" #include "net/url_request/url_request_context_getter.h" #include "third_party/skia/include/core/SkBitmap.h" -#include "ui/accessibility/ax_tree.h" #include "ui/base/touch/touch_device.h" #include "ui/base/touch/touch_enabled.h" #include "ui/base/ui_base_switches.h" @@ -308,7 +305,6 @@ bool RenderViewHostImpl::CreateRenderView( params.window_was_created_with_opener = window_was_created_with_opener; params.next_page_id = next_page_id; GetWebScreenInfo(¶ms.screen_info); - params.accessibility_mode = accessibility_mode(); Send(new ViewMsg_New(params)); @@ -977,9 +973,6 @@ bool RenderViewHostImpl::OnMessageReceived(const IPC::Message& msg) { IPC_MESSAGE_HANDLER(ViewHostMsg_HidePopup, OnHidePopup) #endif IPC_MESSAGE_HANDLER(ViewHostMsg_RunFileChooser, OnRunFileChooser) - IPC_MESSAGE_HANDLER(AccessibilityHostMsg_Events, OnAccessibilityEvents) - IPC_MESSAGE_HANDLER(AccessibilityHostMsg_LocationChanges, - OnAccessibilityLocationChanges) IPC_MESSAGE_HANDLER(ViewHostMsg_FocusedNodeTouched, OnFocusedNodeTouched) // Have the super handle all other messages. IPC_MESSAGE_UNHANDLED( @@ -1437,11 +1430,6 @@ void RenderViewHostImpl::DisownOpener() { Send(new ViewMsg_DisownOpener(GetRoutingID())); } -void RenderViewHostImpl::SetAccessibilityCallbackForTesting( - const base::Callback<void(ui::AXEvent, int)>& callback) { - accessibility_testing_callback_ = callback; -} - void RenderViewHostImpl::UpdateWebkitPreferences(const WebPreferences& prefs) { Send(new ViewMsg_UpdateWebPreferences(GetRoutingID(), prefs)); } @@ -1507,67 +1495,6 @@ void RenderViewHostImpl::NotifyMoveOrResizeStarted() { Send(new ViewMsg_MoveOrResizeStarted(GetRoutingID())); } -void RenderViewHostImpl::OnAccessibilityEvents( - const std::vector<AccessibilityHostMsg_EventParams>& params) { - if ((accessibility_mode() != AccessibilityModeOff) && view_ && - IsRVHStateActive(rvh_state_)) { - if (accessibility_mode() & AccessibilityModeFlagPlatform) { - view_->CreateBrowserAccessibilityManagerIfNeeded(); - BrowserAccessibilityManager* manager = - view_->GetBrowserAccessibilityManager(); - if (manager) - manager->OnAccessibilityEvents(params); - } - - std::vector<AXEventNotificationDetails> details; - for (unsigned int i = 0; i < params.size(); ++i) { - const AccessibilityHostMsg_EventParams& param = params[i]; - AXEventNotificationDetails detail(param.update.node_id_to_clear, - param.update.nodes, - param.event_type, - param.id, - GetProcess()->GetID(), - GetRoutingID()); - details.push_back(detail); - } - - delegate_->AccessibilityEventReceived(details); - } - - // Always send an ACK or the renderer can be in a bad state. - Send(new AccessibilityMsg_Events_ACK(GetRoutingID())); - - // The rest of this code is just for testing; bail out if we're not - // in that mode. - if (accessibility_testing_callback_.is_null()) - return; - - for (unsigned i = 0; i < params.size(); i++) { - const AccessibilityHostMsg_EventParams& param = params[i]; - if (static_cast<int>(param.event_type) < 0) - continue; - if (!ax_tree_) - ax_tree_.reset(new ui::AXTree(param.update)); - else - CHECK(ax_tree_->Unserialize(param.update)) << ax_tree_->error(); - accessibility_testing_callback_.Run(param.event_type, param.id); - } -} - -void RenderViewHostImpl::OnAccessibilityLocationChanges( - const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { - if (view_ && IsRVHStateActive(rvh_state_)) { - if (accessibility_mode() & AccessibilityModeFlagPlatform) { - view_->CreateBrowserAccessibilityManagerIfNeeded(); - BrowserAccessibilityManager* manager = - view_->GetBrowserAccessibilityManager(); - if (manager) - manager->OnLocationChanges(params); - } - // TODO(aboxhall): send location change events to web contents observers too - } -} - void RenderViewHostImpl::OnDidZoomURL(double zoom_level, const GURL& url) { HostZoomMapImpl* host_zoom_map = static_cast<HostZoomMapImpl*>( diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h index 204d31c..e2a9764 100644 --- a/content/browser/renderer_host/render_view_host_impl.h +++ b/content/browser/renderer_host/render_view_host_impl.h @@ -25,13 +25,10 @@ #include "third_party/WebKit/public/web/WebConsoleMessage.h" #include "third_party/WebKit/public/web/WebPopupType.h" #include "third_party/skia/include/core/SkColor.h" -#include "ui/accessibility/ax_node_data.h" #include "ui/base/window_open_disposition.h" class SkBitmap; class FrameMsg_Navigate; -struct AccessibilityHostMsg_EventParams; -struct AccessibilityHostMsg_LocationChangeParams; struct MediaPlayerAction; struct ViewHostMsg_CreateWindow_Params; struct ViewHostMsg_ShowPopup_Params; @@ -408,30 +405,6 @@ class CONTENT_EXPORT RenderViewHostImpl // Set the opener to null in the renderer process. void DisownOpener(); - // Turn on accessibility testing. The given callback will be run - // every time an accessibility notification is received from the - // renderer process, and the accessibility tree it sent can be - // retrieved using accessibility_tree_for_testing(). - void SetAccessibilityCallbackForTesting( - const base::Callback<void(ui::AXEvent, int)>& callback); - - // Only valid if SetAccessibilityCallbackForTesting was called and - // the callback was run at least once. Returns a snapshot of the - // accessibility tree received from the renderer as of the last time - // an accessibility notification was received. - const ui::AXTree& ax_tree_for_testing() { - CHECK(ax_tree_.get()); - return *ax_tree_.get(); - } - - // Set accessibility callbacks. - void SetAccessibilityLayoutCompleteCallbackForTesting( - const base::Closure& callback); - void SetAccessibilityLoadCompleteCallbackForTesting( - const base::Closure& callback); - void SetAccessibilityOtherCallbackForTesting( - const base::Closure& callback); - bool is_waiting_for_beforeunload_ack() { return is_waiting_for_beforeunload_ack_; } @@ -512,10 +485,6 @@ class CONTENT_EXPORT RenderViewHostImpl void OnUpdateInspectorSetting(const std::string& key, const std::string& value); void OnClosePageACK(); - void OnAccessibilityEvents( - const std::vector<AccessibilityHostMsg_EventParams>& params); - void OnAccessibilityLocationChanges( - const std::vector<AccessibilityHostMsg_LocationChangeParams>& params); void OnDidZoomURL(double zoom_level, const GURL& url); void OnRunFileChooser(const FileChooserParams& params); void OnFocusedNodeTouched(bool editable); @@ -608,12 +577,6 @@ class CONTENT_EXPORT RenderViewHostImpl // TODO(nasko): Move to RenderFrameHost, as this is per-frame state. bool unload_ack_is_for_cross_site_transition_; - // Accessibility callback for testing. - base::Callback<void(ui::AXEvent, int)> accessibility_testing_callback_; - - // The most recently received accessibility tree - for testing only. - scoped_ptr<ui::AXTree> ax_tree_; - // True if the render view can be shut down suddenly. bool sudden_termination_allowed_; diff --git a/content/browser/renderer_host/render_widget_host_delegate.cc b/content/browser/renderer_host/render_widget_host_delegate.cc index 23687d0..a3a474f 100644 --- a/content/browser/renderer_host/render_widget_host_delegate.cc +++ b/content/browser/renderer_host/render_widget_host_delegate.cc @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/basictypes.h" #include "content/browser/renderer_host/render_widget_host_delegate.h" namespace content { @@ -27,9 +28,19 @@ bool RenderWidgetHostDelegate::HandleGestureEvent( return false; } +BrowserAccessibilityManager* + RenderWidgetHostDelegate::GetRootBrowserAccessibilityManager() { + return NULL; +} + +BrowserAccessibilityManager* + RenderWidgetHostDelegate::GetOrCreateRootBrowserAccessibilityManager() { + return NULL; +} + #if defined(OS_WIN) gfx::NativeViewAccessible -RenderWidgetHostDelegate::GetParentNativeViewAccessible() { + RenderWidgetHostDelegate::GetParentNativeViewAccessible() { return NULL; } #endif diff --git a/content/browser/renderer_host/render_widget_host_delegate.h b/content/browser/renderer_host/render_widget_host_delegate.h index 91ce943..0efed29 100644 --- a/content/browser/renderer_host/render_widget_host_delegate.h +++ b/content/browser/renderer_host/render_widget_host_delegate.h @@ -16,6 +16,7 @@ class WebGestureEvent; namespace content { +class BrowserAccessibilityManager; class RenderWidgetHostImpl; struct NativeWebKeyboardEvent; @@ -62,8 +63,15 @@ class CONTENT_EXPORT RenderWidgetHostDelegate { // Notifies that RenderWidgetHost will toggle touch emulation. virtual void OnTouchEmulationEnabled(bool enabled) {} + // Get the root BrowserAccessibilityManager for this frame tree. + virtual BrowserAccessibilityManager* GetRootBrowserAccessibilityManager(); + + // Get the root BrowserAccessibilityManager for this frame tree, + // or create it if it doesn't exist. + virtual BrowserAccessibilityManager* + GetOrCreateRootBrowserAccessibilityManager(); + #if defined(OS_WIN) - // Returns the widget's parent's NativeViewAccessible. virtual gfx::NativeViewAccessible GetParentNativeViewAccessible(); #endif diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 24c6a21..8ca48bc 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc @@ -45,7 +45,6 @@ #include "content/browser/renderer_host/render_widget_host_delegate.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" #include "content/browser/renderer_host/render_widget_resize_helper.h" -#include "content/common/accessibility_messages.h" #include "content/common/content_constants_internal.h" #include "content/common/cursors/webcursor.h" #include "content/common/gpu/gpu_messages.h" @@ -172,7 +171,6 @@ RenderWidgetHostImpl::RenderWidgetHostImpl(RenderWidgetHostDelegate* delegate, overdraw_bottom_height_(0.f), should_auto_resize_(false), waiting_for_screen_rects_ack_(false), - accessibility_mode_(AccessibilityModeOff), needs_repainting_on_restore_(false), is_unresponsive_(false), in_flight_event_count_(0), @@ -220,9 +218,6 @@ RenderWidgetHostImpl::RenderWidgetHostImpl(RenderWidgetHostDelegate* delegate, if (!hidden) process_->WidgetRestored(); - accessibility_mode_ = - BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode(); - input_router_.reset(new InputRouterImpl( process_, this, this, routing_id_, GetInputRouterConfigForPlatform())); @@ -846,22 +841,6 @@ void RenderWidgetHostImpl::StopHangMonitorTimeout() { RendererIsResponsive(); } -void RenderWidgetHostImpl::EnableFullAccessibilityMode() { - AddAccessibilityMode(AccessibilityModeComplete); -} - -bool RenderWidgetHostImpl::IsFullAccessibilityModeForTesting() { - return accessibility_mode() == AccessibilityModeComplete; -} - -void RenderWidgetHostImpl::EnableTreeOnlyAccessibilityMode() { - AddAccessibilityMode(AccessibilityModeTreeOnly); -} - -bool RenderWidgetHostImpl::IsTreeOnlyAccessibilityModeForTesting() { - return accessibility_mode() == AccessibilityModeTreeOnly; -} - void RenderWidgetHostImpl::ForwardMouseEvent(const WebMouseEvent& mouse_event) { ForwardMouseEventWithLatencyInfo(mouse_event, ui::LatencyInfo()); } @@ -1906,92 +1885,6 @@ void RenderWidgetHostImpl::SetEditCommandsForNextKeyEvent( Send(new InputMsg_SetEditCommandsForNextKeyEvent(GetRoutingID(), commands)); } -void RenderWidgetHostImpl::AddAccessibilityMode(AccessibilityMode mode) { - SetAccessibilityMode( - content::AddAccessibilityModeTo(accessibility_mode_, mode)); -} - -void RenderWidgetHostImpl::RemoveAccessibilityMode(AccessibilityMode mode) { - SetAccessibilityMode( - content::RemoveAccessibilityModeFrom(accessibility_mode_, mode)); -} - -void RenderWidgetHostImpl::ResetAccessibilityMode() { - SetAccessibilityMode( - BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode()); -} - -void RenderWidgetHostImpl::SetAccessibilityMode(AccessibilityMode mode) { - accessibility_mode_ = mode; - Send(new ViewMsg_SetAccessibilityMode(GetRoutingID(), mode)); -} - -void RenderWidgetHostImpl::AccessibilitySetFocus(int object_id) { - Send(new AccessibilityMsg_SetFocus(GetRoutingID(), object_id)); - view_->OnAccessibilitySetFocus(object_id); -} - -void RenderWidgetHostImpl::AccessibilityDoDefaultAction(int object_id) { - Send(new AccessibilityMsg_DoDefaultAction(GetRoutingID(), object_id)); -} - -void RenderWidgetHostImpl::AccessibilityShowMenu(int object_id) { - view_->AccessibilityShowMenu(object_id); -} - -void RenderWidgetHostImpl::AccessibilityScrollToMakeVisible( - int acc_obj_id, gfx::Rect subfocus) { - Send(new AccessibilityMsg_ScrollToMakeVisible( - GetRoutingID(), acc_obj_id, subfocus)); -} - -void RenderWidgetHostImpl::AccessibilityScrollToPoint( - int acc_obj_id, gfx::Point point) { - Send(new AccessibilityMsg_ScrollToPoint( - GetRoutingID(), acc_obj_id, point)); -} - -void RenderWidgetHostImpl::AccessibilitySetTextSelection( - int object_id, int start_offset, int end_offset) { - Send(new AccessibilityMsg_SetTextSelection( - GetRoutingID(), object_id, start_offset, end_offset)); -} - -bool RenderWidgetHostImpl::AccessibilityViewHasFocus() const { - return view_->HasFocus(); -} - -gfx::Rect RenderWidgetHostImpl::AccessibilityGetViewBounds() const { - return view_->GetViewBounds(); -} - -gfx::Point RenderWidgetHostImpl::AccessibilityOriginInScreen( - const gfx::Rect& bounds) const { - return view_->AccessibilityOriginInScreen(bounds); -} - -void RenderWidgetHostImpl::AccessibilityHitTest(const gfx::Point& point) { - Send(new AccessibilityMsg_HitTest(GetRoutingID(), point)); -} - -void RenderWidgetHostImpl::AccessibilityFatalError() { - Send(new AccessibilityMsg_FatalError(GetRoutingID())); - view_->SetBrowserAccessibilityManager(NULL); -} - -#if defined(OS_WIN) -void RenderWidgetHostImpl::SetParentNativeViewAccessible( - gfx::NativeViewAccessible accessible_parent) { - if (view_) - view_->SetParentNativeViewAccessible(accessible_parent); -} - -gfx::NativeViewAccessible -RenderWidgetHostImpl::GetParentNativeViewAccessible() const { - return delegate_->GetParentNativeViewAccessible(); -} -#endif - void RenderWidgetHostImpl::ExecuteEditCommand(const std::string& command, const std::string& value) { Send(new InputMsg_ExecuteEditCommand(GetRoutingID(), command, value)); @@ -2341,6 +2234,24 @@ void RenderWidgetHostImpl::AddLatencyInfoComponentIds( } } +BrowserAccessibilityManager* + RenderWidgetHostImpl::GetRootBrowserAccessibilityManager() { + return delegate_ ? delegate_->GetRootBrowserAccessibilityManager() : NULL; +} + +BrowserAccessibilityManager* + RenderWidgetHostImpl::GetOrCreateRootBrowserAccessibilityManager() { + return delegate_ ? + delegate_->GetOrCreateRootBrowserAccessibilityManager() : NULL; +} + +#if defined(OS_WIN) +gfx::NativeViewAccessible + RenderWidgetHostImpl::GetParentNativeViewAccessible() { + return delegate_ ? delegate_->GetParentNativeViewAccessible() : NULL; +} +#endif + SkColorType RenderWidgetHostImpl::PreferredReadbackFormat() { if (view_) return view_->PreferredReadbackFormat(); diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h index 6f884b6..a26f609 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h @@ -24,7 +24,6 @@ #include "base/timer/timer.h" #include "build/build_config.h" #include "cc/resources/shared_bitmap.h" -#include "content/browser/accessibility/browser_accessibility_manager.h" #include "content/browser/renderer_host/event_with_latency_info.h" #include "content/browser/renderer_host/input/input_ack_handler.h" #include "content/browser/renderer_host/input/input_router_client.h" @@ -78,6 +77,7 @@ class WebLayer; #endif namespace content { +class BrowserAccessibilityManager; class InputRouter; class MockRenderWidgetHost; class RenderWidgetHostDelegate; @@ -95,8 +95,7 @@ class CONTENT_EXPORT RenderWidgetHostImpl public InputRouterClient, public InputAckHandler, public TouchEmulatorClient, - public IPC::Listener, - public BrowserAccessibilityDelegate { + public IPC::Listener { public: // routing_id can be MSG_ROUTING_NONE, in which case the next available // routing id is taken from the RenderProcessHost. @@ -141,10 +140,6 @@ class CONTENT_EXPORT RenderWidgetHostImpl virtual void LockBackingStore() OVERRIDE; virtual void UnlockBackingStore() OVERRIDE; #endif - virtual void EnableFullAccessibilityMode() OVERRIDE; - virtual bool IsFullAccessibilityModeForTesting() OVERRIDE; - virtual void EnableTreeOnlyAccessibilityMode() OVERRIDE; - virtual bool IsTreeOnlyAccessibilityModeForTesting() OVERRIDE; virtual void ForwardMouseEvent( const blink::WebMouseEvent& mouse_event) OVERRIDE; virtual void ForwardWheelEvent( @@ -174,23 +169,6 @@ class CONTENT_EXPORT RenderWidgetHostImpl virtual SkColorType PreferredReadbackFormat() OVERRIDE; - // BrowserAccessibilityDelegate - virtual void AccessibilitySetFocus(int acc_obj_id) OVERRIDE; - virtual void AccessibilityDoDefaultAction(int acc_obj_id) OVERRIDE; - virtual void AccessibilityShowMenu(int acc_obj_id) OVERRIDE; - virtual void AccessibilityScrollToMakeVisible( - int acc_obj_id, gfx::Rect subfocus) OVERRIDE; - virtual void AccessibilityScrollToPoint( - int acc_obj_id, gfx::Point point) OVERRIDE; - virtual void AccessibilitySetTextSelection( - int acc_obj_id, int start_offset, int end_offset) OVERRIDE; - virtual bool AccessibilityViewHasFocus() const OVERRIDE; - virtual gfx::Rect AccessibilityGetViewBounds() const OVERRIDE; - virtual gfx::Point AccessibilityOriginInScreen(const gfx::Rect& bounds) - const OVERRIDE; - virtual void AccessibilityHitTest(const gfx::Point& point) OVERRIDE; - virtual void AccessibilityFatalError() OVERRIDE; - // Forces redraw in the renderer and when the update reaches the browser // grabs snapshot from the compositor. Returns PNG-encoded snapshot. void GetSnapshotFromBrowser( @@ -395,30 +373,6 @@ class CONTENT_EXPORT RenderWidgetHostImpl void SetEditCommandsForNextKeyEvent( const std::vector<EditCommand>& commands); - // Gets the accessibility mode. - AccessibilityMode accessibility_mode() const { - return accessibility_mode_; - } - - // Adds the given accessibility mode to the current accessibility mode bitmap. - void AddAccessibilityMode(AccessibilityMode mode); - - // Removes the given accessibility mode from the current accessibility mode - // bitmap, managing the bits that are shared with other modes such that a - // bit will only be turned off when all modes that depend on it have been - // removed. - void RemoveAccessibilityMode(AccessibilityMode mode); - - // Resets the accessibility mode to the default setting in - // BrowserStateAccessibilityImpl. - void ResetAccessibilityMode(); - -#if defined(OS_WIN) - void SetParentNativeViewAccessible( - gfx::NativeViewAccessible accessible_parent); - gfx::NativeViewAccessible GetParentNativeViewAccessible() const; -#endif - // Executes the edit command on the RenderView. void ExecuteEditCommand(const std::string& command, const std::string& value); @@ -520,6 +474,17 @@ class CONTENT_EXPORT RenderWidgetHostImpl InputRouter* input_router() { return input_router_.get(); } + // Get the BrowserAccessibilityManager for the root of the frame tree, + BrowserAccessibilityManager* GetRootBrowserAccessibilityManager(); + + // Get the BrowserAccessibilityManager for the root of the frame tree, + // or create it if it doesn't already exist. + BrowserAccessibilityManager* GetOrCreateRootBrowserAccessibilityManager(); + +#if defined(OS_WIN) + gfx::NativeViewAccessible GetParentNativeViewAccessible(); +#endif + protected: virtual RenderWidgetHostImpl* AsRenderWidgetHostImpl() OVERRIDE; @@ -709,9 +674,6 @@ class CONTENT_EXPORT RenderWidgetHostImpl int snapshot_id, scoped_refptr<base::RefCountedBytes> png_data); - // Send a message to the renderer process to change the accessibility mode. - void SetAccessibilityMode(AccessibilityMode AccessibilityMode); - // Our delegate, which wants to know mainly about keyboard events. // It will remain non-NULL until DetachDelegate() is called. RenderWidgetHostDelegate* delegate_; @@ -783,8 +745,6 @@ class CONTENT_EXPORT RenderWidgetHostImpl gfx::Rect last_view_screen_rect_; gfx::Rect last_window_screen_rect_; - AccessibilityMode accessibility_mode_; - // Keyboard event listeners. std::vector<KeyPressEventCallback> key_press_event_callbacks_; diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index cf5cf24..a56a1f1 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc @@ -1150,20 +1150,16 @@ void RenderWidgetHostViewAndroid::OnSetNeedsFlushInput() { content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); } -void RenderWidgetHostViewAndroid::CreateBrowserAccessibilityManagerIfNeeded() { - if (!host_ || host_->accessibility_mode() != AccessibilityModeComplete) - return; - - if (!GetBrowserAccessibilityManager()) { - base::android::ScopedJavaLocalRef<jobject> obj; - if (content_view_core_) - obj = content_view_core_->GetJavaObject(); - SetBrowserAccessibilityManager( - new BrowserAccessibilityManagerAndroid( - obj, - BrowserAccessibilityManagerAndroid::GetEmptyDocument(), - host_)); - } +BrowserAccessibilityManager* + RenderWidgetHostViewAndroid::CreateBrowserAccessibilityManager( + BrowserAccessibilityDelegate* delegate) { + base::android::ScopedJavaLocalRef<jobject> obj; + if (content_view_core_) + obj = content_view_core_->GetJavaObject(); + return new BrowserAccessibilityManagerAndroid( + obj, + BrowserAccessibilityManagerAndroid::GetEmptyDocument(), + delegate); } bool RenderWidgetHostViewAndroid::LockMouse() { @@ -1268,12 +1264,14 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( content_view_core_ = content_view_core; - if (GetBrowserAccessibilityManager()) { + BrowserAccessibilityManager* manager = NULL; + if (host_) + manager = host_->GetRootBrowserAccessibilityManager(); + if (manager) { base::android::ScopedJavaLocalRef<jobject> obj; if (content_view_core_) obj = content_view_core_->GetJavaObject(); - GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> - SetContentViewCore(obj); + manager->ToBrowserAccessibilityManagerAndroid()->SetContentViewCore(obj); } AttachLayers(); diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h index 6bbd636..6d05761 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.h +++ b/content/browser/renderer_host/render_widget_host_view_android.h @@ -148,7 +148,8 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid virtual void OnSetNeedsFlushInput() OVERRIDE; virtual void GestureEventAck(const blink::WebGestureEvent& event, InputEventAckState ack_result) OVERRIDE; - virtual void CreateBrowserAccessibilityManagerIfNeeded() OVERRIDE; + virtual BrowserAccessibilityManager* CreateBrowserAccessibilityManager( + BrowserAccessibilityDelegate* delegate) OVERRIDE; virtual bool LockMouse() OVERRIDE; virtual void UnlockMouse() OVERRIDE; virtual void OnSwapCompositorFrame( diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index 205f3fc..ad9fffb 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc @@ -651,9 +651,8 @@ gfx::NativeViewAccessible RenderWidgetHostViewAura::GetNativeViewAccessible() { if (!host) return static_cast<gfx::NativeViewAccessible>(NULL); HWND hwnd = host->GetAcceleratedWidget(); - - CreateBrowserAccessibilityManagerIfNeeded(); - BrowserAccessibilityManager* manager = GetBrowserAccessibilityManager(); + BrowserAccessibilityManager* manager = + host_->GetOrCreateRootBrowserAccessibilityManager(); if (manager) return manager->GetRoot()->ToBrowserAccessibilityWin(); #endif @@ -1043,8 +1042,10 @@ void RenderWidgetHostViewAura::OnSwapCompositorFrame( #if defined(OS_WIN) void RenderWidgetHostViewAura::SetParentNativeViewAccessible( gfx::NativeViewAccessible accessible_parent) { - if (GetBrowserAccessibilityManager()) { - GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerWin() + BrowserAccessibilityManager* manager = + host_->GetRootBrowserAccessibilityManager(); + if (manager) { + manager->ToBrowserAccessibilityManagerWin() ->set_parent_iaccessible(accessible_parent); } } @@ -1191,22 +1192,21 @@ InputEventAckState RenderWidgetHostViewAura::FilterInputEvent( : INPUT_EVENT_ACK_STATE_NOT_CONSUMED; } -void RenderWidgetHostViewAura::CreateBrowserAccessibilityManagerIfNeeded() { +BrowserAccessibilityManager* +RenderWidgetHostViewAura::CreateBrowserAccessibilityManager( + BrowserAccessibilityDelegate* delegate) { + BrowserAccessibilityManager* manager = NULL; #if defined(OS_WIN) - if (!GetBrowserAccessibilityManager()) { - gfx::NativeViewAccessible accessible_parent = - host_->GetParentNativeViewAccessible(); - SetBrowserAccessibilityManager(new BrowserAccessibilityManagerWin( - legacy_render_widget_host_HWND_, accessible_parent, - BrowserAccessibilityManagerWin::GetEmptyDocument(), host_)); - } + gfx::NativeViewAccessible accessible_parent = + host_->GetParentNativeViewAccessible(); + manager = new BrowserAccessibilityManagerWin( + legacy_render_widget_host_HWND_, accessible_parent, + BrowserAccessibilityManagerWin::GetEmptyDocument(), delegate); #else - if (!GetBrowserAccessibilityManager()) { - SetBrowserAccessibilityManager( - BrowserAccessibilityManager::Create( - BrowserAccessibilityManager::GetEmptyDocument(), host_)); - } + manager = BrowserAccessibilityManager::Create( + BrowserAccessibilityManager::GetEmptyDocument(), delegate); #endif + return manager; } gfx::GLSurfaceHandle RenderWidgetHostViewAura::GetCompositingSurface() { @@ -2048,7 +2048,8 @@ void RenderWidgetHostViewAura::OnWindowFocused(aura::Window* gained_focus, host_->SetInputMethodActive(false); } - BrowserAccessibilityManager* manager = GetBrowserAccessibilityManager(); + BrowserAccessibilityManager* manager = + host_->GetRootBrowserAccessibilityManager(); if (manager) manager->OnWindowFocused(); } else if (window_ == lost_focus) { @@ -2064,7 +2065,8 @@ void RenderWidgetHostViewAura::OnWindowFocused(aura::Window* gained_focus, if (overscroll_controller_) overscroll_controller_->Cancel(); - BrowserAccessibilityManager* manager = GetBrowserAccessibilityManager(); + BrowserAccessibilityManager* manager = + host_->GetRootBrowserAccessibilityManager(); if (manager) manager->OnWindowBlurred(); @@ -2310,7 +2312,7 @@ void RenderWidgetHostViewAura::InternalSetBounds(const gfx::Rect& rect) { BrowserAccessibilityManagerWin* manager = static_cast<BrowserAccessibilityManagerWin*>( - GetBrowserAccessibilityManager()); + host_->GetRootBrowserAccessibilityManager()); if (manager) manager->SetAccessibleHWND(legacy_render_widget_host_HWND_); } diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h index 05f5493..e8c19d7 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.h +++ b/content/browser/renderer_host/render_widget_host_view_aura.h @@ -218,7 +218,8 @@ class CONTENT_EXPORT RenderWidgetHostViewAura virtual InputEventAckState FilterInputEvent( const blink::WebInputEvent& input_event) OVERRIDE; virtual gfx::GLSurfaceHandle GetCompositingSurface() OVERRIDE; - virtual void CreateBrowserAccessibilityManagerIfNeeded() OVERRIDE; + virtual BrowserAccessibilityManager* CreateBrowserAccessibilityManager( + BrowserAccessibilityDelegate* delegate) OVERRIDE; virtual bool LockMouse() OVERRIDE; virtual void UnlockMouse() OVERRIDE; virtual void OnSwapCompositorFrame( diff --git a/content/browser/renderer_host/render_widget_host_view_base.cc b/content/browser/renderer_host/render_widget_host_view_base.cc index c9d3ebb..cfc1a40 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.cc +++ b/content/browser/renderer_host/render_widget_host_view_base.cc @@ -484,22 +484,13 @@ blink::WebPopupType RenderWidgetHostViewBase::GetPopupType() { } BrowserAccessibilityManager* - RenderWidgetHostViewBase::GetBrowserAccessibilityManager() const { - return browser_accessibility_manager_.get(); -} - -void RenderWidgetHostViewBase::CreateBrowserAccessibilityManagerIfNeeded() { -} - -void RenderWidgetHostViewBase::SetBrowserAccessibilityManager( - BrowserAccessibilityManager* manager) { - browser_accessibility_manager_.reset(manager); -} - -void RenderWidgetHostViewBase::OnAccessibilitySetFocus(int acc_obj_id) { +RenderWidgetHostViewBase::CreateBrowserAccessibilityManager( + BrowserAccessibilityDelegate* delegate) { + NOTREACHED(); + return NULL; } -void RenderWidgetHostViewBase::AccessibilityShowMenu(int acc_obj_id) { +void RenderWidgetHostViewBase::AccessibilityShowMenu(const gfx::Point& point) { } gfx::Point RenderWidgetHostViewBase::AccessibilityOriginInScreen( diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h index 8f84a99..182976f 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.h +++ b/content/browser/renderer_host/render_widget_host_view_base.h @@ -50,6 +50,7 @@ struct WebScreenInfo; } namespace content { +class BrowserAccessibilityDelegate; class BrowserAccessibilityManager; class SyntheticGesture; class SyntheticGestureTarget; @@ -88,11 +89,6 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView, blink::WebPopupType GetPopupType(); - // Get the BrowserAccessibilityManager if it exists, may return NULL. - BrowserAccessibilityManager* GetBrowserAccessibilityManager() const; - - void SetBrowserAccessibilityManager(BrowserAccessibilityManager* manager); - // Return a value that is incremented each time the renderer swaps a new frame // to the view. uint32 RendererFrameNumber(); @@ -151,13 +147,11 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView, // Return true if frame subscription is supported on this platform. virtual bool CanSubscribeFrame() const; - // Create a BrowserAccessibilityManager for this view if it's possible to - // create one and if one doesn't exist already. Some ports may not create - // one depending on the current state. - virtual void CreateBrowserAccessibilityManagerIfNeeded(); + // Create a BrowserAccessibilityManager for this view. + virtual BrowserAccessibilityManager* CreateBrowserAccessibilityManager( + BrowserAccessibilityDelegate* delegate); - virtual void OnAccessibilitySetFocus(int acc_obj_id); - virtual void AccessibilityShowMenu(int acc_obj_id); + virtual void AccessibilityShowMenu(const gfx::Point& point); virtual gfx::Point AccessibilityOriginInScreen(const gfx::Rect& bounds); virtual SkColorType PreferredReadbackFormat(); @@ -426,9 +420,6 @@ protected: private: void FlushInput(); - // Manager of the tree representation of the WebKit render tree. - scoped_ptr<BrowserAccessibilityManager> browser_accessibility_manager_; - gfx::Rect current_display_area_; uint32 renderer_frame_number_; diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h index 6d3987a..0c1e553 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.h +++ b/content/browser/renderer_host/render_widget_host_view_mac.h @@ -311,11 +311,11 @@ class CONTENT_EXPORT RenderWidgetHostViewMac uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) OVERRIDE; virtual void AcceleratedSurfaceInitialized(int host_id, int route_id) OVERRIDE; - virtual void CreateBrowserAccessibilityManagerIfNeeded() OVERRIDE; + virtual BrowserAccessibilityManager* CreateBrowserAccessibilityManager( + BrowserAccessibilityDelegate* delegate) OVERRIDE; virtual gfx::Point AccessibilityOriginInScreen(const gfx::Rect& bounds) OVERRIDE; - virtual void OnAccessibilitySetFocus(int acc_obj_id) OVERRIDE; - virtual void AccessibilityShowMenu(int acc_obj_id) OVERRIDE; + virtual void AccessibilityShowMenu(const gfx::Point& point) OVERRIDE; virtual bool PostProcessEventForPluginIme( const NativeWebKeyboardEvent& event) OVERRIDE; diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm index 8225582..17c73d5 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm @@ -2065,14 +2065,13 @@ void RenderWidgetHostViewMac::SetBackgroundOpaque(bool opaque) { render_widget_host_->SetBackgroundOpaque(opaque); } -void RenderWidgetHostViewMac::CreateBrowserAccessibilityManagerIfNeeded() { - if (!GetBrowserAccessibilityManager()) { - SetBrowserAccessibilityManager( - new BrowserAccessibilityManagerMac( - cocoa_view_, - BrowserAccessibilityManagerMac::GetEmptyDocument(), - render_widget_host_)); - } +BrowserAccessibilityManager* + RenderWidgetHostViewMac::CreateBrowserAccessibilityManager( + BrowserAccessibilityDelegate* delegate) { + return new BrowserAccessibilityManagerMac( + cocoa_view_, + BrowserAccessibilityManagerMac::GetEmptyDocument(), + delegate); } gfx::Point RenderWidgetHostViewMac::AccessibilityOriginInScreen( @@ -2087,33 +2086,9 @@ gfx::Point RenderWidgetHostViewMac::AccessibilityOriginInScreen( return gfx::Point(originInScreen.x, originInScreen.y); } -void RenderWidgetHostViewMac::OnAccessibilitySetFocus(int accObjId) { - // Immediately set the focused item even though we have not officially set - // focus on it as VoiceOver expects to get the focused item after this - // method returns. - BrowserAccessibilityManager* manager = GetBrowserAccessibilityManager(); - if (manager) - manager->SetFocus(manager->GetFromID(accObjId), false); -} - -void RenderWidgetHostViewMac::AccessibilityShowMenu(int accObjId) { - BrowserAccessibilityManager* manager = GetBrowserAccessibilityManager(); - if (!manager) - return; - BrowserAccessibilityCocoa* obj = - manager->GetFromID(accObjId)->ToBrowserAccessibilityCocoa(); - - // Performs a right click copying WebKit's - // accessibilityPerformShowMenuAction. - NSPoint objOrigin = [obj origin]; - NSSize size = [[obj size] sizeValue]; - gfx::Point origin = AccessibilityOriginInScreen( - gfx::Rect(objOrigin.x, objOrigin.y, size.width, size.height)); - NSPoint location = NSMakePoint(origin.x(), origin.y()); +void RenderWidgetHostViewMac::AccessibilityShowMenu(const gfx::Point& point) { + NSPoint location = NSMakePoint(point.x(), point.y()); location = [[cocoa_view_ window] convertScreenToBase:location]; - location.x += size.width/2; - location.y += size.height/2; - NSEvent* fakeRightClick = [NSEvent mouseEventWithType:NSRightMouseDown location:location @@ -2128,8 +2103,6 @@ void RenderWidgetHostViewMac::AccessibilityShowMenu(int accObjId) { [cocoa_view_ mouseEvent:fakeRightClick]; } - - void RenderWidgetHostViewMac::SetTextInputActive(bool active) { if (active) { if (text_input_type_ == ui::TEXT_INPUT_TYPE_PASSWORD) @@ -3177,7 +3150,7 @@ void RenderWidgetHostViewMac::AcceleratedLayerDidDrawFrame(bool succeeded) { - (id)accessibilityAttributeValue:(NSString *)attribute { BrowserAccessibilityManager* manager = - renderWidgetHostView_->GetBrowserAccessibilityManager(); + renderWidgetHostView_->GetHost()->GetRootBrowserAccessibilityManager(); // Contents specifies document view of RenderWidgetHostViewCocoa provided by // BrowserAccessibilityManager. Children includes all subviews in addition to @@ -3202,25 +3175,28 @@ void RenderWidgetHostViewMac::AcceleratedLayerDidDrawFrame(bool succeeded) { } - (id)accessibilityHitTest:(NSPoint)point { - if (!renderWidgetHostView_->GetBrowserAccessibilityManager()) + BrowserAccessibilityManager* manager = + renderWidgetHostView_->GetHost()->GetRootBrowserAccessibilityManager(); + if (!manager) return self; NSPoint pointInWindow = [[self window] convertScreenToBase:point]; NSPoint localPoint = [self convertPoint:pointInWindow fromView:nil]; localPoint.y = NSHeight([self bounds]) - localPoint.y; - BrowserAccessibilityCocoa* root = renderWidgetHostView_-> - GetBrowserAccessibilityManager()-> - GetRoot()->ToBrowserAccessibilityCocoa(); + BrowserAccessibilityCocoa* root = + manager->GetRoot()->ToBrowserAccessibilityCocoa(); id obj = [root accessibilityHitTest:localPoint]; return obj; } - (BOOL)accessibilityIsIgnored { - return !renderWidgetHostView_->GetBrowserAccessibilityManager(); + BrowserAccessibilityManager* manager = + renderWidgetHostView_->GetHost()->GetRootBrowserAccessibilityManager(); + return !manager; } - (NSUInteger)accessibilityGetIndexOf:(id)child { BrowserAccessibilityManager* manager = - renderWidgetHostView_->GetBrowserAccessibilityManager(); + renderWidgetHostView_->GetHost()->GetRootBrowserAccessibilityManager(); // Only child is root. if (manager && manager->GetRoot()->ToBrowserAccessibilityCocoa() == child) { @@ -3232,7 +3208,7 @@ void RenderWidgetHostViewMac::AcceleratedLayerDidDrawFrame(bool succeeded) { - (id)accessibilityFocusedUIElement { BrowserAccessibilityManager* manager = - renderWidgetHostView_->GetBrowserAccessibilityManager(); + renderWidgetHostView_->GetHost()->GetRootBrowserAccessibilityManager(); if (manager) { BrowserAccessibility* focused_item = manager->GetFocus(NULL); DCHECK(focused_item); diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 0471f0b..5c9cd72 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc @@ -18,6 +18,8 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" +#include "content/browser/accessibility/accessibility_mode_helper.h" +#include "content/browser/accessibility/browser_accessibility_state_impl.h" #include "content/browser/browser_plugin/browser_plugin_embedder.h" #include "content/browser/browser_plugin/browser_plugin_guest.h" #include "content/browser/child_process_security_policy_impl.h" @@ -72,6 +74,7 @@ #include "content/public/browser/navigation_details.h" #include "content/public/browser/notification_details.h" #include "content/public/browser/notification_service.h" +#include "content/public/browser/render_widget_host_iterator.h" #include "content/public/browser/resource_request_details.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/user_metrics.h" @@ -213,6 +216,16 @@ bool ForEachFrameInternal( return true; } +bool ForEachPendingFrameInternal( + const base::Callback<void(RenderFrameHost*)>& on_frame, + FrameTreeNode* node) { + RenderFrameHost* pending_frame_host = + node->render_manager()->pending_frame_host(); + if (pending_frame_host) + on_frame.Run(pending_frame_host); + return true; +} + void SendToAllFramesInternal(IPC::Message* message, RenderFrameHost* rfh) { IPC::Message* message_copy = new IPC::Message(*message); message_copy->set_routing_id(rfh->GetRoutingID()); @@ -228,6 +241,11 @@ void AddRenderWidgetHostViewToSet(std::set<RenderWidgetHostView*>* set, set->insert(rwhv); } +void SetAccessibilityModeOnFrame(AccessibilityMode mode, + RenderFrameHost* frame_host) { + static_cast<RenderFrameHostImpl*>(frame_host)->SetAccessibilityMode(mode); +} + } // namespace WebContents* WebContents::Create(const WebContents::CreateParams& params) { @@ -356,7 +374,9 @@ WebContentsImpl::WebContentsImpl( fullscreen_widget_had_focus_at_shutdown_(false), is_subframe_(false), touch_emulation_enabled_(false), - last_dialog_suppressed_(false) { + last_dialog_suppressed_(false), + accessibility_mode_( + BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode()) { for (size_t i = 0; i < g_created_callbacks.Get().size(); i++) g_created_callbacks.Get().at(i).Run(this); frame_tree_.SetFrameRemoveListener( @@ -455,6 +475,30 @@ WebContentsImpl* WebContentsImpl::CreateWithOpener( return new_contents; } +// static +std::vector<WebContentsImpl*> WebContentsImpl::GetAllWebContents() { + std::vector<WebContentsImpl*> result; + scoped_ptr<RenderWidgetHostIterator> widgets( + RenderWidgetHostImpl::GetRenderWidgetHosts()); + std::set<WebContentsImpl*> web_contents_set; + while (RenderWidgetHost* rwh = widgets->GetNextHost()) { + if (!rwh->IsRenderView()) + continue; + RenderViewHost* rvh = RenderViewHost::From(rwh); + if (!rvh) + continue; + WebContents* web_contents = WebContents::FromRenderViewHost(rvh); + if (!web_contents) + continue; + WebContentsImpl* wci = static_cast<WebContentsImpl*>(web_contents); + if (web_contents_set.find(wci) == web_contents_set.end()) { + web_contents_set.insert(wci); + result.push_back(wci); + } + } + return result; +} + RenderFrameHostManager* WebContentsImpl::GetRenderManagerForTesting() { return GetRenderManager(); } @@ -680,6 +724,29 @@ WebContentsView* WebContentsImpl::GetView() const { return view_.get(); } +void WebContentsImpl::SetAccessibilityMode(AccessibilityMode mode) { + if (mode == accessibility_mode_) + return; + + accessibility_mode_ = mode; + frame_tree_.ForEach( + base::Bind(&ForEachFrameInternal, + base::Bind(&SetAccessibilityModeOnFrame, mode))); + frame_tree_.ForEach( + base::Bind(&ForEachPendingFrameInternal, + base::Bind(&SetAccessibilityModeOnFrame, mode))); +} + +void WebContentsImpl::AddAccessibilityMode(AccessibilityMode mode) { + SetAccessibilityMode( + content::AddAccessibilityModeTo(accessibility_mode_, mode)); +} + +void WebContentsImpl::RemoveAccessibilityMode(AccessibilityMode mode) { + SetAccessibilityMode( + content::RemoveAccessibilityModeFrom(accessibility_mode_, mode)); +} + WebUI* WebContentsImpl::CreateWebUI(const GURL& url) { WebUIImpl* web_ui = new WebUIImpl(this); WebUIController* controller = WebUIControllerFactoryRegistry::GetInstance()-> @@ -728,12 +795,25 @@ const std::string& WebContentsImpl::GetUserAgentOverride() const { return renderer_preferences_.user_agent_override; } +void WebContentsImpl::EnableTreeOnlyAccessibilityMode() { + AddAccessibilityMode(AccessibilityModeTreeOnly); +} + +bool WebContentsImpl::IsTreeOnlyAccessibilityModeForTesting() const { + return accessibility_mode_ == AccessibilityModeTreeOnly; +} + +bool WebContentsImpl::IsFullAccessibilityModeForTesting() const { + return accessibility_mode_ == AccessibilityModeComplete; +} + #if defined(OS_WIN) void WebContentsImpl::SetParentNativeViewAccessible( gfx::NativeViewAccessible accessible_parent) { accessible_parent_ = accessible_parent; - if (GetRenderViewHost()) - GetRenderViewHostImpl()->SetParentNativeViewAccessible(accessible_parent); + RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); + if (rfh) + rfh->SetParentNativeViewAccessible(accessible_parent); } #endif @@ -1294,12 +1374,6 @@ bool WebContentsImpl::HandleGestureEvent( return false; } -#if defined(OS_WIN) -gfx::NativeViewAccessible WebContentsImpl::GetParentNativeViewAccessible() { - return accessible_parent_; -} -#endif - void WebContentsImpl::HandleMouseDown() { if (delegate_) delegate_->HandleMouseDown(); @@ -1695,6 +1769,10 @@ FrameTree* WebContentsImpl::GetFrameTree() { return &frame_tree_; } +AccessibilityMode WebContentsImpl::GetAccessibilityMode() const { + return accessibility_mode_; +} + void WebContentsImpl::AccessibilityEventReceived( const std::vector<AXEventNotificationDetails>& details) { FOR_EACH_OBSERVER( @@ -1732,6 +1810,18 @@ void WebContentsImpl::OnTouchEmulationEnabled(bool enabled) { view_->SetOverscrollControllerEnabled(CanOverscrollContent()); } +BrowserAccessibilityManager* + WebContentsImpl::GetRootBrowserAccessibilityManager() { + RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); + return rfh ? rfh->browser_accessibility_manager() : NULL; +} + +BrowserAccessibilityManager* + WebContentsImpl::GetOrCreateRootBrowserAccessibilityManager() { + RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); + return rfh ? rfh->GetOrCreateBrowserAccessibilityManager() : NULL; +} + void WebContentsImpl::UpdatePreferredSize(const gfx::Size& pref_size) { const gfx::Size old_size = GetPreferredSize(); preferred_size_ = pref_size; @@ -3205,6 +3295,7 @@ void WebContentsImpl::RenderFrameCreated(RenderFrameHost* render_frame_host) { FOR_EACH_OBSERVER(WebContentsObserver, observers_, RenderFrameCreated(render_frame_host)); + SetAccessibilityModeOnFrame(accessibility_mode_, render_frame_host); } void WebContentsImpl::RenderFrameDeleted(RenderFrameHost* render_frame_host) { @@ -3327,6 +3418,12 @@ bool WebContentsImpl::IsNeverVisible() { return delegate_->IsNeverVisible(this); } +#if defined(OS_WIN) +gfx::NativeViewAccessible WebContentsImpl::GetParentNativeViewAccessible() { + return accessible_parent_; +} +#endif + RenderViewHostDelegateView* WebContentsImpl::GetDelegateView() { return render_view_host_delegate_view_; } @@ -3385,6 +3482,7 @@ void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { RenderFrameHost* main_frame = render_view_host->GetMainFrame(); FOR_EACH_OBSERVER( WebContentsObserver, observers_, RenderFrameCreated(main_frame)); + SetAccessibilityModeOnFrame(accessibility_mode_, main_frame); } void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) { diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index b001642..91b2d4b 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h @@ -23,6 +23,7 @@ #include "content/browser/frame_host/render_frame_host_manager.h" #include "content/browser/renderer_host/render_view_host_delegate.h" #include "content/browser/renderer_host/render_widget_host_delegate.h" +#include "content/common/accessibility_mode_enums.h" #include "content/common/content_export.h" #include "content/public/browser/color_chooser.h" #include "content/public/browser/notification_observer.h" @@ -95,6 +96,8 @@ class CONTENT_EXPORT WebContentsImpl const WebContents::CreateParams& params, WebContentsImpl* opener); + static std::vector<WebContentsImpl*> GetAllWebContents(); + // Returns the opener WebContentsImpl, if any. This can be set to null if the // opener is closed or the page clears its window.opener. WebContentsImpl* opener() const { return opener_; } @@ -171,6 +174,19 @@ class CONTENT_EXPORT WebContentsImpl bool should_normally_be_visible() { return should_normally_be_visible_; } + // Broadcasts the mode change to all frames. + void SetAccessibilityMode(AccessibilityMode mode); + + // Adds the given accessibility mode to the current accessibility mode + // bitmap. + void AddAccessibilityMode(AccessibilityMode mode); + + // Removes the given accessibility mode from the current accessibility + // mode bitmap, managing the bits that are shared with other modes such + // that a bit will only be turned off when all modes that depend on it + // have been removed. + void RemoveAccessibilityMode(AccessibilityMode mode); + // WebContents ------------------------------------------------------ virtual WebContentsDelegate* GetDelegate() OVERRIDE; virtual void SetDelegate(WebContentsDelegate* delegate) OVERRIDE; @@ -196,6 +212,9 @@ class CONTENT_EXPORT WebContentsImpl virtual WebUI* GetCommittedWebUI() const OVERRIDE; virtual void SetUserAgentOverride(const std::string& override) OVERRIDE; virtual const std::string& GetUserAgentOverride() const OVERRIDE; + virtual void EnableTreeOnlyAccessibilityMode() OVERRIDE; + virtual bool IsTreeOnlyAccessibilityModeForTesting() const OVERRIDE; + virtual bool IsFullAccessibilityModeForTesting() const OVERRIDE; #if defined(OS_WIN) virtual void SetParentNativeViewAccessible( gfx::NativeViewAccessible accessible_parent) OVERRIDE; @@ -355,6 +374,12 @@ class CONTENT_EXPORT WebContentsImpl const std::string& encoding) OVERRIDE; virtual WebContents* GetAsWebContents() OVERRIDE; virtual bool IsNeverVisible() OVERRIDE; + virtual AccessibilityMode GetAccessibilityMode() const OVERRIDE; + virtual void AccessibilityEventReceived( + const std::vector<AXEventNotificationDetails>& details) OVERRIDE; +#if defined(OS_WIN) + virtual gfx::NativeViewAccessible GetParentNativeViewAccessible() OVERRIDE; +#endif // RenderViewHostDelegate ---------------------------------------------------- virtual RenderViewHostDelegateView* GetDelegateView() OVERRIDE; @@ -443,8 +468,6 @@ class CONTENT_EXPORT WebContentsImpl SiteInstance* instance) OVERRIDE; virtual SessionStorageNamespaceMap GetSessionStorageNamespaceMap() OVERRIDE; virtual FrameTree* GetFrameTree() OVERRIDE; - virtual void AccessibilityEventReceived( - const std::vector<AXEventNotificationDetails>& details) OVERRIDE; // NavigatorDelegate --------------------------------------------------------- @@ -509,9 +532,10 @@ class CONTENT_EXPORT WebContentsImpl const blink::WebGestureEvent& event) OVERRIDE; virtual void DidSendScreenRects(RenderWidgetHostImpl* rwh) OVERRIDE; virtual void OnTouchEmulationEnabled(bool enabled) OVERRIDE; -#if defined(OS_WIN) - virtual gfx::NativeViewAccessible GetParentNativeViewAccessible() OVERRIDE; -#endif + virtual BrowserAccessibilityManager* GetRootBrowserAccessibilityManager() + OVERRIDE; + virtual BrowserAccessibilityManager* + GetOrCreateRootBrowserAccessibilityManager() OVERRIDE; // RenderFrameHostManager::Delegate ------------------------------------------ @@ -1154,6 +1178,10 @@ class CONTENT_EXPORT WebContentsImpl scoped_ptr<ScreenOrientationDispatcherHost> screen_orientation_dispatcher_host_; + // The accessibility mode for all frames. This is queried when each frame + // is created, and broadcast to all frames when it changes. + AccessibilityMode accessibility_mode_; + DISALLOW_COPY_AND_ASSIGN(WebContentsImpl); }; diff --git a/content/common/accessibility_mode_enums.h b/content/common/accessibility_mode_enums.h new file mode 100644 index 0000000..ee51d6b --- /dev/null +++ b/content/common/accessibility_mode_enums.h @@ -0,0 +1,38 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_COMMON_ACCESSIBILITY_MODE_ENUMS_H_ +#define CONTENT_COMMON_ACCESSIBILITY_MODE_ENUMS_H_ + +// Note: keep enums in content/browser/resources/accessibility/accessibility.js +// in sync with these two enums. +enum AccessibilityModeFlag { + // Accessibility updates are processed to create platform trees and events are + // passed to platform APIs in the browser. + AccessibilityModeFlagPlatform = 1 << 0, + + // Accessibility is on, and the full tree is computed. If this flag is off, + // only limited information about editable text nodes is sent to the browser + // process. Useful for implementing limited UIA on tablets. + AccessibilityModeFlagFullTree = 1 << 1, +}; + +enum AccessibilityMode { + // All accessibility is off. + AccessibilityModeOff = 0, + + // Renderer accessibility is on, platform APIs are called, but only limited + // information is available (see AccessibilityModeFlagEditableTextOnly). + AccessibilityModeEditableTextOnly = AccessibilityModeFlagPlatform, + + // Renderer accessibility is on, and platform APIs are called. + AccessibilityModeComplete = + AccessibilityModeFlagPlatform | AccessibilityModeFlagFullTree, + + // Renderer accessibility is on, and events are passed to any extensions + // requesting automation, but not to platform accessibility. + AccessibilityModeTreeOnly = AccessibilityModeFlagFullTree, +}; + +#endif // CONTENT_COMMON_ACCESSIBILITY_MODE_ENUMS_H_ diff --git a/content/common/frame_message_enums.h b/content/common/frame_message_enums.h index d2f9d8a..c459896 100644 --- a/content/common/frame_message_enums.h +++ b/content/common/frame_message_enums.h @@ -5,7 +5,7 @@ #ifndef CONTENT_COMMON_FRAME_MESSAGES_ENUMS_H_ #define CONTENT_COMMON_FRAME_MESSAGES_ENUMS_H_ -#include "ipc/ipc_message_macros.h" +#include "content/common/accessibility_mode_enums.h" struct FrameMsg_Navigate_Type { public: diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h index 66ab428..6f7bb5e 100644 --- a/content/common/frame_messages.h +++ b/content/common/frame_messages.h @@ -26,6 +26,9 @@ #define IPC_MESSAGE_START FrameMsgStart +IPC_ENUM_TRAITS_MIN_MAX_VALUE(AccessibilityMode, + AccessibilityModeOff, + AccessibilityModeComplete) IPC_ENUM_TRAITS_MIN_MAX_VALUE(content::JavaScriptMessageType, content::JAVASCRIPT_MESSAGE_TYPE_ALERT, content::JAVASCRIPT_MESSAGE_TYPE_PROMPT) @@ -392,6 +395,10 @@ IPC_MESSAGE_ROUTED1(FrameMsg_TextSurroundingSelectionRequest, // needed to support navigation transitions. IPC_MESSAGE_ROUTED1(FrameMsg_AddStyleSheetByURL, std::string) +// Change the accessibility mode in the renderer process. +IPC_MESSAGE_ROUTED1(FrameMsg_SetAccessibilityMode, + AccessibilityMode) + // ----------------------------------------------------------------------------- // Messages sent from the renderer to the browser. diff --git a/content/common/view_message_enums.h b/content/common/view_message_enums.h index 37179e8..4d3d193 100644 --- a/content/common/view_message_enums.h +++ b/content/common/view_message_enums.h @@ -22,34 +22,4 @@ struct ViewHostMsg_UpdateRect_Flags { } }; -// Note: keep enums in content/browser/resources/accessibility/accessibility.js -// in sync with these two enums. -enum AccessibilityModeFlag { - // Accessibility updates are processed to create platform trees and events are - // passed to platform APIs in the browser. - AccessibilityModeFlagPlatform = 1 << 0, - - // Accessibility is on, and the full tree is computed. If this flag is off, - // only limited information about editable text nodes is sent to the browser - // process. Useful for implementing limited UIA on tablets. - AccessibilityModeFlagFullTree = 1 << 1, -}; - -enum AccessibilityMode { - // All accessibility is off. - AccessibilityModeOff = 0, - - // Renderer accessibility is on, platform APIs are called, but only limited - // information is available (see AccessibilityModeFlagEditableTextOnly). - AccessibilityModeEditableTextOnly = AccessibilityModeFlagPlatform, - - // Renderer accessibility is on, and platform APIs are called. - AccessibilityModeComplete = - AccessibilityModeFlagPlatform | AccessibilityModeFlagFullTree, - - // Renderer accessibility is on, and events are passed to any extensions - // requesting automation, but not to platform accessibility. - AccessibilityModeTreeOnly = AccessibilityModeFlagFullTree, -}; - #endif // CONTENT_COMMON_VIEW_MESSAGES_ENUMS_H_ diff --git a/content/common/view_messages.h b/content/common/view_messages.h index f4a765a..e55e51e 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h @@ -68,7 +68,6 @@ #define IPC_MESSAGE_START ViewMsgStart -IPC_ENUM_TRAITS(AccessibilityMode) IPC_ENUM_TRAITS(blink::WebMediaPlayerAction::Type) IPC_ENUM_TRAITS(blink::WebPluginAction::Type) IPC_ENUM_TRAITS(blink::WebPopupType) @@ -479,9 +478,6 @@ IPC_STRUCT_BEGIN(ViewMsg_New_Params) // The properties of the screen associated with the view. IPC_STRUCT_MEMBER(blink::WebScreenInfo, screen_info) - - // The accessibility mode of the renderer. - IPC_STRUCT_MEMBER(AccessibilityMode, accessibility_mode) IPC_STRUCT_END() IPC_STRUCT_BEGIN(ViewMsg_PostMessage_Params) @@ -869,10 +865,6 @@ IPC_MESSAGE_ROUTED2(ViewMsg_SavePageAsMHTML, IPC_MESSAGE_CONTROL1(ViewMsg_TempCrashWithData, GURL /* data */) -// Change the accessibility mode in the renderer process. -IPC_MESSAGE_ROUTED1(ViewMsg_SetAccessibilityMode, - AccessibilityMode) - // An acknowledge to ViewHostMsg_MultipleTargetsTouched to notify the renderer // process to release the magnified image. IPC_MESSAGE_ROUTED1(ViewMsg_ReleaseDisambiguationPopupBitmap, diff --git a/content/public/browser/render_frame_host.h b/content/public/browser/render_frame_host.h index 31f4d8d..dde20fe 100644 --- a/content/public/browser/render_frame_host.h +++ b/content/public/browser/render_frame_host.h @@ -12,6 +12,7 @@ #include "ipc/ipc_listener.h" #include "ipc/ipc_sender.h" #include "ui/gfx/native_widget_types.h" +#include "ui/gfx/rect.h" #include "url/gurl.h" namespace base { @@ -72,6 +73,14 @@ class CONTENT_EXPORT RenderFrameHost : public IPC::Listener, virtual void ExecuteJavaScript(const base::string16& javascript, const JavaScriptResultCallback& callback) = 0; + // Accessibility actions. + virtual void AccessibilitySetFocus(int acc_obj_id) = 0; + virtual void AccessibilityDoDefaultAction(int acc_obj_id) = 0; + virtual void AccessibilityScrollToMakeVisible( + int acc_obj_id, const gfx::Rect& subfocus) = 0; + virtual void AccessibilitySetTextSelection( + int acc_obj_id, int start_offset, int end_offset) = 0; + // Temporary until we get rid of RenderViewHost. virtual RenderViewHost* GetRenderViewHost() = 0; diff --git a/content/public/browser/render_widget_host.h b/content/public/browser/render_widget_host.h index 049ee70..a87e3fa 100644 --- a/content/public/browser/render_widget_host.h +++ b/content/public/browser/render_widget_host.h @@ -189,42 +189,6 @@ class CONTENT_EXPORT RenderWidgetHost : public IPC::Sender { virtual void UnlockBackingStore() = 0; #endif - // Send a command to the renderer to turn on full accessibility. - virtual void EnableFullAccessibilityMode() = 0; - - // Check whether this RenderWidget has full accessibility mode. - virtual bool IsFullAccessibilityModeForTesting() = 0; - - // Send a command to the renderer to turn on tree only accessibility. - virtual void EnableTreeOnlyAccessibilityMode() = 0; - - // Check whether this RenderWidget has tree-only accessibility mode. - virtual bool IsTreeOnlyAccessibilityModeForTesting() = 0; - - // Relay a request from assistive technology to perform the default action - // on a given node. - virtual void AccessibilityDoDefaultAction(int object_id) = 0; - - // Relay a request from assistive technology to set focus to a given node. - virtual void AccessibilitySetFocus(int object_id) = 0; - - // Relay a request from assistive technology to make a given object - // visible by scrolling as many scrollable containers as necessary. - // In addition, if it's not possible to make the entire object visible, - // scroll so that the |subfocus| rect is visible at least. The subfocus - // rect is in local coordinates of the object itself. - virtual void AccessibilityScrollToMakeVisible( - int acc_obj_id, gfx::Rect subfocus) = 0; - - // Relay a request from assistive technology to move a given object - // to a specific location, in the WebContents area coordinate space, i.e. - // (0, 0) is the top-left corner of the WebContents. - virtual void AccessibilityScrollToPoint(int acc_obj_id, gfx::Point point) = 0; - - // Relay a request from assistive technology to set text selection. - virtual void AccessibilitySetTextSelection( - int acc_obj_id, int start_offset, int end_offset) = 0; - // Forwards the given message to the renderer. These are called by // the view when it has received a message. virtual void ForwardMouseEvent( diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h index b39553e..b163306 100644 --- a/content/public/browser/web_contents.h +++ b/content/public/browser/web_contents.h @@ -222,6 +222,18 @@ class WebContents : public PageNavigator, virtual void SetUserAgentOverride(const std::string& override) = 0; virtual const std::string& GetUserAgentOverride() const = 0; + // Enable the accessibility tree for this WebContents in the renderer, + // but don't enable creating a native accessibility tree on the browser + // side. + virtual void EnableTreeOnlyAccessibilityMode() = 0; + + // Returns true only if "tree only" accessibility mode is on. + virtual bool IsTreeOnlyAccessibilityModeForTesting() const = 0; + + // Returns true only if complete accessibility mode is on, meaning there's + // both renderer accessibility, and a native browser accessibility tree. + virtual bool IsFullAccessibilityModeForTesting() const = 0; + #if defined(OS_WIN) virtual void SetParentNativeViewAccessible( gfx::NativeViewAccessible accessible_parent) = 0; diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc index 0a19197..f4e44ca 100644 --- a/content/public/test/render_view_test.cc +++ b/content/public/test/render_view_test.cc @@ -198,8 +198,7 @@ void RenderViewTest::SetUp() { false, // hidden false, // never_visible 1, // next_page_id - blink::WebScreenInfo(), - AccessibilityModeOff); + blink::WebScreenInfo()); view->AddRef(); view_ = view; } diff --git a/content/renderer/accessibility/blink_ax_tree_source.cc b/content/renderer/accessibility/blink_ax_tree_source.cc index 4b675a3..76944de3 100644 --- a/content/renderer/accessibility/blink_ax_tree_source.cc +++ b/content/renderer/accessibility/blink_ax_tree_source.cc @@ -10,6 +10,7 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "content/renderer/accessibility/blink_ax_enum_conversion.h" +#include "content/renderer/render_frame_impl.h" #include "content/renderer/render_view_impl.h" #include "third_party/WebKit/public/platform/WebRect.h" #include "third_party/WebKit/public/platform/WebSize.h" @@ -32,6 +33,7 @@ using blink::WebAXObject; using blink::WebDocument; using blink::WebDocumentType; using blink::WebElement; +using blink::WebFrame; using blink::WebLocalFrame; using blink::WebNode; using blink::WebVector; @@ -93,8 +95,8 @@ void AddIntListAttributeFromWebObjects(ui::AXIntListAttribute attr, } // Anonymous namespace -BlinkAXTreeSource::BlinkAXTreeSource(RenderViewImpl* render_view) - : render_view_(render_view) { +BlinkAXTreeSource::BlinkAXTreeSource(RenderFrameImpl* render_frame) + : render_frame_(render_frame) { } BlinkAXTreeSource::~BlinkAXTreeSource() { @@ -550,13 +552,11 @@ void BlinkAXTreeSource::SerializeNode(blink::WebAXObject src, } blink::WebDocument BlinkAXTreeSource::GetMainDocument() const { - WebView* view = render_view_->GetWebView(); - WebLocalFrame* main_frame = - view ? view->mainFrame()->toWebLocalFrame() : NULL; + WebView* view = render_frame_->render_view()->GetWebView(); + WebFrame* main_frame = view ? view->mainFrame() : NULL; if (main_frame) return main_frame->document(); - return WebDocument(); } diff --git a/content/renderer/accessibility/blink_ax_tree_source.h b/content/renderer/accessibility/blink_ax_tree_source.h index 52b9082..007df07 100644 --- a/content/renderer/accessibility/blink_ax_tree_source.h +++ b/content/renderer/accessibility/blink_ax_tree_source.h @@ -11,12 +11,12 @@ namespace content { -class RenderViewImpl; +class RenderFrameImpl; class BlinkAXTreeSource : public ui::AXTreeSource<blink::WebAXObject> { public: - BlinkAXTreeSource(RenderViewImpl* render_view); + BlinkAXTreeSource(RenderFrameImpl* render_frame); virtual ~BlinkAXTreeSource(); // Walks up the ancestor chain to see if this is a descendant of the root. @@ -41,7 +41,7 @@ class BlinkAXTreeSource blink::WebDocument GetMainDocument() const; private: - RenderViewImpl* render_view_; + RenderFrameImpl* render_frame_; }; } // namespace content diff --git a/content/renderer/accessibility/renderer_accessibility.cc b/content/renderer/accessibility/renderer_accessibility.cc index 9a575a1..1bf4022 100644 --- a/content/renderer/accessibility/renderer_accessibility.cc +++ b/content/renderer/accessibility/renderer_accessibility.cc @@ -4,6 +4,7 @@ #include "content/renderer/accessibility/renderer_accessibility.h" +#include "content/renderer/render_frame_impl.h" #include "content/renderer/render_view_impl.h" #include "third_party/WebKit/public/web/WebDocument.h" #include "third_party/WebKit/public/web/WebFrame.h" @@ -16,16 +17,16 @@ using blink::WebView; namespace content { RendererAccessibility::RendererAccessibility( - RenderViewImpl* render_view) - : RenderViewObserver(render_view), - render_view_(render_view) { + RenderFrameImpl* render_frame) + : RenderFrameObserver(render_frame), + render_frame_(render_frame) { } RendererAccessibility::~RendererAccessibility() { } WebDocument RendererAccessibility::GetMainDocument() { - WebView* view = render_view()->GetWebView(); + WebView* view = render_frame_->render_view()->GetWebView(); WebFrame* main_frame = view ? view->mainFrame() : NULL; if (main_frame) diff --git a/content/renderer/accessibility/renderer_accessibility.h b/content/renderer/accessibility/renderer_accessibility.h index 9ddb6ed..b10d21f 100644 --- a/content/renderer/accessibility/renderer_accessibility.h +++ b/content/renderer/accessibility/renderer_accessibility.h @@ -6,7 +6,7 @@ #define CONTENT_RENDERER_ACCESSIBILITY_RENDERER_ACCESSIBILITY_H_ #include "content/common/accessibility_messages.h" -#include "content/public/renderer/render_view_observer.h" +#include "content/public/renderer/render_frame_observer.h" #include "third_party/WebKit/public/web/WebAXObject.h" namespace blink { @@ -14,7 +14,7 @@ class WebDocument; }; namespace content { -class RenderViewImpl; +class RenderFrameImpl; enum RendererAccessibilityType { // Turns on Blink accessibility and provides a full accessibility @@ -34,9 +34,9 @@ enum RendererAccessibilityType { // by automation tools, and Windows 8 uses them to determine when the // on-screen keyboard should be shown. // -// An instance of this class (or rather, a subclass) belongs to RenderViewImpl. +// An instance of this class (or rather, a subclass) belongs to RenderFrameImpl. // Accessibility is initialized based on the AccessibilityMode of -// RenderViewImpl; it lazily starts as Off or EditableTextOnly depending on +// RenderFrameImpl; it lazily starts as Off or EditableTextOnly depending on // the operating system, and switches to Complete if assistive technology is // detected or a flag is set. // @@ -58,14 +58,15 @@ enum RendererAccessibilityType { // to support opening the on-screen keyboard in response to // touch events on Windows 8 in Metro mode. // -class CONTENT_EXPORT RendererAccessibility : public RenderViewObserver { +class CONTENT_EXPORT RendererAccessibility : public RenderFrameObserver { public: - explicit RendererAccessibility(RenderViewImpl* render_view); + explicit RendererAccessibility(RenderFrameImpl* render_frame); virtual ~RendererAccessibility(); // Called when an accessibility notification occurs in Blink. virtual void HandleWebAccessibilityEvent( const blink::WebAXObject& obj, blink::WebAXEvent event) = 0; + virtual void FocusedNodeChanged(const blink::WebNode& node) = 0; // Gets the type of this RendererAccessibility object. Primarily intended for // testing. @@ -76,8 +77,8 @@ class CONTENT_EXPORT RendererAccessibility : public RenderViewObserver { // no view or frame. blink::WebDocument GetMainDocument(); - // The RenderViewImpl that owns us. - RenderViewImpl* render_view_; + // The RenderFrameImpl that owns us. + RenderFrameImpl* render_frame_; DISALLOW_COPY_AND_ASSIGN(RendererAccessibility); }; diff --git a/content/renderer/accessibility/renderer_accessibility_browsertest.cc b/content/renderer/accessibility/renderer_accessibility_browsertest.cc index 2ea3b39..6bb5c79 100644 --- a/content/renderer/accessibility/renderer_accessibility_browsertest.cc +++ b/content/renderer/accessibility/renderer_accessibility_browsertest.cc @@ -8,6 +8,7 @@ #include "content/common/view_message_enums.h" #include "content/public/test/render_view_test.h" #include "content/renderer/accessibility/renderer_accessibility_complete.h" +#include "content/renderer/render_frame_impl.h" #include "content/renderer/render_view_impl.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/WebKit/public/platform/WebSize.h" @@ -23,8 +24,8 @@ namespace content { class TestRendererAccessibilityComplete : public RendererAccessibilityComplete { public: - explicit TestRendererAccessibilityComplete(RenderViewImpl* render_view) - : RendererAccessibilityComplete(render_view) { + explicit TestRendererAccessibilityComplete(RenderFrameImpl* render_frame) + : RendererAccessibilityComplete(render_frame) { } void SendPendingAccessibilityEvents() { @@ -50,7 +51,7 @@ class RendererAccessibilityTest : public RenderViewTest { } void SetMode(AccessibilityMode mode) { - view()->OnSetAccessibilityMode(mode); + frame()->OnSetAccessibilityMode(mode); } void GetLastAccEvent( @@ -240,7 +241,7 @@ TEST_F(RendererAccessibilityTest, SendFullAccessibilityTreeOnReload) { // Creating a RendererAccessibilityComplete should sent the tree // to the browser. scoped_ptr<TestRendererAccessibilityComplete> accessibility( - new TestRendererAccessibilityComplete(view())); + new TestRendererAccessibilityComplete(frame())); accessibility->SendPendingAccessibilityEvents(); EXPECT_EQ(4, CountAccessibilityNodesSentToBrowser()); @@ -310,7 +311,7 @@ TEST_F(RendererAccessibilityTest, // Creating a RendererAccessibilityComplete should send the tree // to the browser. scoped_ptr<TestRendererAccessibilityComplete> accessibility( - new TestRendererAccessibilityComplete(view())); + new TestRendererAccessibilityComplete(frame())); accessibility->SendPendingAccessibilityEvents(); EXPECT_EQ(5, CountAccessibilityNodesSentToBrowser()); @@ -364,7 +365,7 @@ TEST_F(RendererAccessibilityTest, HideAccessibilityObject) { LoadHTML(html.c_str()); scoped_ptr<TestRendererAccessibilityComplete> accessibility( - new TestRendererAccessibilityComplete(view())); + new TestRendererAccessibilityComplete(frame())); accessibility->SendPendingAccessibilityEvents(); EXPECT_EQ(4, CountAccessibilityNodesSentToBrowser()); @@ -416,7 +417,7 @@ TEST_F(RendererAccessibilityTest, ShowAccessibilityObject) { LoadHTML(html.c_str()); scoped_ptr<TestRendererAccessibilityComplete> accessibility( - new TestRendererAccessibilityComplete(view())); + new TestRendererAccessibilityComplete(frame())); accessibility->SendPendingAccessibilityEvents(); EXPECT_EQ(3, CountAccessibilityNodesSentToBrowser()); @@ -460,7 +461,7 @@ TEST_F(RendererAccessibilityTest, DetachAccessibilityObject) { LoadHTML(html.c_str()); scoped_ptr<TestRendererAccessibilityComplete> accessibility( - new TestRendererAccessibilityComplete(view())); + new TestRendererAccessibilityComplete(frame())); accessibility->SendPendingAccessibilityEvents(); EXPECT_EQ(7, CountAccessibilityNodesSentToBrowser()); @@ -528,7 +529,7 @@ TEST_F(RendererAccessibilityTest, EventOnObjectNotInTree) { LoadHTML(html.c_str()); scoped_ptr<TestRendererAccessibilityComplete> accessibility( - new TestRendererAccessibilityComplete(view())); + new TestRendererAccessibilityComplete(frame())); accessibility->SendPendingAccessibilityEvents(); EXPECT_EQ(3, CountAccessibilityNodesSentToBrowser()); diff --git a/content/renderer/accessibility/renderer_accessibility_complete.cc b/content/renderer/accessibility/renderer_accessibility_complete.cc index 2e72dde..fd64718 100644 --- a/content/renderer/accessibility/renderer_accessibility_complete.cc +++ b/content/renderer/accessibility/renderer_accessibility_complete.cc @@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/message_loop/message_loop.h" #include "content/renderer/accessibility/blink_ax_enum_conversion.h" +#include "content/renderer/render_frame_impl.h" #include "content/renderer/render_view_impl.h" #include "third_party/WebKit/public/web/WebAXObject.h" #include "third_party/WebKit/public/web/WebDocument.h" @@ -28,10 +29,10 @@ using blink::WebView; namespace content { RendererAccessibilityComplete::RendererAccessibilityComplete( - RenderViewImpl* render_view) - : RendererAccessibility(render_view), + RenderFrameImpl* render_frame) + : RendererAccessibility(render_frame), weak_factory_(this), - tree_source_(render_view), + tree_source_(render_frame), serializer_(&tree_source_), last_scroll_offset_(gfx::Size()), ack_pending_(false) { @@ -91,13 +92,6 @@ void RendererAccessibilityComplete::FocusedNodeChanged(const WebNode& node) { } } -void RendererAccessibilityComplete::DidFinishLoad(blink::WebLocalFrame* frame) { - const WebDocument& document = GetMainDocument(); - if (document.isNull()) - return; -} - - void RendererAccessibilityComplete::HandleWebAccessibilityEvent( const blink::WebAXObject& obj, blink::WebAXEvent event) { HandleAXEvent(obj, AXEventFromBlink(event)); @@ -162,7 +156,7 @@ void RendererAccessibilityComplete::SendPendingAccessibilityEvents() { if (pending_events_.empty()) return; - if (render_view_->is_swapped_out()) + if (render_frame_->is_swapped_out()) return; ack_pending_ = true; @@ -387,7 +381,7 @@ void RendererAccessibilityComplete::OnSetFocus(int acc_obj_id) { // By convention, calling SetFocus on the root of the tree should clear the // current focus. Otherwise set the focus to the new node. if (acc_obj_id == root.axID()) - render_view()->GetWebView()->clearFocusedElement(); + render_frame_->GetRenderView()->GetWebView()->clearFocusedElement(); else obj.setFocused(true); } diff --git a/content/renderer/accessibility/renderer_accessibility_complete.h b/content/renderer/accessibility/renderer_accessibility_complete.h index 507b734..cb34c15 100644 --- a/content/renderer/accessibility/renderer_accessibility_complete.h +++ b/content/renderer/accessibility/renderer_accessibility_complete.h @@ -37,18 +37,17 @@ class RenderViewImpl; class CONTENT_EXPORT RendererAccessibilityComplete : public RendererAccessibility { public: - explicit RendererAccessibilityComplete(RenderViewImpl* render_view); + explicit RendererAccessibilityComplete(RenderFrameImpl* render_frame); virtual ~RendererAccessibilityComplete(); - // RenderView::Observer implementation. + // RenderFrameObserver implementation. virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; - virtual void FocusedNodeChanged(const blink::WebNode& node) OVERRIDE; - virtual void DidFinishLoad(blink::WebLocalFrame* frame) OVERRIDE; // RendererAccessibility. virtual void HandleWebAccessibilityEvent( const blink::WebAXObject& obj, blink::WebAXEvent event) OVERRIDE; virtual RendererAccessibilityType GetType() OVERRIDE; + virtual void FocusedNodeChanged(const blink::WebNode& node) OVERRIDE; void HandleAXEvent(const blink::WebAXObject& obj, ui::AXEvent event); diff --git a/content/renderer/accessibility/renderer_accessibility_focus_only.cc b/content/renderer/accessibility/renderer_accessibility_focus_only.cc index bda3e8f..4391412 100644 --- a/content/renderer/accessibility/renderer_accessibility_focus_only.cc +++ b/content/renderer/accessibility/renderer_accessibility_focus_only.cc @@ -4,6 +4,7 @@ #include "content/renderer/accessibility/renderer_accessibility_focus_only.h" +#include "content/renderer/render_frame_impl.h" #include "content/renderer/render_view_impl.h" #include "third_party/WebKit/public/web/WebDocument.h" #include "third_party/WebKit/public/web/WebElement.h" @@ -26,8 +27,8 @@ const int kInitialId = 2; namespace content { RendererAccessibilityFocusOnly::RendererAccessibilityFocusOnly( - RenderViewImpl* render_view) - : RendererAccessibility(render_view), + RenderFrameImpl* render_frame) + : RendererAccessibility(render_frame), next_id_(kInitialId) { } @@ -48,17 +49,12 @@ void RendererAccessibilityFocusOnly::FocusedNodeChanged(const WebNode& node) { HandleFocusedNodeChanged(node, true); } -void RendererAccessibilityFocusOnly::DidFinishLoad( - blink::WebLocalFrame* frame) { - WebView* view = render_view()->GetWebView(); - if (view->focusedFrame() != frame) - return; - - WebDocument document = frame->document(); +void RendererAccessibilityFocusOnly::DidFinishLoad() { // Send an accessible tree to the browser, but do not post a native // focus event. This is important so that if focus is initially in an // editable text field, Windows will know to pop up the keyboard if the // user touches it and focus doesn't change. + const WebDocument& document = GetMainDocument(); HandleFocusedNodeChanged(document.focusedElement(), false); } @@ -74,13 +70,13 @@ void RendererAccessibilityFocusOnly::HandleFocusedNodeChanged( // Check HasIMETextFocus first, because it will correctly handle // focus in a text box inside a ppapi plug-in. Otherwise fall back on // checking the focused node in Blink. - if (render_view_->HasIMETextFocus()) { + if (render_frame_->render_view()->HasIMETextFocus()) { node_has_focus = true; node_is_editable_text = true; } else { node_has_focus = !node.isNull(); node_is_editable_text = - node_has_focus && render_view_->IsEditableNode(node); + node_has_focus && render_frame_->render_view()->IsEditableNode(node); } std::vector<AccessibilityHostMsg_EventParams> events; @@ -109,7 +105,7 @@ void RendererAccessibilityFocusOnly::HandleFocusedNodeChanged( (1 << ui::AX_STATE_FOCUSABLE); if (!node_has_focus) root.state |= (1 << ui::AX_STATE_FOCUSED); - root.location = gfx::Rect(render_view_->size()); + root.location = gfx::Rect(render_frame_->render_view()->size()); root.child_ids.push_back(next_id_); child.id = next_id_; @@ -118,7 +114,7 @@ void RendererAccessibilityFocusOnly::HandleFocusedNodeChanged( if (!node.isNull() && node.isElementNode()) { child.location = gfx::Rect( const_cast<WebNode&>(node).to<WebElement>().boundsInViewportSpace()); - } else if (render_view_->HasIMETextFocus()) { + } else if (render_frame_->render_view()->HasIMETextFocus()) { child.location = root.location; } else { child.location = gfx::Rect(); diff --git a/content/renderer/accessibility/renderer_accessibility_focus_only.h b/content/renderer/accessibility/renderer_accessibility_focus_only.h index 806cd4b..5306808 100644 --- a/content/renderer/accessibility/renderer_accessibility_focus_only.h +++ b/content/renderer/accessibility/renderer_accessibility_focus_only.h @@ -9,7 +9,7 @@ namespace content { -// This is an accsessibility implementation that only handles whatever +// This is an accessibility implementation that only handles whatever // node has focus, ignoring everything else. It's here because on Windows 8, // we need to use accessibility APIs to tell the operating system when a // touch should pop up the on-screen keyboard, but it's not worth the @@ -49,17 +49,17 @@ namespace content { // bounds. class RendererAccessibilityFocusOnly : public RendererAccessibility { public: - explicit RendererAccessibilityFocusOnly(RenderViewImpl* render_view); + explicit RendererAccessibilityFocusOnly(RenderFrameImpl* render_frame); virtual ~RendererAccessibilityFocusOnly(); // RendererAccessibility implementation. virtual void HandleWebAccessibilityEvent( const blink::WebAXObject& obj, blink::WebAXEvent event) OVERRIDE; virtual RendererAccessibilityType GetType() OVERRIDE; - - // RenderView::Observer implementation. virtual void FocusedNodeChanged(const blink::WebNode& node) OVERRIDE; - virtual void DidFinishLoad(blink::WebLocalFrame* frame) OVERRIDE; + + // RenderFrameObserver implementation. + virtual void DidFinishLoad() OVERRIDE; private: void HandleFocusedNodeChanged(const blink::WebNode& node, diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 85308be..a8baba2 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc @@ -47,6 +47,8 @@ #include "content/public/renderer/navigation_state.h" #include "content/public/renderer/render_frame_observer.h" #include "content/renderer/accessibility/renderer_accessibility.h" +#include "content/renderer/accessibility/renderer_accessibility_complete.h" +#include "content/renderer/accessibility/renderer_accessibility_focus_only.h" #include "content/renderer/browser_plugin/browser_plugin.h" #include "content/renderer/browser_plugin/browser_plugin_manager.h" #include "content/renderer/child_frame_compositing_helper.h" @@ -411,6 +413,8 @@ RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) geolocation_dispatcher_(NULL), push_messaging_dispatcher_(NULL), screen_orientation_dispatcher_(NULL), + accessibility_mode_(AccessibilityModeOff), + renderer_accessibility_(NULL), weak_factory_(this) { std::pair<RoutingIDFrameMap::iterator, bool> result = g_routing_id_frame_map.Get().insert(std::make_pair(routing_id_, this)); @@ -501,8 +505,8 @@ void RenderFrameImpl::PepperTextInputTypeChanged( GetRenderWidget()->UpdateTextInputState( RenderWidget::NO_SHOW_IME, RenderWidget::FROM_NON_IME); - if (render_view_->renderer_accessibility()) - render_view_->renderer_accessibility()->FocusedNodeChanged(WebNode()); + if (renderer_accessibility()) + renderer_accessibility()->FocusedNodeChanged(WebNode()); } void RenderFrameImpl::PepperCaretPositionChanged( @@ -723,6 +727,8 @@ bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { OnTextSurroundingSelectionRequest) IPC_MESSAGE_HANDLER(FrameMsg_AddStyleSheetByURL, OnAddStyleSheetByURL) + IPC_MESSAGE_HANDLER(FrameMsg_SetAccessibilityMode, + OnSetAccessibilityMode) #if defined(OS_MACOSX) IPC_MESSAGE_HANDLER(InputMsg_CopyToFindPboard, OnCopyToFindPboard) #endif @@ -1178,6 +1184,25 @@ void RenderFrameImpl::OnExtendSelectionAndDelete(int before, int after) { frame_->extendSelectionAndDelete(before, after); } +void RenderFrameImpl::OnSetAccessibilityMode(AccessibilityMode new_mode) { + if (accessibility_mode_ == new_mode) + return; + accessibility_mode_ = new_mode; + if (renderer_accessibility_) { + delete renderer_accessibility_; + renderer_accessibility_ = NULL; + } + if (accessibility_mode_ == AccessibilityModeOff) + return; + + if (accessibility_mode_ & AccessibilityModeFlagFullTree) + renderer_accessibility_ = new RendererAccessibilityComplete(this); +#if !defined(OS_ANDROID) + else + renderer_accessibility_ = new RendererAccessibilityFocusOnly(this); +#endif +} + void RenderFrameImpl::OnReload(bool ignore_cache) { frame_->reload(ignore_cache); } @@ -3135,6 +3160,17 @@ void RenderFrameImpl::didChangeLoadProgress(double load_progress) { Send(new FrameHostMsg_DidChangeLoadProgress(routing_id_, load_progress)); } +void RenderFrameImpl::HandleWebAccessibilityEvent( + const blink::WebAXObject& obj, blink::WebAXEvent event) { + if (renderer_accessibility_) + renderer_accessibility_->HandleWebAccessibilityEvent(obj, event); +} + +void RenderFrameImpl::FocusedNodeChanged(const WebNode& node) { + if (renderer_accessibility_) + renderer_accessibility_->FocusedNodeChanged(node); +} + WebNavigationPolicy RenderFrameImpl::DecidePolicyForNavigation( RenderFrame* render_frame, WebFrame* frame, diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index e9e8270..3cd7082 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h @@ -14,6 +14,7 @@ #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/process/process_handle.h" +#include "content/common/accessibility_mode_enums.h" #include "content/common/mojo/service_registry_impl.h" #include "content/public/common/javascript_message_type.h" #include "content/public/common/referrer.h" @@ -22,6 +23,7 @@ #include "content/renderer/render_frame_proxy.h" #include "content/renderer/renderer_webcookiejar_impl.h" #include "ipc/ipc_message.h" +#include "third_party/WebKit/public/web/WebAXObject.h" #include "third_party/WebKit/public/web/WebDataSource.h" #include "third_party/WebKit/public/web/WebFrameClient.h" #include "third_party/WebKit/public/web/WebHistoryCommitType.h" @@ -65,6 +67,7 @@ class MidiDispatcher; class NotificationProvider; class PepperPluginInstanceImpl; class PushMessagingDispatcher; +class RendererAccessibility; class RendererCdmManager; class RendererMediaPlayerManager; class RendererPpapiHost; @@ -148,6 +151,22 @@ class CONTENT_EXPORT RenderFrameImpl virtual void didStopLoading(); virtual void didChangeLoadProgress(double load_progress); + AccessibilityMode accessibility_mode() { + return accessibility_mode_; + } + + RendererAccessibility* renderer_accessibility() { + return renderer_accessibility_; + } + + void HandleWebAccessibilityEvent(const blink::WebAXObject& obj, + blink::WebAXEvent event); + + // TODO(dmazzoni): the only reason this is here is to plumb it through to + // RendererAccessibility. It should be part of RenderFrameObserver, once + // blink has a separate accessibility tree per frame. + void FocusedNodeChanged(const blink::WebNode& node); + #if defined(ENABLE_PLUGINS) // Notification that a PPAPI plugin has been created. void PepperPluginCreated(RendererPpapiHost* host); @@ -419,6 +438,7 @@ class CONTENT_EXPORT RenderFrameImpl private: friend class RenderFrameObserver; + friend class RendererAccessibilityTest; FRIEND_TEST_ALL_PREFIXES(RendererAccessibilityTest, AccessibilityMessagesQueueWhileSwappedOut); FRIEND_TEST_ALL_PREFIXES(RenderFrameImplTest, @@ -429,6 +449,8 @@ class CONTENT_EXPORT RenderFrameImpl FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, SendSwapOutACK); FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, SetEditableSelectionAndComposition); + FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, + OnSetAccessibilityMode); typedef std::map<GURL, double> HostZoomLevels; @@ -476,6 +498,7 @@ class CONTENT_EXPORT RenderFrameImpl void OnReload(bool ignore_cache); void OnTextSurroundingSelectionRequest(size_t max_length); void OnAddStyleSheetByURL(const std::string& url); + void OnSetAccessibilityMode(AccessibilityMode new_mode); #if defined(OS_MACOSX) void OnCopyToFindPboard(); #endif @@ -664,6 +687,13 @@ class CONTENT_EXPORT RenderFrameImpl // initialized. ScreenOrientationDispatcher* screen_orientation_dispatcher_; + // The current accessibility mode. + AccessibilityMode accessibility_mode_; + + // Only valid if |accessibility_mode_| is anything other than + // AccessibilityModeOff. + RendererAccessibility* renderer_accessibility_; + base::WeakPtrFactory<RenderFrameImpl> weak_factory_; DISALLOW_COPY_AND_ASSIGN(RenderFrameImpl); diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 952c7d7..acafe55 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc @@ -1349,8 +1349,7 @@ void RenderThreadImpl::OnCreateNewView(const ViewMsg_New_Params& params) { params.hidden, params.never_visible, params.next_page_id, - params.screen_info, - params.accessibility_mode); + params.screen_info); } GpuChannelHost* RenderThreadImpl::EstablishGpuChannelSync( diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index 83e282f..c3b4489 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc @@ -2334,30 +2334,30 @@ TEST_F(RenderViewImplTest, ServiceWorkerNetworkProviderSetup) { } TEST_F(RenderViewImplTest, OnSetAccessibilityMode) { - ASSERT_EQ(AccessibilityModeOff, view()->accessibility_mode()); - ASSERT_EQ((RendererAccessibility*) NULL, view()->renderer_accessibility()); + ASSERT_EQ(AccessibilityModeOff, frame()->accessibility_mode()); + ASSERT_EQ((RendererAccessibility*) NULL, frame()->renderer_accessibility()); - view()->OnSetAccessibilityMode(AccessibilityModeTreeOnly); - ASSERT_EQ(AccessibilityModeTreeOnly, view()->accessibility_mode()); - ASSERT_NE((RendererAccessibility*) NULL, view()->renderer_accessibility()); + frame()->OnSetAccessibilityMode(AccessibilityModeTreeOnly); + ASSERT_EQ(AccessibilityModeTreeOnly, frame()->accessibility_mode()); + ASSERT_NE((RendererAccessibility*) NULL, frame()->renderer_accessibility()); ASSERT_EQ(RendererAccessibilityTypeComplete, - view()->renderer_accessibility()->GetType()); + frame()->renderer_accessibility()->GetType()); - view()->OnSetAccessibilityMode(AccessibilityModeOff); - ASSERT_EQ(AccessibilityModeOff, view()->accessibility_mode()); - ASSERT_EQ((RendererAccessibility*) NULL, view()->renderer_accessibility()); + frame()->OnSetAccessibilityMode(AccessibilityModeOff); + ASSERT_EQ(AccessibilityModeOff, frame()->accessibility_mode()); + ASSERT_EQ((RendererAccessibility*) NULL, frame()->renderer_accessibility()); - view()->OnSetAccessibilityMode(AccessibilityModeComplete); - ASSERT_EQ(AccessibilityModeComplete, view()->accessibility_mode()); - ASSERT_NE((RendererAccessibility*) NULL, view()->renderer_accessibility()); + frame()->OnSetAccessibilityMode(AccessibilityModeComplete); + ASSERT_EQ(AccessibilityModeComplete, frame()->accessibility_mode()); + ASSERT_NE((RendererAccessibility*) NULL, frame()->renderer_accessibility()); ASSERT_EQ(RendererAccessibilityTypeComplete, - view()->renderer_accessibility()->GetType()); + frame()->renderer_accessibility()->GetType()); - view()->OnSetAccessibilityMode(AccessibilityModeEditableTextOnly); - ASSERT_EQ(AccessibilityModeEditableTextOnly, view()->accessibility_mode()); - ASSERT_NE((RendererAccessibility*) NULL, view()->renderer_accessibility()); + frame()->OnSetAccessibilityMode(AccessibilityModeEditableTextOnly); + ASSERT_EQ(AccessibilityModeEditableTextOnly, frame()->accessibility_mode()); + ASSERT_NE((RendererAccessibility*) NULL, frame()->renderer_accessibility()); ASSERT_EQ(RendererAccessibilityTypeFocusOnly, - view()->renderer_accessibility()->GetType()); + frame()->renderer_accessibility()->GetType()); } TEST_F(RenderViewImplTest, ScreenMetricsEmulation) { diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 4aeb478..13d98ca 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -727,8 +727,6 @@ RenderViewImpl::RenderViewImpl(RenderViewImplParams* params) speech_recognition_dispatcher_(NULL), browser_plugin_manager_(NULL), devtools_agent_(NULL), - accessibility_mode_(AccessibilityModeOff), - renderer_accessibility_(NULL), mouse_lock_dispatcher_(NULL), #if defined(OS_ANDROID) expected_content_intent_id_(0), @@ -861,9 +859,6 @@ void RenderViewImpl::Initialize(RenderViewImplParams* params) { history_controller_.reset(new HistoryController(this)); - // Create renderer_accessibility_ if needed. - OnSetAccessibilityMode(params->accessibility_mode); - new IdleUserDetector(this); if (command_line.HasSwitch(switches::kDomAutomationController)) @@ -1206,8 +1201,7 @@ RenderViewImpl* RenderViewImpl::Create( bool hidden, bool never_visible, int32 next_page_id, - const blink::WebScreenInfo& screen_info, - AccessibilityMode accessibility_mode) { + const blink::WebScreenInfo& screen_info) { DCHECK(routing_id != MSG_ROUTING_NONE); RenderViewImplParams params(opener_id, window_was_created_with_opener, @@ -1224,8 +1218,7 @@ RenderViewImpl* RenderViewImpl::Create( hidden, never_visible, next_page_id, - screen_info, - accessibility_mode); + screen_info); RenderViewImpl* render_view = NULL; if (g_create_render_view_impl) render_view = g_create_render_view_impl(¶ms); @@ -1413,7 +1406,6 @@ bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) { IPC_MESSAGE_HANDLER(ViewMsg_SetHistoryLengthAndPrune, OnSetHistoryLengthAndPrune) IPC_MESSAGE_HANDLER(ViewMsg_EnableViewSourceMode, OnEnableViewSourceMode) - IPC_MESSAGE_HANDLER(ViewMsg_SetAccessibilityMode, OnSetAccessibilityMode) IPC_MESSAGE_HANDLER(ViewMsg_DisownOpener, OnDisownOpener) IPC_MESSAGE_HANDLER(ViewMsg_ReleaseDisambiguationPopupBitmap, OnReleaseDisambiguationPopupBitmap) @@ -1755,8 +1747,7 @@ WebView* RenderViewImpl::createView(WebLocalFrame* creator, params.disposition == NEW_BACKGROUND_TAB, // hidden never_visible, 1, // next_page_id - screen_info_, - accessibility_mode_); + screen_info_); view->opened_by_user_gesture_ = params.user_gesture; // Record whether the creator frame is trying to suppress the opener field. @@ -2040,6 +2031,9 @@ void RenderViewImpl::focusedNodeChanged(const WebNode& node) { Send(new ViewHostMsg_FocusedNodeChanged(routing_id_, IsEditableNode(node))); FOR_EACH_OBSERVER(RenderViewObserver, observers_, FocusedNodeChanged(node)); + + // TODO(dmazzoni): this should be part of RenderFrameObserver. + main_render_frame()->FocusedNodeChanged(node); } void RenderViewImpl::didUpdateLayout() { @@ -2072,9 +2066,7 @@ int RenderViewImpl::historyForwardListCount() { void RenderViewImpl::postAccessibilityEvent( const WebAXObject& obj, blink::WebAXEvent event) { - if (renderer_accessibility_) { - renderer_accessibility_->HandleWebAccessibilityEvent(obj, event); - } + main_render_frame()->HandleWebAccessibilityEvent(obj, event); } void RenderViewImpl::didUpdateInspectorSetting(const WebString& key, @@ -3421,25 +3413,6 @@ void RenderViewImpl::OnSetBackgroundOpaque(bool opaque) { compositor_->setHasTransparentBackground(!opaque); } -void RenderViewImpl::OnSetAccessibilityMode(AccessibilityMode new_mode) { - if (accessibility_mode_ == new_mode) - return; - accessibility_mode_ = new_mode; - if (renderer_accessibility_) { - delete renderer_accessibility_; - renderer_accessibility_ = NULL; - } - if (accessibility_mode_ == AccessibilityModeOff) - return; - - if (accessibility_mode_ & AccessibilityModeFlagFullTree) - renderer_accessibility_ = new RendererAccessibilityComplete(this); -#if !defined(OS_ANDROID) - else - renderer_accessibility_ = new RendererAccessibilityFocusOnly(this); -#endif -} - void RenderViewImpl::OnSetActive(bool active) { if (webview()) webview()->setIsActive(active); @@ -4134,10 +4107,12 @@ bool RenderViewImpl::didTapMultipleTargets( const WebVector<WebRect>& target_rects) { // Never show a disambiguation popup when accessibility is enabled, // as this interferes with "touch exploration". - bool matchesAccessibilityModeComplete = - (accessibility_mode_ & AccessibilityModeComplete) == - AccessibilityModeComplete; - if (matchesAccessibilityModeComplete) + AccessibilityMode accessibility_mode = + main_render_frame()->accessibility_mode(); + bool matches_accessibility_mode_complete = + (accessibility_mode & AccessibilityModeComplete) == + AccessibilityModeComplete; + if (matches_accessibility_mode_complete) return false; gfx::Rect finger_rect( diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index 6efc709..207a082 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h @@ -139,7 +139,6 @@ class PepperPluginInstanceImpl; class RenderViewImplTest; class RenderViewObserver; class RenderViewTest; -class RendererAccessibility; class RendererDateTimePicker; class RendererWebColorChooserImpl; class SpeechRecognitionDispatcher; @@ -185,8 +184,7 @@ class CONTENT_EXPORT RenderViewImpl bool hidden, bool never_visible, int32 next_page_id, - const blink::WebScreenInfo& screen_info, - AccessibilityMode accessibility_mode); + const blink::WebScreenInfo& screen_info); // Used by content_layouttest_support to hook into the creation of // RenderViewImpls. @@ -220,14 +218,6 @@ class CONTENT_EXPORT RenderViewImpl RenderFrameImpl* main_render_frame() { return main_render_frame_.get(); } - AccessibilityMode accessibility_mode() { - return accessibility_mode_; - } - - RendererAccessibility* renderer_accessibility() { - return renderer_accessibility_; - } - MouseLockDispatcher* mouse_lock_dispatcher() { return mouse_lock_dispatcher_; } @@ -573,9 +563,9 @@ class CONTENT_EXPORT RenderViewImpl // For unit tests. friend class ExternalPopupMenuTest; friend class PepperDeviceTest; - friend class RendererAccessibilityTest; friend class RenderViewImplTest; friend class RenderViewTest; + friend class RendererAccessibilityTest; // TODO(nasko): Temporarily friend RenderFrameImpl, so we don't duplicate // utility functions needed in both classes, while we move frame specific @@ -599,7 +589,6 @@ class CONTENT_EXPORT RenderViewImpl FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, OnHandleKeyboardEvent); FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, OnImeTypeChanged); FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, OnNavStateChanged); - FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, OnSetAccessibilityMode); FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, OnSetTextDirection); FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, OnUpdateWebPreferences); FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, @@ -724,7 +713,6 @@ class CONTENT_EXPORT RenderViewImpl void OnPostMessageEvent(const ViewMsg_PostMessage_Params& params); void OnReleaseDisambiguationPopupBitmap(const cc::SharedBitmapId& id); void OnResetPageEncodingToDefault(); - void OnSetAccessibilityMode(AccessibilityMode new_mode); void OnSetActive(bool active); void OnSetBackgroundOpaque(bool opaque); void OnExitFullscreen(); @@ -1045,13 +1033,6 @@ class CONTENT_EXPORT RenderViewImpl DevToolsAgent* devtools_agent_; - // The current accessibility mode. - AccessibilityMode accessibility_mode_; - - // Only valid if |accessibility_mode_| is anything other than - // AccessibilityModeOff. - RendererAccessibility* renderer_accessibility_; - // Mouse Lock dispatcher attached to this view. MouseLockDispatcher* mouse_lock_dispatcher_; diff --git a/content/renderer/render_view_impl_params.cc b/content/renderer/render_view_impl_params.cc index 81522d8..6864a3d 100644 --- a/content/renderer/render_view_impl_params.cc +++ b/content/renderer/render_view_impl_params.cc @@ -22,8 +22,7 @@ RenderViewImplParams::RenderViewImplParams( bool hidden, bool never_visible, int32 next_page_id, - const blink::WebScreenInfo& screen_info, - AccessibilityMode accessibility_mode) + const blink::WebScreenInfo& screen_info) : opener_id(opener_id), window_was_created_with_opener(window_was_created_with_opener), renderer_prefs(renderer_prefs), @@ -39,8 +38,7 @@ RenderViewImplParams::RenderViewImplParams( hidden(hidden), never_visible(never_visible), next_page_id(next_page_id), - screen_info(screen_info), - accessibility_mode(accessibility_mode) {} + screen_info(screen_info) {} RenderViewImplParams::~RenderViewImplParams() {} diff --git a/content/renderer/render_view_impl_params.h b/content/renderer/render_view_impl_params.h index ecd878c..ad9a26c 100644 --- a/content/renderer/render_view_impl_params.h +++ b/content/renderer/render_view_impl_params.h @@ -37,8 +37,7 @@ struct CONTENT_EXPORT RenderViewImplParams { bool hidden, bool never_visible, int32 next_page_id, - const blink::WebScreenInfo& screen_info, - AccessibilityMode accessibility_mode); + const blink::WebScreenInfo& screen_info); ~RenderViewImplParams(); int32 opener_id; @@ -57,7 +56,6 @@ struct CONTENT_EXPORT RenderViewImplParams { bool never_visible; int32 next_page_id; const blink::WebScreenInfo& screen_info; - AccessibilityMode accessibility_mode; }; } // namespace content diff --git a/content/test/accessibility_browser_test_utils.cc b/content/test/accessibility_browser_test_utils.cc index ba0331c..e91b2cf 100644 --- a/content/test/accessibility_browser_test_utils.cc +++ b/content/test/accessibility_browser_test_utils.cc @@ -8,8 +8,9 @@ #include "base/logging.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" -#include "content/browser/renderer_host/render_view_host_impl.h" +#include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/renderer_host/render_widget_host_view_base.h" +#include "content/browser/web_contents/web_contents_impl.h" #include "content/common/view_message_enums.h" #include "content/public/browser/web_contents.h" #include "content/public/common/url_constants.h" @@ -26,9 +27,9 @@ AccessibilityNotificationWaiter::AccessibilityNotificationWaiter(Shell* shell) weak_factory_(this), event_target_id_(0) { WebContents* web_contents = shell_->web_contents(); - view_host_ = static_cast<RenderViewHostImpl*>( - web_contents->GetRenderViewHost()); - view_host_->SetAccessibilityCallbackForTesting( + frame_host_ = static_cast<RenderFrameHostImpl*>( + web_contents->GetMainFrame()); + frame_host_->SetAccessibilityCallbackForTesting( base::Bind(&AccessibilityNotificationWaiter::OnAccessibilityEvent, weak_factory_.GetWeakPtr())); } @@ -42,13 +43,14 @@ AccessibilityNotificationWaiter::AccessibilityNotificationWaiter( loop_runner_(new MessageLoopRunner()), weak_factory_(this), event_target_id_(0) { - WebContents* web_contents = shell_->web_contents(); - view_host_ = static_cast<RenderViewHostImpl*>( - web_contents->GetRenderViewHost()); - view_host_->SetAccessibilityCallbackForTesting( + WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( + shell_->web_contents()); + frame_host_ = static_cast<RenderFrameHostImpl*>( + web_contents->GetMainFrame()); + frame_host_->SetAccessibilityCallbackForTesting( base::Bind(&AccessibilityNotificationWaiter::OnAccessibilityEvent, weak_factory_.GetWeakPtr())); - view_host_->AddAccessibilityMode(accessibility_mode); + web_contents->AddAccessibilityMode(accessibility_mode); } AccessibilityNotificationWaiter::~AccessibilityNotificationWaiter() { @@ -59,7 +61,7 @@ void AccessibilityNotificationWaiter::WaitForNotification() { } const ui::AXTree& AccessibilityNotificationWaiter::GetAXTree() const { - return view_host_->ax_tree_for_testing(); + return *frame_host_->GetAXTreeForTesting(); } void AccessibilityNotificationWaiter::OnAccessibilityEvent( diff --git a/content/test/accessibility_browser_test_utils.h b/content/test/accessibility_browser_test_utils.h index 5111e3c..2e22b6f 100644 --- a/content/test/accessibility_browser_test_utils.h +++ b/content/test/accessibility_browser_test_utils.h @@ -6,14 +6,14 @@ #define CONTENT_TEST_ACCESSIBILITY_BROWSER_TEST_UTILS_H_ #include "base/memory/weak_ptr.h" -#include "content/common/view_message_enums.h" +#include "content/common/accessibility_mode_enums.h" #include "ui/accessibility/ax_node_data.h" #include "ui/accessibility/ax_tree.h" namespace content { class MessageLoopRunner; -class RenderViewHostImpl; +class RenderFrameHostImpl; class Shell; // Create an instance of this class *before* doing any operation that @@ -53,7 +53,7 @@ class AccessibilityNotificationWaiter { bool IsAboutBlank(); Shell* shell_; - RenderViewHostImpl* view_host_; + RenderFrameHostImpl* frame_host_; ui::AXEvent event_to_wait_for_; scoped_refptr<MessageLoopRunner> loop_runner_; base::WeakPtrFactory<AccessibilityNotificationWaiter> weak_factory_; |