diff options
author | mkwst@chromium.org <mkwst@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-18 07:42:26 +0000 |
---|---|---|
committer | mkwst@chromium.org <mkwst@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-18 07:42:26 +0000 |
commit | d460a7bc14844dc4a353b1a22d4f7ccd57708f4f (patch) | |
tree | a832b5741912099c89278a898120b3e4987b7dfb | |
parent | db88c3221771a6cfaa090c65b76b645931f067bc (diff) | |
download | chromium_src-d460a7bc14844dc4a353b1a22d4f7ccd57708f4f.zip chromium_src-d460a7bc14844dc4a353b1a22d4f7ccd57708f4f.tar.gz chromium_src-d460a7bc14844dc4a353b1a22d4f7ccd57708f4f.tar.bz2 |
Revert of Migrate accessibility from RenderView to RenderFrame. (https://codereview.chromium.org/273423004/)
Reason for revert:
Speculative revert to fix XP bots.
XP bots started crashing http://build.chromium.org/p/chromium.win/builders/XP%20Tests%20%281%29/builds/32011 and http://build.chromium.org/p/chromium.win/builders/XP%20Tests%20%282%29/builds/34677
This CL is the most suspicious in the range. If it doesn't fix the bots, I'll unrevert it.
Original issue's description:
> 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
>
> Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=283994
TBR=dmazzoni@chromium.org
NOTRY=true
Review URL: https://codereview.chromium.org/407493002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@284032 0039d316-1c4b-4281-b951-d872f2087c98
72 files changed, 833 insertions, 1353 deletions
diff --git a/chrome/browser/chrome_browser_application_mac.mm b/chrome/browser/chrome_browser_application_mac.mm index c48d6cc..3368c06 100644 --- a/chrome/browser/chrome_browser_application_mac.mm +++ b/chrome/browser/chrome_browser_application_mac.mm @@ -538,6 +538,11 @@ 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 c05e123..a3e48e6 100644 --- a/chrome/browser/extensions/api/automation/automation_apitest.cc +++ b/chrome/browser/extensions/api/automation/automation_apitest.cc @@ -75,8 +75,12 @@ 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); - ASSERT_FALSE(tab->IsFullAccessibilityModeForTesting()); - ASSERT_FALSE(tab->IsTreeOnlyAccessibilityModeForTesting()); + content::RenderWidgetHost* rwh = + tab->GetRenderWidgetHostView()->GetRenderWidgetHost(); + ASSERT_NE((content::RenderWidgetHost*)NULL, rwh) + << "Couldn't get RenderWidgetHost"; + ASSERT_FALSE(rwh->IsFullAccessibilityModeForTesting()); + ASSERT_FALSE(rwh->IsTreeOnlyAccessibilityModeForTesting()); base::FilePath extension_path = test_data_dir_.AppendASCII("automation/tests/basic"); @@ -84,8 +88,11 @@ IN_PROC_BROWSER_TEST_F(AutomationApiTest, TestRendererAccessibilityEnabled) { LoadExtension(extension_path); ASSERT_TRUE(got_tree.WaitUntilSatisfied()); - ASSERT_FALSE(tab->IsFullAccessibilityModeForTesting()); - ASSERT_TRUE(tab->IsTreeOnlyAccessibilityModeForTesting()); + rwh = tab->GetRenderWidgetHostView()->GetRenderWidgetHost(); + ASSERT_NE((content::RenderWidgetHost*)NULL, rwh) + << "Couldn't get RenderWidgetHost"; + ASSERT_FALSE(rwh->IsFullAccessibilityModeForTesting()); + ASSERT_TRUE(rwh->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 a2b93f8..62b038e 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 RenderFrameDeleted( - content::RenderFrameHost* render_frame_host) OVERRIDE { + virtual void RenderViewDeleted( + content::RenderViewHost* render_view_host) OVERRIDE { automation_util::DispatchTreeDestroyedEventToAutomation( - render_frame_host->GetProcess()->GetID(), - render_frame_host->GetRoutingID(), + render_view_host->GetProcess()->GetID(), + render_view_host->GetRoutingID(), browser_context_); } @@ -99,35 +99,35 @@ class AutomationWebContentsObserver DISALLOW_COPY_AND_ASSIGN(AutomationWebContentsObserver); }; -// Helper class that implements an action adapter for a |RenderFrameHost|. -class RenderFrameHostActionAdapter : public AutomationActionAdapter { +// Helper class that implements an action adapter for a |RenderWidgetHost|. +class RenderWidgetHostActionAdapter : public AutomationActionAdapter { public: - explicit RenderFrameHostActionAdapter(content::RenderFrameHost* rfh) - : rfh_(rfh) {} + explicit RenderWidgetHostActionAdapter(content::RenderWidgetHost* rwh) + : rwh_(rwh) {} - virtual ~RenderFrameHostActionAdapter() {} + virtual ~RenderWidgetHostActionAdapter() {} // AutomationActionAdapter implementation. virtual void DoDefault(int32 id) OVERRIDE { - rfh_->AccessibilityDoDefaultAction(id); + rwh_->AccessibilityDoDefaultAction(id); } virtual void Focus(int32 id) OVERRIDE { - rfh_->AccessibilitySetFocus(id); + rwh_->AccessibilitySetFocus(id); } virtual void MakeVisible(int32 id) OVERRIDE { - rfh_->AccessibilityScrollToMakeVisible(id, gfx::Rect()); + rwh_->AccessibilityScrollToMakeVisible(id, gfx::Rect()); } virtual void SetSelection(int32 id, int32 start, int32 end) OVERRIDE { - rfh_->AccessibilitySetTextSelection(id, start, end); + rwh_->AccessibilitySetTextSelection(id, start, end); } private: - content::RenderFrameHost* rfh_; + content::RenderWidgetHost* rwh_; - DISALLOW_COPY_AND_ASSIGN(RenderFrameHostActionAdapter); + DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostActionAdapter); }; ExtensionFunction::ResponseAction @@ -156,8 +156,9 @@ AutomationInternalEnableTabFunction::Run() { if (!contents) return RespondNow(Error("No active tab")); } - content::RenderFrameHost* rfh = contents->GetMainFrame(); - if (!rfh) + content::RenderWidgetHost* rwh = + contents->GetRenderWidgetHostView()->GetRenderWidgetHost(); + if (!rwh) return RespondNow(Error("Could not enable accessibility for active tab")); if (!CanRequestAutomation(GetExtension(), automation_info, contents)) { @@ -165,10 +166,10 @@ AutomationInternalEnableTabFunction::Run() { Error(kCannotRequestAutomationOnPage, contents->GetURL().spec())); } AutomationWebContentsObserver::CreateForWebContents(contents); - contents->EnableTreeOnlyAccessibilityMode(); + rwh->EnableTreeOnlyAccessibilityMode(); return RespondNow( ArgumentList(api::automation_internal::EnableTab::Results::Create( - rfh->GetProcess()->GetID(), rfh->GetRoutingID()))); + rwh->GetProcess()->GetID(), rwh->GetRoutingID()))); } ExtensionFunction::ResponseAction @@ -191,20 +192,21 @@ AutomationInternalPerformActionFunction::Run() { " platform does not support desktop automation")); #endif // defined(OS_CHROMEOS) } - content::RenderFrameHost* rfh = - content::RenderFrameHost::FromID(params->args.process_id, - params->args.routing_id); - if (!rfh) - return RespondNow(Error("Ignoring action on destroyed node")); + content::RenderWidgetHost* rwh = content::RenderWidgetHost::FromID( + params->args.process_id, params->args.routing_id); - const content::WebContents* contents = - content::WebContents::FromRenderFrameHost(rfh); - if (!CanRequestAutomation(GetExtension(), automation_info, contents)) { - return RespondNow( - Error(kCannotRequestAutomationOnPage, contents->GetURL().spec())); + if (!rwh) + 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())); + } } - - RenderFrameHostActionAdapter adapter(rfh); + RenderWidgetHostActionAdapter adapter(rwh); return RouteActionToAdapter(params.get(), &adapter); } diff --git a/content/browser/accessibility/#browser_accessibility_manager.cc# b/content/browser/accessibility/#browser_accessibility_manager.cc# deleted file mode 100644 index b84ff23..0000000 --- a/content/browser/accessibility/#browser_accessibility_manager.cc# +++ /dev/null @@ -1,401 +0,0 @@ -// 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 9e85a9a..5e191bd 100644 --- a/content/browser/accessibility/accessibility_mode_browsertest.cc +++ b/content/browser/accessibility/accessibility_mode_browsertest.cc @@ -5,7 +5,6 @@ #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" @@ -24,20 +23,29 @@ const char kMinimalPageDataURL[] = class AccessibilityModeTest : public ContentBrowserTest { protected: - WebContentsImpl* web_contents() { - return static_cast<WebContentsImpl*>(shell()->web_contents()); + 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()); } void ExpectBrowserAccessibilityManager(bool expect_bam, std::string message = "") { if (expect_bam) { - EXPECT_NE( - (BrowserAccessibilityManager*)NULL, - web_contents()->GetRootBrowserAccessibilityManager()) << message; + EXPECT_NE((BrowserAccessibilityManager*)NULL, + host_view()->GetBrowserAccessibilityManager()) << message; } else { - EXPECT_EQ( - (BrowserAccessibilityManager*)NULL, - web_contents()->GetRootBrowserAccessibilityManager()) << message; + EXPECT_EQ((BrowserAccessibilityManager*)NULL, + host_view()->GetBrowserAccessibilityManager()) << message; } } }; @@ -45,28 +53,28 @@ class AccessibilityModeTest : public ContentBrowserTest { IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, AccessibilityModeOff) { NavigateToURL(shell(), GURL(kMinimalPageDataURL)); - EXPECT_EQ(AccessibilityModeOff, web_contents()->GetAccessibilityMode()); + EXPECT_EQ(AccessibilityModeOff, rwhi()->accessibility_mode()); ExpectBrowserAccessibilityManager(false); } IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, AccessibilityModeComplete) { NavigateToURL(shell(), GURL(kMinimalPageDataURL)); - ASSERT_EQ(AccessibilityModeOff, web_contents()->GetAccessibilityMode()); + ASSERT_EQ(AccessibilityModeOff, rwhi()->accessibility_mode()); AccessibilityNotificationWaiter waiter(shell()); - web_contents()->AddAccessibilityMode(AccessibilityModeComplete); - EXPECT_EQ(AccessibilityModeComplete, web_contents()->GetAccessibilityMode()); + rwhi()->AddAccessibilityMode(AccessibilityModeComplete); + EXPECT_EQ(AccessibilityModeComplete, rwhi()->accessibility_mode()); waiter.WaitForNotification(); ExpectBrowserAccessibilityManager(true); } IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, AccessibilityModeTreeOnly) { NavigateToURL(shell(), GURL(kMinimalPageDataURL)); - ASSERT_EQ(AccessibilityModeOff, web_contents()->GetAccessibilityMode()); + ASSERT_EQ(AccessibilityModeOff, rwhi()->accessibility_mode()); AccessibilityNotificationWaiter waiter(shell()); - web_contents()->AddAccessibilityMode(AccessibilityModeTreeOnly); - EXPECT_EQ(AccessibilityModeTreeOnly, web_contents()->GetAccessibilityMode()); + rwhi()->AddAccessibilityMode(AccessibilityModeTreeOnly); + EXPECT_EQ(AccessibilityModeTreeOnly, rwhi()->accessibility_mode()); waiter.WaitForNotification(); // No BrowserAccessibilityManager expected for AccessibilityModeTreeOnly ExpectBrowserAccessibilityManager(false); @@ -76,16 +84,16 @@ IN_PROC_BROWSER_TEST_F(AccessibilityModeTest, AddingModes) { NavigateToURL(shell(), GURL(kMinimalPageDataURL)); AccessibilityNotificationWaiter waiter(shell()); - web_contents()->AddAccessibilityMode(AccessibilityModeTreeOnly); - EXPECT_EQ(AccessibilityModeTreeOnly, web_contents()->GetAccessibilityMode()); + rwhi()->AddAccessibilityMode(AccessibilityModeTreeOnly); + EXPECT_EQ(AccessibilityModeTreeOnly, rwhi()->accessibility_mode()); waiter.WaitForNotification(); ExpectBrowserAccessibilityManager(false, "Should be no BrowserAccessibilityManager " "for AccessibilityModeTreeOnly"); AccessibilityNotificationWaiter waiter2(shell()); - web_contents()->AddAccessibilityMode(AccessibilityModeComplete); - EXPECT_EQ(AccessibilityModeComplete, web_contents()->GetAccessibilityMode()); + rwhi()->AddAccessibilityMode(AccessibilityModeComplete); + EXPECT_EQ(AccessibilityModeComplete, rwhi()->accessibility_mode()); 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 a8cacb3..7988595 100644 --- a/content/browser/accessibility/accessibility_mode_helper.cc +++ b/content/browser/accessibility/accessibility_mode_helper.cc @@ -2,7 +2,6 @@ // 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 3885ddc..c12c206 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 97ce7fe..cca61a5 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/browser/web_contents/web_contents_impl.h" +#include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" namespace content { @@ -30,10 +30,12 @@ AccessibilityTreeFormatter::AccessibilityTreeFormatter( // static AccessibilityTreeFormatter* AccessibilityTreeFormatter::Create( - WebContents* web_contents) { + RenderViewHost* rvh) { + RenderWidgetHostViewBase* host_view = static_cast<RenderWidgetHostViewBase*>( + WebContents::FromRenderViewHost(rvh)->GetRenderWidgetHostView()); + BrowserAccessibilityManager* manager = - static_cast<WebContentsImpl*>(web_contents)-> - GetRootBrowserAccessibilityManager(); + host_view->GetBrowserAccessibilityManager(); if (!manager) return NULL; diff --git a/content/browser/accessibility/accessibility_tree_formatter.h b/content/browser/accessibility/accessibility_tree_formatter.h index 39c6a4aa..a290886 100644 --- a/content/browser/accessibility/accessibility_tree_formatter.h +++ b/content/browser/accessibility/accessibility_tree_formatter.h @@ -16,7 +16,7 @@ namespace content { -class WebContents; +class RenderViewHost; // 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(WebContents* wc); + static AccessibilityTreeFormatter* Create(RenderViewHost* rvh); // 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 155a1e9..628c545 100644 --- a/content/browser/accessibility/accessibility_ui.cc +++ b/content/browser/accessibility/accessibility_ui.cc @@ -15,7 +15,6 @@ #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" @@ -64,11 +63,11 @@ base::DictionaryValue* BuildTargetDescriptor( } base::DictionaryValue* BuildTargetDescriptor(RenderViewHost* rvh) { - WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( - WebContents::FromRenderViewHost(rvh)); - AccessibilityMode accessibility_mode = web_contents->GetAccessibilityMode(); - + WebContents* web_contents = WebContents::FromRenderViewHost(rvh); std::string title; + RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(rvh); + AccessibilityMode accessibility_mode = rwhi->accessibility_mode(); + GURL url; GURL favicon_url; if (web_contents) { @@ -179,15 +178,14 @@ void AccessibilityUI::ToggleAccessibility(const base::ListValue* args) { RenderViewHost* rvh = RenderViewHost::FromID(process_id, route_id); if (!rvh) return; - 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()); - } + RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(rvh); + if (!rwhi) + return; + AccessibilityMode mode = rwhi->accessibility_mode(); + if ((mode & AccessibilityModeComplete) != AccessibilityModeComplete) + rwhi->AddAccessibilityMode(AccessibilityModeComplete); + else + rwhi->ResetAccessibilityMode(); } void AccessibilityUI::ToggleGlobalAccessibility(const base::ListValue* args) { @@ -222,10 +220,25 @@ void AccessibilityUI::RequestAccessibilityTree(const base::ListValue* args) { } scoped_ptr<base::DictionaryValue> result(BuildTargetDescriptor(rvh)); - WebContents* web_contents = WebContents::FromRenderViewHost(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; + } scoped_ptr<AccessibilityTreeFormatter> formatter( - AccessibilityTreeFormatter::Create(web_contents)); + AccessibilityTreeFormatter::Create(rvh)); 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 1e54cd8..1070f6e 100644 --- a/content/browser/accessibility/android_hit_testing_browsertest.cc +++ b/content/browser/accessibility/android_hit_testing_browsertest.cc @@ -17,7 +17,8 @@ #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/web_contents/web_contents_impl.h" +#include "content/browser/renderer_host/render_view_host_impl.h" +#include "content/browser/renderer_host/render_widget_host_view_base.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_paths.h" #include "content/public/common/content_switches.h" @@ -58,10 +59,10 @@ IN_PROC_BROWSER_TEST_F(AndroidHitTestingBrowserTest, waiter.WaitForNotification(); // Get the BrowserAccessibilityManager. - WebContentsImpl* web_contents = - static_cast<WebContentsImpl*>(shell()->web_contents()); + RenderWidgetHostViewBase* host_view = static_cast<RenderWidgetHostViewBase*>( + shell()->web_contents()->GetRenderWidgetHostView()); BrowserAccessibilityManager* manager = - web_contents->GetRootBrowserAccessibilityManager(); + host_view->GetBrowserAccessibilityManager(); // 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 bdc96d3..2ed21f4 100644 --- a/content/browser/accessibility/browser_accessibility_cocoa.mm +++ b/content/browser/accessibility/browser_accessibility_cocoa.mm @@ -1550,12 +1550,7 @@ NSDictionary* attributeToMethodNameMap = nil; [self delegate]->AccessibilityDoDefaultAction( browserAccessibility_->GetId()); } else if ([action isEqualToString:NSAccessibilityShowMenuAction]) { - 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); + [self delegate]->AccessibilityShowMenu(browserAccessibility_->GetId()); } } @@ -1580,11 +1575,10 @@ NSDictionary* attributeToMethodNameMap = nil; return; if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) { - BrowserAccessibilityManager* manager = browserAccessibility_->manager(); NSNumber* focusedNumber = value; BOOL focused = [focusedNumber intValue]; if (focused) - manager->SetFocus(browserAccessibility_, true); + [self delegate]->AccessibilitySetFocus(browserAccessibility_->GetId()); } 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 4898e4e..ae0bc30 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(const gfx::Point& global_point) = 0; + virtual void AccessibilityShowMenu(int acc_obj_id) = 0; virtual void AccessibilityScrollToMakeVisible( - int acc_obj_id, const gfx::Rect& subfocus) = 0; + int acc_obj_id, gfx::Rect subfocus) = 0; virtual void AccessibilityScrollToPoint( - int acc_obj_id, const gfx::Point& point) = 0; + int acc_obj_id, gfx::Point point) = 0; virtual void AccessibilitySetTextSelection( int acc_obj_id, int start_offset, int end_offset) = 0; virtual bool AccessibilityViewHasFocus() const = 0; @@ -183,9 +183,6 @@ 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 55925e1..ddff85f 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(const gfx::Point& point) OVERRIDE {} + virtual void AccessibilityShowMenu(int acc_obj_id) OVERRIDE {} virtual void AccessibilityScrollToMakeVisible( - int acc_obj_id, const gfx::Rect& subfocus) OVERRIDE {} + int acc_obj_id, gfx::Rect subfocus) OVERRIDE {} virtual void AccessibilityScrollToPoint( - int acc_obj_id, const gfx::Point& point) OVERRIDE {} + 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 { diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc index 05e2fd5..0bb3b60 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(this); + accessible_hwnd_->OnManagerDeleted(); } // static @@ -75,11 +75,7 @@ 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 7fdab1a..f45c31d 100644 --- a/content/browser/accessibility/browser_accessibility_state_impl.cc +++ b/content/browser/accessibility/browser_accessibility_state_impl.cc @@ -9,8 +9,9 @@ #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" @@ -98,10 +99,20 @@ void BrowserAccessibilityStateImpl::ResetAccessibilityModeValue() { void BrowserAccessibilityStateImpl::ResetAccessibilityMode() { ResetAccessibilityModeValue(); - 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()); + // 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(); + } } bool BrowserAccessibilityStateImpl::IsAccessibleBrowser() { @@ -147,7 +158,7 @@ void BrowserAccessibilityStateImpl::AddAccessibilityMode( accessibility_mode_ = content::AddAccessibilityModeTo(accessibility_mode_, mode); - AddOrRemoveFromAllWebContents(mode, true); + AddOrRemoveFromRenderWidgets(mode, true); } void BrowserAccessibilityStateImpl::RemoveAccessibilityMode( @@ -161,19 +172,28 @@ void BrowserAccessibilityStateImpl::RemoveAccessibilityMode( accessibility_mode_ = content::RemoveAccessibilityModeFrom(accessibility_mode_, mode); - AddOrRemoveFromAllWebContents(mode, false); + AddOrRemoveFromRenderWidgets(mode, false); } -void BrowserAccessibilityStateImpl::AddOrRemoveFromAllWebContents( +void BrowserAccessibilityStateImpl::AddOrRemoveFromRenderWidgets( AccessibilityMode mode, bool add) { - std::vector<WebContentsImpl*> web_contents_vector = - WebContentsImpl::GetAllWebContents(); - for (size_t i = 0; i < web_contents_vector.size(); ++i) { + // 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); if (add) - web_contents_vector[i]->AddAccessibilityMode(mode); + rwhi->AddAccessibilityMode(mode); else - web_contents_vector[i]->RemoveAccessibilityMode(mode); + rwhi->RemoveAccessibilityMode(mode); } } diff --git a/content/browser/accessibility/browser_accessibility_state_impl.h b/content/browser/accessibility/browser_accessibility_state_impl.h index 6529d2d..2a1b1c6 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/accessibility_mode_enums.h" +#include "content/common/view_message_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 web contents, including swapped out + // Updates the accessibility mode of all render widgets, including swapped out // ones. |add| specifies whether the mode should be added or removed. - void AddOrRemoveFromAllWebContents(AccessibilityMode mode, bool add); + void AddOrRemoveFromRenderWidgets(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 b97da81..543b06c 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc @@ -19,7 +19,6 @@ #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" @@ -182,10 +181,10 @@ void DumpAccessibilityTreeTest::RunTest( NavigateToURL(shell(), url); waiter.WaitForNotification(); - WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( - shell()->web_contents()); + RenderWidgetHostViewBase* host_view = static_cast<RenderWidgetHostViewBase*>( + shell()->web_contents()->GetRenderWidgetHostView()); AccessibilityTreeFormatter formatter( - web_contents->GetRootBrowserAccessibilityManager()->GetRoot()); + host_view->GetBrowserAccessibilityManager()->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 6f54245..dabf69c9 100644 --- a/content/browser/android/content_view_core_impl.cc +++ b/content/browser/android/content_view_core_impl.cc @@ -17,7 +17,6 @@ #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" @@ -42,6 +41,7 @@ #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,21 +1513,24 @@ bool ContentViewCoreImpl::IsFullscreenRequiredForOrientationLock() const { void ContentViewCoreImpl::SetAccessibilityEnabledInternal(bool enabled) { accessibility_enabled_ = enabled; - BrowserAccessibilityStateImpl* accessibility_state = - BrowserAccessibilityStateImpl::GetInstance(); + RenderWidgetHostViewAndroid* host_view = GetRenderWidgetHostViewAndroid(); + if (!host_view) + return; + RenderWidgetHostImpl* host_impl = RenderWidgetHostImpl::From( + host_view->GetRenderWidgetHost()); + BrowserAccessibilityState* accessibility_state = + BrowserAccessibilityState::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() && web_contents_) - web_contents_->AddAccessibilityMode(AccessibilityModeComplete); + if (accessibility_state->IsAccessibleBrowser() && host_impl) + host_impl->AddAccessibilityMode(AccessibilityModeComplete); } else { accessibility_state->ResetAccessibilityMode(); - if (web_contents_) { - web_contents_->SetAccessibilityMode( - accessibility_state->accessibility_mode()); - } + if (host_impl) + host_impl->ResetAccessibilityMode(); } } diff --git a/content/browser/frame_host/interstitial_page_impl.cc b/content/browser/frame_host/interstitial_page_impl.cc index 1a1ed43..a4ea299 100644 --- a/content/browser/frame_host/interstitial_page_impl.cc +++ b/content/browser/frame_host/interstitial_page_impl.cc @@ -432,13 +432,6 @@ 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(); } @@ -540,11 +533,7 @@ void InterstitialPageImpl::HandleKeyboardEvent( #if defined(OS_WIN) gfx::NativeViewAccessible InterstitialPageImpl::GetParentNativeViewAccessible() { - if (web_contents_) { - WebContentsImpl* wci = static_cast<WebContentsImpl*>(web_contents_); - return wci->GetParentNativeViewAccessible(); - } - return NULL; + return render_widget_host_delegate_->GetParentNativeViewAccessible(); } #endif diff --git a/content/browser/frame_host/interstitial_page_impl.h b/content/browser/frame_host/interstitial_page_impl.h index 7f2d4d7..8068fd3 100644 --- a/content/browser/frame_host/interstitial_page_impl.h +++ b/content/browser/frame_host/interstitial_page_impl.h @@ -119,7 +119,6 @@ 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 f5d07e3..d333185 100644 --- a/content/browser/frame_host/render_frame_host_delegate.cc +++ b/content/browser/frame_host/render_frame_host_delegate.cc @@ -7,7 +7,6 @@ #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 { @@ -44,15 +43,4 @@ 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 6150d46..4d53936 100644 --- a/content/browser/frame_host/render_frame_host_delegate.h +++ b/content/browser/frame_host/render_frame_host_delegate.h @@ -5,19 +5,12 @@ #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 { @@ -27,7 +20,6 @@ class Message; namespace content { class RenderFrameHost; class WebContents; -struct AXEventNotificationDetails; struct ContextMenuParams; // An interface implemented by an object interested in knowing about the state @@ -127,18 +119,6 @@ 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 72dcc54..7e017ee 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc @@ -9,9 +9,6 @@ #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" @@ -25,17 +22,13 @@ #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" @@ -45,7 +38,6 @@ #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; @@ -354,80 +346,11 @@ 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_); } @@ -849,7 +772,6 @@ 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) @@ -857,78 +779,6 @@ 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); } @@ -1096,46 +946,6 @@ 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 0aeb37f..86e05d6 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h @@ -13,19 +13,14 @@ #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; @@ -52,9 +47,7 @@ struct GlobalRequestID; struct Referrer; struct ShowDesktopNotificationHostMsgParams; -class CONTENT_EXPORT RenderFrameHostImpl - : public RenderFrameHost, - public BrowserAccessibilityDelegate { +class CONTENT_EXPORT RenderFrameHostImpl : public RenderFrameHost { public: static RenderFrameHostImpl* FromID(int process_id, int routing_id); @@ -83,23 +76,6 @@ class CONTENT_EXPORT RenderFrameHostImpl // 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, @@ -203,37 +179,6 @@ class CONTENT_EXPORT RenderFrameHostImpl // 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; @@ -304,10 +249,6 @@ class CONTENT_EXPORT RenderFrameHostImpl 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 @@ -369,13 +310,6 @@ class CONTENT_EXPORT RenderFrameHostImpl 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 db8ca80..9c2e1a2 100644 --- a/content/browser/renderer_host/legacy_render_widget_host_win.cc +++ b/content/browser/renderer_host/legacy_render_widget_host_win.cc @@ -70,10 +70,8 @@ HWND LegacyRenderWidgetHostHWND::GetParent() { return ::GetParent(hwnd()); } -void LegacyRenderWidgetHostHWND::OnManagerDeleted( - content::BrowserAccessibilityManagerWin* manager) { - if (manager_ == manager) - manager_ = NULL; +void LegacyRenderWidgetHostHWND::OnManagerDeleted() { + 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 ce08a0e..eb7d832 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(content::BrowserAccessibilityManagerWin* manager); + void OnManagerDeleted(); // 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 4a44123..a9dea8b 100644 --- a/content/browser/renderer_host/render_view_host_delegate.h +++ b/content/browser/renderer_host/render_view_host_delegate.h @@ -51,6 +51,7 @@ class SessionStorageNamespace; class SiteInstance; class WebContents; class WebContentsImpl; +struct AXEventNotificationDetails; struct FileChooserParams; struct GlobalRequestID; struct NativeWebKeyboardEvent; @@ -283,6 +284,10 @@ 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 a5b1d60..4184fde 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc @@ -23,6 +23,7 @@ #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" @@ -40,6 +41,7 @@ #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" @@ -74,6 +76,7 @@ #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" @@ -305,6 +308,7 @@ 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)); @@ -973,6 +977,9 @@ 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( @@ -1430,6 +1437,11 @@ 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)); } @@ -1495,6 +1507,67 @@ 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 e2a9764..204d31c 100644 --- a/content/browser/renderer_host/render_view_host_impl.h +++ b/content/browser/renderer_host/render_view_host_impl.h @@ -25,10 +25,13 @@ #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; @@ -405,6 +408,30 @@ 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_; } @@ -485,6 +512,10 @@ 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); @@ -577,6 +608,12 @@ 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 a3a474f..23687d0 100644 --- a/content/browser/renderer_host/render_widget_host_delegate.cc +++ b/content/browser/renderer_host/render_widget_host_delegate.cc @@ -2,7 +2,6 @@ // 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 { @@ -28,19 +27,9 @@ 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 0efed29..91ce943 100644 --- a/content/browser/renderer_host/render_widget_host_delegate.h +++ b/content/browser/renderer_host/render_widget_host_delegate.h @@ -16,7 +16,6 @@ class WebGestureEvent; namespace content { -class BrowserAccessibilityManager; class RenderWidgetHostImpl; struct NativeWebKeyboardEvent; @@ -63,15 +62,8 @@ 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 8ca48bc..24c6a21 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc @@ -45,6 +45,7 @@ #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" @@ -171,6 +172,7 @@ 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), @@ -218,6 +220,9 @@ 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())); @@ -841,6 +846,22 @@ 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()); } @@ -1885,6 +1906,92 @@ 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)); @@ -2234,24 +2341,6 @@ 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 a26f609..6f884b6 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h @@ -24,6 +24,7 @@ #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" @@ -77,7 +78,6 @@ class WebLayer; #endif namespace content { -class BrowserAccessibilityManager; class InputRouter; class MockRenderWidgetHost; class RenderWidgetHostDelegate; @@ -95,7 +95,8 @@ class CONTENT_EXPORT RenderWidgetHostImpl public InputRouterClient, public InputAckHandler, public TouchEmulatorClient, - public IPC::Listener { + public IPC::Listener, + public BrowserAccessibilityDelegate { public: // routing_id can be MSG_ROUTING_NONE, in which case the next available // routing id is taken from the RenderProcessHost. @@ -140,6 +141,10 @@ 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( @@ -169,6 +174,23 @@ 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( @@ -373,6 +395,30 @@ 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); @@ -474,17 +520,6 @@ 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; @@ -674,6 +709,9 @@ 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_; @@ -745,6 +783,8 @@ 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 a56a1f1..cf5cf24 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc @@ -1150,16 +1150,20 @@ void RenderWidgetHostViewAndroid::OnSetNeedsFlushInput() { content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); } -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); +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_)); + } } bool RenderWidgetHostViewAndroid::LockMouse() { @@ -1264,14 +1268,12 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( content_view_core_ = content_view_core; - BrowserAccessibilityManager* manager = NULL; - if (host_) - manager = host_->GetRootBrowserAccessibilityManager(); - if (manager) { + if (GetBrowserAccessibilityManager()) { base::android::ScopedJavaLocalRef<jobject> obj; if (content_view_core_) obj = content_view_core_->GetJavaObject(); - manager->ToBrowserAccessibilityManagerAndroid()->SetContentViewCore(obj); + GetBrowserAccessibilityManager()->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 6d05761..6bbd636 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.h +++ b/content/browser/renderer_host/render_widget_host_view_android.h @@ -148,8 +148,7 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid virtual void OnSetNeedsFlushInput() OVERRIDE; virtual void GestureEventAck(const blink::WebGestureEvent& event, InputEventAckState ack_result) OVERRIDE; - virtual BrowserAccessibilityManager* CreateBrowserAccessibilityManager( - BrowserAccessibilityDelegate* delegate) OVERRIDE; + virtual void CreateBrowserAccessibilityManagerIfNeeded() 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 ad9fffb..205f3fc 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc @@ -651,8 +651,9 @@ gfx::NativeViewAccessible RenderWidgetHostViewAura::GetNativeViewAccessible() { if (!host) return static_cast<gfx::NativeViewAccessible>(NULL); HWND hwnd = host->GetAcceleratedWidget(); - BrowserAccessibilityManager* manager = - host_->GetOrCreateRootBrowserAccessibilityManager(); + + CreateBrowserAccessibilityManagerIfNeeded(); + BrowserAccessibilityManager* manager = GetBrowserAccessibilityManager(); if (manager) return manager->GetRoot()->ToBrowserAccessibilityWin(); #endif @@ -1042,10 +1043,8 @@ void RenderWidgetHostViewAura::OnSwapCompositorFrame( #if defined(OS_WIN) void RenderWidgetHostViewAura::SetParentNativeViewAccessible( gfx::NativeViewAccessible accessible_parent) { - BrowserAccessibilityManager* manager = - host_->GetRootBrowserAccessibilityManager(); - if (manager) { - manager->ToBrowserAccessibilityManagerWin() + if (GetBrowserAccessibilityManager()) { + GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerWin() ->set_parent_iaccessible(accessible_parent); } } @@ -1192,21 +1191,22 @@ InputEventAckState RenderWidgetHostViewAura::FilterInputEvent( : INPUT_EVENT_ACK_STATE_NOT_CONSUMED; } -BrowserAccessibilityManager* -RenderWidgetHostViewAura::CreateBrowserAccessibilityManager( - BrowserAccessibilityDelegate* delegate) { - BrowserAccessibilityManager* manager = NULL; +void RenderWidgetHostViewAura::CreateBrowserAccessibilityManagerIfNeeded() { #if defined(OS_WIN) - gfx::NativeViewAccessible accessible_parent = - host_->GetParentNativeViewAccessible(); - manager = new BrowserAccessibilityManagerWin( - legacy_render_widget_host_HWND_, accessible_parent, - BrowserAccessibilityManagerWin::GetEmptyDocument(), delegate); + if (!GetBrowserAccessibilityManager()) { + gfx::NativeViewAccessible accessible_parent = + host_->GetParentNativeViewAccessible(); + SetBrowserAccessibilityManager(new BrowserAccessibilityManagerWin( + legacy_render_widget_host_HWND_, accessible_parent, + BrowserAccessibilityManagerWin::GetEmptyDocument(), host_)); + } #else - manager = BrowserAccessibilityManager::Create( - BrowserAccessibilityManager::GetEmptyDocument(), delegate); + if (!GetBrowserAccessibilityManager()) { + SetBrowserAccessibilityManager( + BrowserAccessibilityManager::Create( + BrowserAccessibilityManager::GetEmptyDocument(), host_)); + } #endif - return manager; } gfx::GLSurfaceHandle RenderWidgetHostViewAura::GetCompositingSurface() { @@ -2048,8 +2048,7 @@ void RenderWidgetHostViewAura::OnWindowFocused(aura::Window* gained_focus, host_->SetInputMethodActive(false); } - BrowserAccessibilityManager* manager = - host_->GetRootBrowserAccessibilityManager(); + BrowserAccessibilityManager* manager = GetBrowserAccessibilityManager(); if (manager) manager->OnWindowFocused(); } else if (window_ == lost_focus) { @@ -2065,8 +2064,7 @@ void RenderWidgetHostViewAura::OnWindowFocused(aura::Window* gained_focus, if (overscroll_controller_) overscroll_controller_->Cancel(); - BrowserAccessibilityManager* manager = - host_->GetRootBrowserAccessibilityManager(); + BrowserAccessibilityManager* manager = GetBrowserAccessibilityManager(); if (manager) manager->OnWindowBlurred(); @@ -2312,7 +2310,7 @@ void RenderWidgetHostViewAura::InternalSetBounds(const gfx::Rect& rect) { BrowserAccessibilityManagerWin* manager = static_cast<BrowserAccessibilityManagerWin*>( - host_->GetRootBrowserAccessibilityManager()); + GetBrowserAccessibilityManager()); 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 e8c19d7..05f5493 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.h +++ b/content/browser/renderer_host/render_widget_host_view_aura.h @@ -218,8 +218,7 @@ class CONTENT_EXPORT RenderWidgetHostViewAura virtual InputEventAckState FilterInputEvent( const blink::WebInputEvent& input_event) OVERRIDE; virtual gfx::GLSurfaceHandle GetCompositingSurface() OVERRIDE; - virtual BrowserAccessibilityManager* CreateBrowserAccessibilityManager( - BrowserAccessibilityDelegate* delegate) OVERRIDE; + virtual void CreateBrowserAccessibilityManagerIfNeeded() 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 cfc1a40..c9d3ebb 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.cc +++ b/content/browser/renderer_host/render_widget_host_view_base.cc @@ -484,13 +484,22 @@ blink::WebPopupType RenderWidgetHostViewBase::GetPopupType() { } BrowserAccessibilityManager* -RenderWidgetHostViewBase::CreateBrowserAccessibilityManager( - BrowserAccessibilityDelegate* delegate) { - NOTREACHED(); - return NULL; + 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) { } -void RenderWidgetHostViewBase::AccessibilityShowMenu(const gfx::Point& point) { +void RenderWidgetHostViewBase::AccessibilityShowMenu(int acc_obj_id) { } 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 182976f..8f84a99 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.h +++ b/content/browser/renderer_host/render_widget_host_view_base.h @@ -50,7 +50,6 @@ struct WebScreenInfo; } namespace content { -class BrowserAccessibilityDelegate; class BrowserAccessibilityManager; class SyntheticGesture; class SyntheticGestureTarget; @@ -89,6 +88,11 @@ 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(); @@ -147,11 +151,13 @@ 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. - virtual BrowserAccessibilityManager* CreateBrowserAccessibilityManager( - BrowserAccessibilityDelegate* delegate); + // 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(); - virtual void AccessibilityShowMenu(const gfx::Point& point); + virtual void OnAccessibilitySetFocus(int acc_obj_id); + virtual void AccessibilityShowMenu(int acc_obj_id); virtual gfx::Point AccessibilityOriginInScreen(const gfx::Rect& bounds); virtual SkColorType PreferredReadbackFormat(); @@ -420,6 +426,9 @@ 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 0c1e553..6d3987a 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 BrowserAccessibilityManager* CreateBrowserAccessibilityManager( - BrowserAccessibilityDelegate* delegate) OVERRIDE; + virtual void CreateBrowserAccessibilityManagerIfNeeded() OVERRIDE; virtual gfx::Point AccessibilityOriginInScreen(const gfx::Rect& bounds) OVERRIDE; - virtual void AccessibilityShowMenu(const gfx::Point& point) OVERRIDE; + virtual void OnAccessibilitySetFocus(int acc_obj_id) OVERRIDE; + virtual void AccessibilityShowMenu(int acc_obj_id) 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 17c73d5..8225582 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm @@ -2065,13 +2065,14 @@ void RenderWidgetHostViewMac::SetBackgroundOpaque(bool opaque) { render_widget_host_->SetBackgroundOpaque(opaque); } -BrowserAccessibilityManager* - RenderWidgetHostViewMac::CreateBrowserAccessibilityManager( - BrowserAccessibilityDelegate* delegate) { - return new BrowserAccessibilityManagerMac( - cocoa_view_, - BrowserAccessibilityManagerMac::GetEmptyDocument(), - delegate); +void RenderWidgetHostViewMac::CreateBrowserAccessibilityManagerIfNeeded() { + if (!GetBrowserAccessibilityManager()) { + SetBrowserAccessibilityManager( + new BrowserAccessibilityManagerMac( + cocoa_view_, + BrowserAccessibilityManagerMac::GetEmptyDocument(), + render_widget_host_)); + } } gfx::Point RenderWidgetHostViewMac::AccessibilityOriginInScreen( @@ -2086,9 +2087,33 @@ gfx::Point RenderWidgetHostViewMac::AccessibilityOriginInScreen( return gfx::Point(originInScreen.x, originInScreen.y); } -void RenderWidgetHostViewMac::AccessibilityShowMenu(const gfx::Point& point) { - NSPoint location = NSMakePoint(point.x(), point.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()); location = [[cocoa_view_ window] convertScreenToBase:location]; + location.x += size.width/2; + location.y += size.height/2; + NSEvent* fakeRightClick = [NSEvent mouseEventWithType:NSRightMouseDown location:location @@ -2103,6 +2128,8 @@ void RenderWidgetHostViewMac::AccessibilityShowMenu(const gfx::Point& point) { [cocoa_view_ mouseEvent:fakeRightClick]; } + + void RenderWidgetHostViewMac::SetTextInputActive(bool active) { if (active) { if (text_input_type_ == ui::TEXT_INPUT_TYPE_PASSWORD) @@ -3150,7 +3177,7 @@ void RenderWidgetHostViewMac::AcceleratedLayerDidDrawFrame(bool succeeded) { - (id)accessibilityAttributeValue:(NSString *)attribute { BrowserAccessibilityManager* manager = - renderWidgetHostView_->GetHost()->GetRootBrowserAccessibilityManager(); + renderWidgetHostView_->GetBrowserAccessibilityManager(); // Contents specifies document view of RenderWidgetHostViewCocoa provided by // BrowserAccessibilityManager. Children includes all subviews in addition to @@ -3175,28 +3202,25 @@ void RenderWidgetHostViewMac::AcceleratedLayerDidDrawFrame(bool succeeded) { } - (id)accessibilityHitTest:(NSPoint)point { - BrowserAccessibilityManager* manager = - renderWidgetHostView_->GetHost()->GetRootBrowserAccessibilityManager(); - if (!manager) + if (!renderWidgetHostView_->GetBrowserAccessibilityManager()) return self; NSPoint pointInWindow = [[self window] convertScreenToBase:point]; NSPoint localPoint = [self convertPoint:pointInWindow fromView:nil]; localPoint.y = NSHeight([self bounds]) - localPoint.y; - BrowserAccessibilityCocoa* root = - manager->GetRoot()->ToBrowserAccessibilityCocoa(); + BrowserAccessibilityCocoa* root = renderWidgetHostView_-> + GetBrowserAccessibilityManager()-> + GetRoot()->ToBrowserAccessibilityCocoa(); id obj = [root accessibilityHitTest:localPoint]; return obj; } - (BOOL)accessibilityIsIgnored { - BrowserAccessibilityManager* manager = - renderWidgetHostView_->GetHost()->GetRootBrowserAccessibilityManager(); - return !manager; + return !renderWidgetHostView_->GetBrowserAccessibilityManager(); } - (NSUInteger)accessibilityGetIndexOf:(id)child { BrowserAccessibilityManager* manager = - renderWidgetHostView_->GetHost()->GetRootBrowserAccessibilityManager(); + renderWidgetHostView_->GetBrowserAccessibilityManager(); // Only child is root. if (manager && manager->GetRoot()->ToBrowserAccessibilityCocoa() == child) { @@ -3208,7 +3232,7 @@ void RenderWidgetHostViewMac::AcceleratedLayerDidDrawFrame(bool succeeded) { - (id)accessibilityFocusedUIElement { BrowserAccessibilityManager* manager = - renderWidgetHostView_->GetHost()->GetRootBrowserAccessibilityManager(); + renderWidgetHostView_->GetBrowserAccessibilityManager(); 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 5c9cd72..0471f0b 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc @@ -18,8 +18,6 @@ #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" @@ -74,7 +72,6 @@ #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" @@ -216,16 +213,6 @@ 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()); @@ -241,11 +228,6 @@ 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) { @@ -374,9 +356,7 @@ WebContentsImpl::WebContentsImpl( fullscreen_widget_had_focus_at_shutdown_(false), is_subframe_(false), touch_emulation_enabled_(false), - last_dialog_suppressed_(false), - accessibility_mode_( - BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode()) { + last_dialog_suppressed_(false) { for (size_t i = 0; i < g_created_callbacks.Get().size(); i++) g_created_callbacks.Get().at(i).Run(this); frame_tree_.SetFrameRemoveListener( @@ -475,30 +455,6 @@ 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(); } @@ -724,29 +680,6 @@ 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()-> @@ -795,25 +728,12 @@ 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; - RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); - if (rfh) - rfh->SetParentNativeViewAccessible(accessible_parent); + if (GetRenderViewHost()) + GetRenderViewHostImpl()->SetParentNativeViewAccessible(accessible_parent); } #endif @@ -1374,6 +1294,12 @@ bool WebContentsImpl::HandleGestureEvent( return false; } +#if defined(OS_WIN) +gfx::NativeViewAccessible WebContentsImpl::GetParentNativeViewAccessible() { + return accessible_parent_; +} +#endif + void WebContentsImpl::HandleMouseDown() { if (delegate_) delegate_->HandleMouseDown(); @@ -1769,10 +1695,6 @@ FrameTree* WebContentsImpl::GetFrameTree() { return &frame_tree_; } -AccessibilityMode WebContentsImpl::GetAccessibilityMode() const { - return accessibility_mode_; -} - void WebContentsImpl::AccessibilityEventReceived( const std::vector<AXEventNotificationDetails>& details) { FOR_EACH_OBSERVER( @@ -1810,18 +1732,6 @@ 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; @@ -3295,7 +3205,6 @@ 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) { @@ -3418,12 +3327,6 @@ 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_; } @@ -3482,7 +3385,6 @@ 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 91b2d4b..b001642 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h @@ -23,7 +23,6 @@ #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" @@ -96,8 +95,6 @@ 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_; } @@ -174,19 +171,6 @@ 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; @@ -212,9 +196,6 @@ 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; @@ -374,12 +355,6 @@ 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; @@ -468,6 +443,8 @@ 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 --------------------------------------------------------- @@ -532,10 +509,9 @@ class CONTENT_EXPORT WebContentsImpl const blink::WebGestureEvent& event) OVERRIDE; virtual void DidSendScreenRects(RenderWidgetHostImpl* rwh) OVERRIDE; virtual void OnTouchEmulationEnabled(bool enabled) OVERRIDE; - virtual BrowserAccessibilityManager* GetRootBrowserAccessibilityManager() - OVERRIDE; - virtual BrowserAccessibilityManager* - GetOrCreateRootBrowserAccessibilityManager() OVERRIDE; +#if defined(OS_WIN) + virtual gfx::NativeViewAccessible GetParentNativeViewAccessible() OVERRIDE; +#endif // RenderFrameHostManager::Delegate ------------------------------------------ @@ -1178,10 +1154,6 @@ 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 deleted file mode 100644 index ee51d6b..0000000 --- a/content/common/accessibility_mode_enums.h +++ /dev/null @@ -1,38 +0,0 @@ -// 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 c459896..d2f9d8a 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 "content/common/accessibility_mode_enums.h" +#include "ipc/ipc_message_macros.h" struct FrameMsg_Navigate_Type { public: diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h index 6f7bb5e..66ab428 100644 --- a/content/common/frame_messages.h +++ b/content/common/frame_messages.h @@ -26,9 +26,6 @@ #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) @@ -395,10 +392,6 @@ 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 4d3d193..37179e8 100644 --- a/content/common/view_message_enums.h +++ b/content/common/view_message_enums.h @@ -22,4 +22,34 @@ 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 e55e51e..f4a765a 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h @@ -68,6 +68,7 @@ #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) @@ -478,6 +479,9 @@ 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) @@ -865,6 +869,10 @@ 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 dde20fe..31f4d8d 100644 --- a/content/public/browser/render_frame_host.h +++ b/content/public/browser/render_frame_host.h @@ -12,7 +12,6 @@ #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 { @@ -73,14 +72,6 @@ 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 a87e3fa..049ee70 100644 --- a/content/public/browser/render_widget_host.h +++ b/content/public/browser/render_widget_host.h @@ -189,6 +189,42 @@ 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 b163306..b39553e 100644 --- a/content/public/browser/web_contents.h +++ b/content/public/browser/web_contents.h @@ -222,18 +222,6 @@ 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 f4e44ca..0a19197 100644 --- a/content/public/test/render_view_test.cc +++ b/content/public/test/render_view_test.cc @@ -198,7 +198,8 @@ void RenderViewTest::SetUp() { false, // hidden false, // never_visible 1, // next_page_id - blink::WebScreenInfo()); + blink::WebScreenInfo(), + AccessibilityModeOff); 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 76944de3..4b675a3 100644 --- a/content/renderer/accessibility/blink_ax_tree_source.cc +++ b/content/renderer/accessibility/blink_ax_tree_source.cc @@ -10,7 +10,6 @@ #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" @@ -33,7 +32,6 @@ using blink::WebAXObject; using blink::WebDocument; using blink::WebDocumentType; using blink::WebElement; -using blink::WebFrame; using blink::WebLocalFrame; using blink::WebNode; using blink::WebVector; @@ -95,8 +93,8 @@ void AddIntListAttributeFromWebObjects(ui::AXIntListAttribute attr, } // Anonymous namespace -BlinkAXTreeSource::BlinkAXTreeSource(RenderFrameImpl* render_frame) - : render_frame_(render_frame) { +BlinkAXTreeSource::BlinkAXTreeSource(RenderViewImpl* render_view) + : render_view_(render_view) { } BlinkAXTreeSource::~BlinkAXTreeSource() { @@ -552,11 +550,13 @@ void BlinkAXTreeSource::SerializeNode(blink::WebAXObject src, } blink::WebDocument BlinkAXTreeSource::GetMainDocument() const { - WebView* view = render_frame_->render_view()->GetWebView(); - WebFrame* main_frame = view ? view->mainFrame() : NULL; + WebView* view = render_view_->GetWebView(); + WebLocalFrame* main_frame = + view ? view->mainFrame()->toWebLocalFrame() : 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 007df07..52b9082 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 RenderFrameImpl; +class RenderViewImpl; class BlinkAXTreeSource : public ui::AXTreeSource<blink::WebAXObject> { public: - BlinkAXTreeSource(RenderFrameImpl* render_frame); + BlinkAXTreeSource(RenderViewImpl* render_view); 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: - RenderFrameImpl* render_frame_; + RenderViewImpl* render_view_; }; } // namespace content diff --git a/content/renderer/accessibility/renderer_accessibility.cc b/content/renderer/accessibility/renderer_accessibility.cc index 1bf4022..9a575a1 100644 --- a/content/renderer/accessibility/renderer_accessibility.cc +++ b/content/renderer/accessibility/renderer_accessibility.cc @@ -4,7 +4,6 @@ #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" @@ -17,16 +16,16 @@ using blink::WebView; namespace content { RendererAccessibility::RendererAccessibility( - RenderFrameImpl* render_frame) - : RenderFrameObserver(render_frame), - render_frame_(render_frame) { + RenderViewImpl* render_view) + : RenderViewObserver(render_view), + render_view_(render_view) { } RendererAccessibility::~RendererAccessibility() { } WebDocument RendererAccessibility::GetMainDocument() { - WebView* view = render_frame_->render_view()->GetWebView(); + WebView* view = 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 b10d21f..9ddb6ed 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_frame_observer.h" +#include "content/public/renderer/render_view_observer.h" #include "third_party/WebKit/public/web/WebAXObject.h" namespace blink { @@ -14,7 +14,7 @@ class WebDocument; }; namespace content { -class RenderFrameImpl; +class RenderViewImpl; 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 RenderFrameImpl. +// An instance of this class (or rather, a subclass) belongs to RenderViewImpl. // Accessibility is initialized based on the AccessibilityMode of -// RenderFrameImpl; it lazily starts as Off or EditableTextOnly depending on +// RenderViewImpl; 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,15 +58,14 @@ 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 RenderFrameObserver { +class CONTENT_EXPORT RendererAccessibility : public RenderViewObserver { public: - explicit RendererAccessibility(RenderFrameImpl* render_frame); + explicit RendererAccessibility(RenderViewImpl* render_view); 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. @@ -77,8 +76,8 @@ class CONTENT_EXPORT RendererAccessibility : public RenderFrameObserver { // no view or frame. blink::WebDocument GetMainDocument(); - // The RenderFrameImpl that owns us. - RenderFrameImpl* render_frame_; + // The RenderViewImpl that owns us. + RenderViewImpl* render_view_; DISALLOW_COPY_AND_ASSIGN(RendererAccessibility); }; diff --git a/content/renderer/accessibility/renderer_accessibility_browsertest.cc b/content/renderer/accessibility/renderer_accessibility_browsertest.cc index 6bb5c79..2ea3b39 100644 --- a/content/renderer/accessibility/renderer_accessibility_browsertest.cc +++ b/content/renderer/accessibility/renderer_accessibility_browsertest.cc @@ -8,7 +8,6 @@ #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" @@ -24,8 +23,8 @@ namespace content { class TestRendererAccessibilityComplete : public RendererAccessibilityComplete { public: - explicit TestRendererAccessibilityComplete(RenderFrameImpl* render_frame) - : RendererAccessibilityComplete(render_frame) { + explicit TestRendererAccessibilityComplete(RenderViewImpl* render_view) + : RendererAccessibilityComplete(render_view) { } void SendPendingAccessibilityEvents() { @@ -51,7 +50,7 @@ class RendererAccessibilityTest : public RenderViewTest { } void SetMode(AccessibilityMode mode) { - frame()->OnSetAccessibilityMode(mode); + view()->OnSetAccessibilityMode(mode); } void GetLastAccEvent( @@ -241,7 +240,7 @@ TEST_F(RendererAccessibilityTest, SendFullAccessibilityTreeOnReload) { // Creating a RendererAccessibilityComplete should sent the tree // to the browser. scoped_ptr<TestRendererAccessibilityComplete> accessibility( - new TestRendererAccessibilityComplete(frame())); + new TestRendererAccessibilityComplete(view())); accessibility->SendPendingAccessibilityEvents(); EXPECT_EQ(4, CountAccessibilityNodesSentToBrowser()); @@ -311,7 +310,7 @@ TEST_F(RendererAccessibilityTest, // Creating a RendererAccessibilityComplete should send the tree // to the browser. scoped_ptr<TestRendererAccessibilityComplete> accessibility( - new TestRendererAccessibilityComplete(frame())); + new TestRendererAccessibilityComplete(view())); accessibility->SendPendingAccessibilityEvents(); EXPECT_EQ(5, CountAccessibilityNodesSentToBrowser()); @@ -365,7 +364,7 @@ TEST_F(RendererAccessibilityTest, HideAccessibilityObject) { LoadHTML(html.c_str()); scoped_ptr<TestRendererAccessibilityComplete> accessibility( - new TestRendererAccessibilityComplete(frame())); + new TestRendererAccessibilityComplete(view())); accessibility->SendPendingAccessibilityEvents(); EXPECT_EQ(4, CountAccessibilityNodesSentToBrowser()); @@ -417,7 +416,7 @@ TEST_F(RendererAccessibilityTest, ShowAccessibilityObject) { LoadHTML(html.c_str()); scoped_ptr<TestRendererAccessibilityComplete> accessibility( - new TestRendererAccessibilityComplete(frame())); + new TestRendererAccessibilityComplete(view())); accessibility->SendPendingAccessibilityEvents(); EXPECT_EQ(3, CountAccessibilityNodesSentToBrowser()); @@ -461,7 +460,7 @@ TEST_F(RendererAccessibilityTest, DetachAccessibilityObject) { LoadHTML(html.c_str()); scoped_ptr<TestRendererAccessibilityComplete> accessibility( - new TestRendererAccessibilityComplete(frame())); + new TestRendererAccessibilityComplete(view())); accessibility->SendPendingAccessibilityEvents(); EXPECT_EQ(7, CountAccessibilityNodesSentToBrowser()); @@ -529,7 +528,7 @@ TEST_F(RendererAccessibilityTest, EventOnObjectNotInTree) { LoadHTML(html.c_str()); scoped_ptr<TestRendererAccessibilityComplete> accessibility( - new TestRendererAccessibilityComplete(frame())); + new TestRendererAccessibilityComplete(view())); 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 fd64718..2e72dde 100644 --- a/content/renderer/accessibility/renderer_accessibility_complete.cc +++ b/content/renderer/accessibility/renderer_accessibility_complete.cc @@ -9,7 +9,6 @@ #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" @@ -29,10 +28,10 @@ using blink::WebView; namespace content { RendererAccessibilityComplete::RendererAccessibilityComplete( - RenderFrameImpl* render_frame) - : RendererAccessibility(render_frame), + RenderViewImpl* render_view) + : RendererAccessibility(render_view), weak_factory_(this), - tree_source_(render_frame), + tree_source_(render_view), serializer_(&tree_source_), last_scroll_offset_(gfx::Size()), ack_pending_(false) { @@ -92,6 +91,13 @@ 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)); @@ -156,7 +162,7 @@ void RendererAccessibilityComplete::SendPendingAccessibilityEvents() { if (pending_events_.empty()) return; - if (render_frame_->is_swapped_out()) + if (render_view_->is_swapped_out()) return; ack_pending_ = true; @@ -381,7 +387,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_frame_->GetRenderView()->GetWebView()->clearFocusedElement(); + render_view()->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 cb34c15..507b734 100644 --- a/content/renderer/accessibility/renderer_accessibility_complete.h +++ b/content/renderer/accessibility/renderer_accessibility_complete.h @@ -37,17 +37,18 @@ class RenderViewImpl; class CONTENT_EXPORT RendererAccessibilityComplete : public RendererAccessibility { public: - explicit RendererAccessibilityComplete(RenderFrameImpl* render_frame); + explicit RendererAccessibilityComplete(RenderViewImpl* render_view); virtual ~RendererAccessibilityComplete(); - // RenderFrameObserver implementation. + // RenderView::Observer 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 4391412..bda3e8f 100644 --- a/content/renderer/accessibility/renderer_accessibility_focus_only.cc +++ b/content/renderer/accessibility/renderer_accessibility_focus_only.cc @@ -4,7 +4,6 @@ #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" @@ -27,8 +26,8 @@ const int kInitialId = 2; namespace content { RendererAccessibilityFocusOnly::RendererAccessibilityFocusOnly( - RenderFrameImpl* render_frame) - : RendererAccessibility(render_frame), + RenderViewImpl* render_view) + : RendererAccessibility(render_view), next_id_(kInitialId) { } @@ -49,12 +48,17 @@ void RendererAccessibilityFocusOnly::FocusedNodeChanged(const WebNode& node) { HandleFocusedNodeChanged(node, true); } -void RendererAccessibilityFocusOnly::DidFinishLoad() { +void RendererAccessibilityFocusOnly::DidFinishLoad( + blink::WebLocalFrame* frame) { + WebView* view = render_view()->GetWebView(); + if (view->focusedFrame() != frame) + return; + + WebDocument document = frame->document(); // 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); } @@ -70,13 +74,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_frame_->render_view()->HasIMETextFocus()) { + if (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_frame_->render_view()->IsEditableNode(node); + node_has_focus && render_view_->IsEditableNode(node); } std::vector<AccessibilityHostMsg_EventParams> events; @@ -105,7 +109,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_frame_->render_view()->size()); + root.location = gfx::Rect(render_view_->size()); root.child_ids.push_back(next_id_); child.id = next_id_; @@ -114,7 +118,7 @@ void RendererAccessibilityFocusOnly::HandleFocusedNodeChanged( if (!node.isNull() && node.isElementNode()) { child.location = gfx::Rect( const_cast<WebNode&>(node).to<WebElement>().boundsInViewportSpace()); - } else if (render_frame_->render_view()->HasIMETextFocus()) { + } else if (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 5306808..806cd4b 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 accessibility implementation that only handles whatever +// This is an accsessibility 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(RenderFrameImpl* render_frame); + explicit RendererAccessibilityFocusOnly(RenderViewImpl* render_view); virtual ~RendererAccessibilityFocusOnly(); // RendererAccessibility implementation. virtual void HandleWebAccessibilityEvent( const blink::WebAXObject& obj, blink::WebAXEvent event) OVERRIDE; virtual RendererAccessibilityType GetType() OVERRIDE; - virtual void FocusedNodeChanged(const blink::WebNode& node) OVERRIDE; - // RenderFrameObserver implementation. - virtual void DidFinishLoad() OVERRIDE; + // RenderView::Observer implementation. + virtual void FocusedNodeChanged(const blink::WebNode& node) OVERRIDE; + virtual void DidFinishLoad(blink::WebLocalFrame* frame) 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 a8baba2..85308be 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc @@ -47,8 +47,6 @@ #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" @@ -413,8 +411,6 @@ 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)); @@ -505,8 +501,8 @@ void RenderFrameImpl::PepperTextInputTypeChanged( GetRenderWidget()->UpdateTextInputState( RenderWidget::NO_SHOW_IME, RenderWidget::FROM_NON_IME); - if (renderer_accessibility()) - renderer_accessibility()->FocusedNodeChanged(WebNode()); + if (render_view_->renderer_accessibility()) + render_view_->renderer_accessibility()->FocusedNodeChanged(WebNode()); } void RenderFrameImpl::PepperCaretPositionChanged( @@ -727,8 +723,6 @@ 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 @@ -1184,25 +1178,6 @@ 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); } @@ -3160,17 +3135,6 @@ 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 3cd7082..e9e8270 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h @@ -14,7 +14,6 @@ #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" @@ -23,7 +22,6 @@ #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" @@ -67,7 +65,6 @@ class MidiDispatcher; class NotificationProvider; class PepperPluginInstanceImpl; class PushMessagingDispatcher; -class RendererAccessibility; class RendererCdmManager; class RendererMediaPlayerManager; class RendererPpapiHost; @@ -151,22 +148,6 @@ 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); @@ -438,7 +419,6 @@ class CONTENT_EXPORT RenderFrameImpl private: friend class RenderFrameObserver; - friend class RendererAccessibilityTest; FRIEND_TEST_ALL_PREFIXES(RendererAccessibilityTest, AccessibilityMessagesQueueWhileSwappedOut); FRIEND_TEST_ALL_PREFIXES(RenderFrameImplTest, @@ -449,8 +429,6 @@ 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; @@ -498,7 +476,6 @@ 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 @@ -687,13 +664,6 @@ 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 acafe55..952c7d7 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc @@ -1349,7 +1349,8 @@ void RenderThreadImpl::OnCreateNewView(const ViewMsg_New_Params& params) { params.hidden, params.never_visible, params.next_page_id, - params.screen_info); + params.screen_info, + params.accessibility_mode); } GpuChannelHost* RenderThreadImpl::EstablishGpuChannelSync( diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index c3b4489..83e282f 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, frame()->accessibility_mode()); - ASSERT_EQ((RendererAccessibility*) NULL, frame()->renderer_accessibility()); + ASSERT_EQ(AccessibilityModeOff, view()->accessibility_mode()); + ASSERT_EQ((RendererAccessibility*) NULL, view()->renderer_accessibility()); - frame()->OnSetAccessibilityMode(AccessibilityModeTreeOnly); - ASSERT_EQ(AccessibilityModeTreeOnly, frame()->accessibility_mode()); - ASSERT_NE((RendererAccessibility*) NULL, frame()->renderer_accessibility()); + view()->OnSetAccessibilityMode(AccessibilityModeTreeOnly); + ASSERT_EQ(AccessibilityModeTreeOnly, view()->accessibility_mode()); + ASSERT_NE((RendererAccessibility*) NULL, view()->renderer_accessibility()); ASSERT_EQ(RendererAccessibilityTypeComplete, - frame()->renderer_accessibility()->GetType()); + view()->renderer_accessibility()->GetType()); - frame()->OnSetAccessibilityMode(AccessibilityModeOff); - ASSERT_EQ(AccessibilityModeOff, frame()->accessibility_mode()); - ASSERT_EQ((RendererAccessibility*) NULL, frame()->renderer_accessibility()); + view()->OnSetAccessibilityMode(AccessibilityModeOff); + ASSERT_EQ(AccessibilityModeOff, view()->accessibility_mode()); + ASSERT_EQ((RendererAccessibility*) NULL, view()->renderer_accessibility()); - frame()->OnSetAccessibilityMode(AccessibilityModeComplete); - ASSERT_EQ(AccessibilityModeComplete, frame()->accessibility_mode()); - ASSERT_NE((RendererAccessibility*) NULL, frame()->renderer_accessibility()); + view()->OnSetAccessibilityMode(AccessibilityModeComplete); + ASSERT_EQ(AccessibilityModeComplete, view()->accessibility_mode()); + ASSERT_NE((RendererAccessibility*) NULL, view()->renderer_accessibility()); ASSERT_EQ(RendererAccessibilityTypeComplete, - frame()->renderer_accessibility()->GetType()); + view()->renderer_accessibility()->GetType()); - frame()->OnSetAccessibilityMode(AccessibilityModeEditableTextOnly); - ASSERT_EQ(AccessibilityModeEditableTextOnly, frame()->accessibility_mode()); - ASSERT_NE((RendererAccessibility*) NULL, frame()->renderer_accessibility()); + view()->OnSetAccessibilityMode(AccessibilityModeEditableTextOnly); + ASSERT_EQ(AccessibilityModeEditableTextOnly, view()->accessibility_mode()); + ASSERT_NE((RendererAccessibility*) NULL, view()->renderer_accessibility()); ASSERT_EQ(RendererAccessibilityTypeFocusOnly, - frame()->renderer_accessibility()->GetType()); + view()->renderer_accessibility()->GetType()); } TEST_F(RenderViewImplTest, ScreenMetricsEmulation) { diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 13d98ca..4aeb478 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -727,6 +727,8 @@ 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), @@ -859,6 +861,9 @@ 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)) @@ -1201,7 +1206,8 @@ RenderViewImpl* RenderViewImpl::Create( bool hidden, bool never_visible, int32 next_page_id, - const blink::WebScreenInfo& screen_info) { + const blink::WebScreenInfo& screen_info, + AccessibilityMode accessibility_mode) { DCHECK(routing_id != MSG_ROUTING_NONE); RenderViewImplParams params(opener_id, window_was_created_with_opener, @@ -1218,7 +1224,8 @@ RenderViewImpl* RenderViewImpl::Create( hidden, never_visible, next_page_id, - screen_info); + screen_info, + accessibility_mode); RenderViewImpl* render_view = NULL; if (g_create_render_view_impl) render_view = g_create_render_view_impl(¶ms); @@ -1406,6 +1413,7 @@ 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) @@ -1747,7 +1755,8 @@ WebView* RenderViewImpl::createView(WebLocalFrame* creator, params.disposition == NEW_BACKGROUND_TAB, // hidden never_visible, 1, // next_page_id - screen_info_); + screen_info_, + accessibility_mode_); view->opened_by_user_gesture_ = params.user_gesture; // Record whether the creator frame is trying to suppress the opener field. @@ -2031,9 +2040,6 @@ 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() { @@ -2066,7 +2072,9 @@ int RenderViewImpl::historyForwardListCount() { void RenderViewImpl::postAccessibilityEvent( const WebAXObject& obj, blink::WebAXEvent event) { - main_render_frame()->HandleWebAccessibilityEvent(obj, event); + if (renderer_accessibility_) { + renderer_accessibility_->HandleWebAccessibilityEvent(obj, event); + } } void RenderViewImpl::didUpdateInspectorSetting(const WebString& key, @@ -3413,6 +3421,25 @@ 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); @@ -4107,12 +4134,10 @@ bool RenderViewImpl::didTapMultipleTargets( const WebVector<WebRect>& target_rects) { // Never show a disambiguation popup when accessibility is enabled, // as this interferes with "touch exploration". - AccessibilityMode accessibility_mode = - main_render_frame()->accessibility_mode(); - bool matches_accessibility_mode_complete = - (accessibility_mode & AccessibilityModeComplete) == - AccessibilityModeComplete; - if (matches_accessibility_mode_complete) + bool matchesAccessibilityModeComplete = + (accessibility_mode_ & AccessibilityModeComplete) == + AccessibilityModeComplete; + if (matchesAccessibilityModeComplete) return false; gfx::Rect finger_rect( diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index 207a082..6efc709 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h @@ -139,6 +139,7 @@ class PepperPluginInstanceImpl; class RenderViewImplTest; class RenderViewObserver; class RenderViewTest; +class RendererAccessibility; class RendererDateTimePicker; class RendererWebColorChooserImpl; class SpeechRecognitionDispatcher; @@ -184,7 +185,8 @@ class CONTENT_EXPORT RenderViewImpl bool hidden, bool never_visible, int32 next_page_id, - const blink::WebScreenInfo& screen_info); + const blink::WebScreenInfo& screen_info, + AccessibilityMode accessibility_mode); // Used by content_layouttest_support to hook into the creation of // RenderViewImpls. @@ -218,6 +220,14 @@ 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_; } @@ -563,9 +573,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 @@ -589,6 +599,7 @@ 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, @@ -713,6 +724,7 @@ 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(); @@ -1033,6 +1045,13 @@ 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 6864a3d..81522d8 100644 --- a/content/renderer/render_view_impl_params.cc +++ b/content/renderer/render_view_impl_params.cc @@ -22,7 +22,8 @@ RenderViewImplParams::RenderViewImplParams( bool hidden, bool never_visible, int32 next_page_id, - const blink::WebScreenInfo& screen_info) + const blink::WebScreenInfo& screen_info, + AccessibilityMode accessibility_mode) : opener_id(opener_id), window_was_created_with_opener(window_was_created_with_opener), renderer_prefs(renderer_prefs), @@ -38,7 +39,8 @@ RenderViewImplParams::RenderViewImplParams( hidden(hidden), never_visible(never_visible), next_page_id(next_page_id), - screen_info(screen_info) {} + screen_info(screen_info), + accessibility_mode(accessibility_mode) {} RenderViewImplParams::~RenderViewImplParams() {} diff --git a/content/renderer/render_view_impl_params.h b/content/renderer/render_view_impl_params.h index ad9a26c..ecd878c 100644 --- a/content/renderer/render_view_impl_params.h +++ b/content/renderer/render_view_impl_params.h @@ -37,7 +37,8 @@ struct CONTENT_EXPORT RenderViewImplParams { bool hidden, bool never_visible, int32 next_page_id, - const blink::WebScreenInfo& screen_info); + const blink::WebScreenInfo& screen_info, + AccessibilityMode accessibility_mode); ~RenderViewImplParams(); int32 opener_id; @@ -56,6 +57,7 @@ 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 e91b2cf..ba0331c 100644 --- a/content/test/accessibility_browser_test_utils.cc +++ b/content/test/accessibility_browser_test_utils.cc @@ -8,9 +8,8 @@ #include "base/logging.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" -#include "content/browser/frame_host/render_frame_host_impl.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/common/view_message_enums.h" #include "content/public/browser/web_contents.h" #include "content/public/common/url_constants.h" @@ -27,9 +26,9 @@ AccessibilityNotificationWaiter::AccessibilityNotificationWaiter(Shell* shell) weak_factory_(this), event_target_id_(0) { WebContents* web_contents = shell_->web_contents(); - frame_host_ = static_cast<RenderFrameHostImpl*>( - web_contents->GetMainFrame()); - frame_host_->SetAccessibilityCallbackForTesting( + view_host_ = static_cast<RenderViewHostImpl*>( + web_contents->GetRenderViewHost()); + view_host_->SetAccessibilityCallbackForTesting( base::Bind(&AccessibilityNotificationWaiter::OnAccessibilityEvent, weak_factory_.GetWeakPtr())); } @@ -43,14 +42,13 @@ AccessibilityNotificationWaiter::AccessibilityNotificationWaiter( loop_runner_(new MessageLoopRunner()), weak_factory_(this), event_target_id_(0) { - WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( - shell_->web_contents()); - frame_host_ = static_cast<RenderFrameHostImpl*>( - web_contents->GetMainFrame()); - frame_host_->SetAccessibilityCallbackForTesting( + WebContents* web_contents = shell_->web_contents(); + view_host_ = static_cast<RenderViewHostImpl*>( + web_contents->GetRenderViewHost()); + view_host_->SetAccessibilityCallbackForTesting( base::Bind(&AccessibilityNotificationWaiter::OnAccessibilityEvent, weak_factory_.GetWeakPtr())); - web_contents->AddAccessibilityMode(accessibility_mode); + view_host_->AddAccessibilityMode(accessibility_mode); } AccessibilityNotificationWaiter::~AccessibilityNotificationWaiter() { @@ -61,7 +59,7 @@ void AccessibilityNotificationWaiter::WaitForNotification() { } const ui::AXTree& AccessibilityNotificationWaiter::GetAXTree() const { - return *frame_host_->GetAXTreeForTesting(); + return view_host_->ax_tree_for_testing(); } void AccessibilityNotificationWaiter::OnAccessibilityEvent( diff --git a/content/test/accessibility_browser_test_utils.h b/content/test/accessibility_browser_test_utils.h index 2e22b6f..5111e3c 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/accessibility_mode_enums.h" +#include "content/common/view_message_enums.h" #include "ui/accessibility/ax_node_data.h" #include "ui/accessibility/ax_tree.h" namespace content { class MessageLoopRunner; -class RenderFrameHostImpl; +class RenderViewHostImpl; class Shell; // Create an instance of this class *before* doing any operation that @@ -53,7 +53,7 @@ class AccessibilityNotificationWaiter { bool IsAboutBlank(); Shell* shell_; - RenderFrameHostImpl* frame_host_; + RenderViewHostImpl* view_host_; ui::AXEvent event_to_wait_for_; scoped_refptr<MessageLoopRunner> loop_runner_; base::WeakPtrFactory<AccessibilityNotificationWaiter> weak_factory_; |