Index: content/browser/web_contents/web_contents_impl.cc |
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc |
index 85749836e370145c26ae24632890c2f22bd3dd14..5e8942bc8e6cef11b7a49b614865f634d28f8c19 100644 |
--- a/content/browser/web_contents/web_contents_impl.cc |
+++ b/content/browser/web_contents/web_contents_impl.cc |
@@ -18,6 +18,8 @@ |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/time/time.h" |
+#include "content/browser/accessibility/accessibility_mode_helper.h" |
+#include "content/browser/accessibility/browser_accessibility_state_impl.h" |
#include "content/browser/browser_plugin/browser_plugin_embedder.h" |
#include "content/browser/browser_plugin/browser_plugin_guest.h" |
#include "content/browser/child_process_security_policy_impl.h" |
@@ -72,6 +74,7 @@ |
#include "content/public/browser/navigation_details.h" |
#include "content/public/browser/notification_details.h" |
#include "content/public/browser/notification_service.h" |
+#include "content/public/browser/render_widget_host_iterator.h" |
#include "content/public/browser/resource_request_details.h" |
#include "content/public/browser/storage_partition.h" |
#include "content/public/browser/user_metrics.h" |
@@ -213,6 +216,16 @@ bool ForEachFrameInternal( |
return true; |
} |
+bool ForEachPendingFrameInternal( |
+ const base::Callback<void(RenderFrameHost*)>& on_frame, |
+ FrameTreeNode* node) { |
+ RenderFrameHost* pending_frame_host = |
+ node->render_manager()->pending_frame_host(); |
+ if (pending_frame_host) |
+ on_frame.Run(pending_frame_host); |
+ return true; |
+} |
+ |
void SendToAllFramesInternal(IPC::Message* message, RenderFrameHost* rfh) { |
IPC::Message* message_copy = new IPC::Message(*message); |
message_copy->set_routing_id(rfh->GetRoutingID()); |
@@ -228,6 +241,11 @@ void AddRenderWidgetHostViewToSet(std::set<RenderWidgetHostView*>* set, |
set->insert(rwhv); |
} |
+void SetAccessibilityModeOnFrame(AccessibilityMode mode, |
+ RenderFrameHost* frame_host) { |
+ static_cast<RenderFrameHostImpl*>(frame_host)->SetAccessibilityMode(mode); |
+} |
+ |
} // namespace |
WebContents* WebContents::Create(const WebContents::CreateParams& params) { |
@@ -356,7 +374,9 @@ WebContentsImpl::WebContentsImpl( |
fullscreen_widget_had_focus_at_shutdown_(false), |
is_subframe_(false), |
touch_emulation_enabled_(false), |
- last_dialog_suppressed_(false) { |
+ last_dialog_suppressed_(false), |
+ accessibility_mode_( |
+ BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode()) { |
for (size_t i = 0; i < g_created_callbacks.Get().size(); i++) |
g_created_callbacks.Get().at(i).Run(this); |
frame_tree_.SetFrameRemoveListener( |
@@ -455,6 +475,30 @@ WebContentsImpl* WebContentsImpl::CreateWithOpener( |
return new_contents; |
} |
+// static |
+std::vector<WebContentsImpl*> WebContentsImpl::GetAllWebContents() { |
+ std::vector<WebContentsImpl*> result; |
+ scoped_ptr<RenderWidgetHostIterator> widgets( |
+ RenderWidgetHostImpl::GetRenderWidgetHosts()); |
+ std::set<WebContentsImpl*> web_contents_set; |
+ while (RenderWidgetHost* rwh = widgets->GetNextHost()) { |
+ if (!rwh->IsRenderView()) |
+ continue; |
+ RenderViewHost* rvh = RenderViewHost::From(rwh); |
+ if (!rvh) |
+ continue; |
+ WebContents* web_contents = WebContents::FromRenderViewHost(rvh); |
+ if (!web_contents) |
+ continue; |
+ WebContentsImpl* wci = static_cast<WebContentsImpl*>(web_contents); |
+ if (web_contents_set.find(wci) == web_contents_set.end()) { |
+ web_contents_set.insert(wci); |
+ result.push_back(wci); |
+ } |
+ } |
+ return result; |
+} |
+ |
RenderFrameHostManager* WebContentsImpl::GetRenderManagerForTesting() { |
return GetRenderManager(); |
} |
@@ -680,6 +724,29 @@ WebContentsView* WebContentsImpl::GetView() const { |
return view_.get(); |
} |
+void WebContentsImpl::SetAccessibilityMode(AccessibilityMode mode) { |
+ if (mode == accessibility_mode_) |
+ return; |
+ |
+ accessibility_mode_ = mode; |
+ frame_tree_.ForEach( |
+ base::Bind(&ForEachFrameInternal, |
+ base::Bind(&SetAccessibilityModeOnFrame, mode))); |
+ frame_tree_.ForEach( |
+ base::Bind(&ForEachPendingFrameInternal, |
+ base::Bind(&SetAccessibilityModeOnFrame, mode))); |
+} |
+ |
+void WebContentsImpl::AddAccessibilityMode(AccessibilityMode mode) { |
+ SetAccessibilityMode( |
+ content::AddAccessibilityModeTo(accessibility_mode_, mode)); |
+} |
+ |
+void WebContentsImpl::RemoveAccessibilityMode(AccessibilityMode mode) { |
+ SetAccessibilityMode( |
+ content::RemoveAccessibilityModeFrom(accessibility_mode_, mode)); |
+} |
+ |
WebUI* WebContentsImpl::CreateWebUI(const GURL& url) { |
WebUIImpl* web_ui = new WebUIImpl(this); |
WebUIController* controller = WebUIControllerFactoryRegistry::GetInstance()-> |
@@ -728,12 +795,25 @@ const std::string& WebContentsImpl::GetUserAgentOverride() const { |
return renderer_preferences_.user_agent_override; |
} |
+void WebContentsImpl::EnableTreeOnlyAccessibilityMode() { |
+ AddAccessibilityMode(AccessibilityModeTreeOnly); |
+} |
+ |
+bool WebContentsImpl::IsTreeOnlyAccessibilityModeForTesting() const { |
+ return accessibility_mode_ == AccessibilityModeTreeOnly; |
+} |
+ |
+bool WebContentsImpl::IsFullAccessibilityModeForTesting() const { |
+ return accessibility_mode_ == AccessibilityModeComplete; |
+} |
+ |
#if defined(OS_WIN) |
void WebContentsImpl::SetParentNativeViewAccessible( |
gfx::NativeViewAccessible accessible_parent) { |
accessible_parent_ = accessible_parent; |
- if (GetRenderViewHost()) |
- GetRenderViewHostImpl()->SetParentNativeViewAccessible(accessible_parent); |
+ RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); |
+ if (rfh) |
+ rfh->SetParentNativeViewAccessible(accessible_parent); |
} |
#endif |
@@ -1294,12 +1374,6 @@ bool WebContentsImpl::HandleGestureEvent( |
return false; |
} |
-#if defined(OS_WIN) |
-gfx::NativeViewAccessible WebContentsImpl::GetParentNativeViewAccessible() { |
- return accessible_parent_; |
-} |
-#endif |
- |
void WebContentsImpl::HandleMouseDown() { |
if (delegate_) |
delegate_->HandleMouseDown(); |
@@ -1695,6 +1769,10 @@ FrameTree* WebContentsImpl::GetFrameTree() { |
return &frame_tree_; |
} |
+AccessibilityMode WebContentsImpl::GetAccessibilityMode() const { |
+ return accessibility_mode_; |
+} |
+ |
void WebContentsImpl::AccessibilityEventReceived( |
const std::vector<AXEventNotificationDetails>& details) { |
FOR_EACH_OBSERVER( |
@@ -1732,6 +1810,18 @@ void WebContentsImpl::OnTouchEmulationEnabled(bool enabled) { |
view_->SetOverscrollControllerEnabled(CanOverscrollContent()); |
} |
+BrowserAccessibilityManager* |
+ WebContentsImpl::GetRootBrowserAccessibilityManager() { |
+ RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); |
+ return rfh ? rfh->browser_accessibility_manager() : NULL; |
+} |
+ |
+BrowserAccessibilityManager* |
+ WebContentsImpl::GetOrCreateRootBrowserAccessibilityManager() { |
+ RenderFrameHostImpl* rfh = static_cast<RenderFrameHostImpl*>(GetMainFrame()); |
+ return rfh ? rfh->GetOrCreateBrowserAccessibilityManager() : NULL; |
+} |
+ |
void WebContentsImpl::UpdatePreferredSize(const gfx::Size& pref_size) { |
const gfx::Size old_size = GetPreferredSize(); |
preferred_size_ = pref_size; |
@@ -3205,6 +3295,7 @@ void WebContentsImpl::RenderFrameCreated(RenderFrameHost* render_frame_host) { |
FOR_EACH_OBSERVER(WebContentsObserver, |
observers_, |
RenderFrameCreated(render_frame_host)); |
+ SetAccessibilityModeOnFrame(accessibility_mode_, render_frame_host); |
} |
void WebContentsImpl::RenderFrameDeleted(RenderFrameHost* render_frame_host) { |
@@ -3327,6 +3418,12 @@ bool WebContentsImpl::IsNeverVisible() { |
return delegate_->IsNeverVisible(this); |
} |
+#if defined(OS_WIN) |
+gfx::NativeViewAccessible WebContentsImpl::GetParentNativeViewAccessible() { |
+ return accessible_parent_; |
+} |
+#endif |
+ |
RenderViewHostDelegateView* WebContentsImpl::GetDelegateView() { |
return render_view_host_delegate_view_; |
} |
@@ -3385,6 +3482,7 @@ void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { |
RenderFrameHost* main_frame = render_view_host->GetMainFrame(); |
FOR_EACH_OBSERVER( |
WebContentsObserver, observers_, RenderFrameCreated(main_frame)); |
+ SetAccessibilityModeOnFrame(accessibility_mode_, main_frame); |
} |
void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) { |