Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(284)

Side by Side Diff: chrome/browser/extensions/api/automation_internal/automation_internal_api.cc

Issue 273423004: Migrate accessibility from RenderView to RenderFrame. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/automation_internal/automation_internal_ api.h" 5 #include "chrome/browser/extensions/api/automation_internal/automation_internal_ api.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "chrome/browser/extensions/api/automation_internal/automation_action_ad apter.h" 10 #include "chrome/browser/extensions/api/automation_internal/automation_action_ad apter.h"
11 #include "chrome/browser/extensions/api/automation_internal/automation_util.h" 11 #include "chrome/browser/extensions/api/automation_internal/automation_util.h"
12 #include "chrome/browser/extensions/api/tabs/tabs_constants.h" 12 #include "chrome/browser/extensions/api/tabs/tabs_constants.h"
13 #include "chrome/browser/extensions/extension_tab_util.h" 13 #include "chrome/browser/extensions/extension_tab_util.h"
14 #include "chrome/browser/ui/browser.h" 14 #include "chrome/browser/ui/browser.h"
15 #include "chrome/browser/ui/tabs/tab_strip_model.h" 15 #include "chrome/browser/ui/tabs/tab_strip_model.h"
16 #include "chrome/common/extensions/api/automation_internal.h" 16 #include "chrome/common/extensions/api/automation_internal.h"
17 #include "chrome/common/extensions/manifest_handlers/automation.h" 17 #include "chrome/common/extensions/manifest_handlers/automation.h"
18 #include "content/public/browser/ax_event_notification_details.h" 18 #include "content/public/browser/ax_event_notification_details.h"
19 #include "content/public/browser/render_frame_host.h"
19 #include "content/public/browser/render_process_host.h" 20 #include "content/public/browser/render_process_host.h"
20 #include "content/public/browser/render_view_host.h"
21 #include "content/public/browser/render_widget_host.h" 21 #include "content/public/browser/render_widget_host.h"
22 #include "content/public/browser/render_widget_host_view.h" 22 #include "content/public/browser/render_widget_host_view.h"
23 #include "content/public/browser/web_contents.h" 23 #include "content/public/browser/web_contents.h"
24 #include "extensions/common/permissions/permissions_data.h" 24 #include "extensions/common/permissions/permissions_data.h"
25 25
26 #if defined(OS_CHROMEOS) 26 #if defined(OS_CHROMEOS)
27 #include "chrome/browser/ui/ash/accessibility/automation_manager_ash.h" 27 #include "chrome/browser/ui/ash/accessibility/automation_manager_ash.h"
28 #endif 28 #endif
29 29
30 namespace extensions { 30 namespace extensions {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 virtual ~AutomationWebContentsObserver() {} 71 virtual ~AutomationWebContentsObserver() {}
72 72
73 // content::WebContentsObserver overrides. 73 // content::WebContentsObserver overrides.
74 virtual void AccessibilityEventReceived( 74 virtual void AccessibilityEventReceived(
75 const std::vector<content::AXEventNotificationDetails>& details) 75 const std::vector<content::AXEventNotificationDetails>& details)
76 OVERRIDE { 76 OVERRIDE {
77 automation_util::DispatchAccessibilityEventsToAutomation( 77 automation_util::DispatchAccessibilityEventsToAutomation(
78 details, browser_context_); 78 details, browser_context_);
79 } 79 }
80 80
81 virtual void RenderViewDeleted( 81 virtual void RenderFrameDeleted(
82 content::RenderViewHost* render_view_host) OVERRIDE { 82 content::RenderFrameHost* render_frame_host) OVERRIDE {
83 automation_util::DispatchTreeDestroyedEventToAutomation( 83 automation_util::DispatchTreeDestroyedEventToAutomation(
84 render_view_host->GetProcess()->GetID(), 84 render_frame_host->GetProcess()->GetID(),
85 render_view_host->GetRoutingID(), 85 render_frame_host->GetRoutingID(),
86 browser_context_); 86 browser_context_);
87 } 87 }
88 88
89 private: 89 private:
90 friend class content::WebContentsUserData<AutomationWebContentsObserver>; 90 friend class content::WebContentsUserData<AutomationWebContentsObserver>;
91 91
92 AutomationWebContentsObserver( 92 AutomationWebContentsObserver(
93 content::WebContents* web_contents) 93 content::WebContents* web_contents)
94 : content::WebContentsObserver(web_contents), 94 : content::WebContentsObserver(web_contents),
95 browser_context_(web_contents->GetBrowserContext()) {} 95 browser_context_(web_contents->GetBrowserContext()) {}
96 96
97 content::BrowserContext* browser_context_; 97 content::BrowserContext* browser_context_;
98 98
99 DISALLOW_COPY_AND_ASSIGN(AutomationWebContentsObserver); 99 DISALLOW_COPY_AND_ASSIGN(AutomationWebContentsObserver);
100 }; 100 };
101 101
102 // Helper class that implements an action adapter for a |RenderWidgetHost|. 102 // Helper class that implements an action adapter for a |RenderFrameHost|.
103 class RenderWidgetHostActionAdapter : public AutomationActionAdapter { 103 class RenderFrameHostActionAdapter : public AutomationActionAdapter {
104 public: 104 public:
105 explicit RenderWidgetHostActionAdapter(content::RenderWidgetHost* rwh) 105 explicit RenderFrameHostActionAdapter(content::RenderFrameHost* rfh)
106 : rwh_(rwh) {} 106 : rfh_(rfh) {}
107 107
108 virtual ~RenderWidgetHostActionAdapter() {} 108 virtual ~RenderFrameHostActionAdapter() {}
109 109
110 // AutomationActionAdapter implementation. 110 // AutomationActionAdapter implementation.
111 virtual void DoDefault(int32 id) OVERRIDE { 111 virtual void DoDefault(int32 id) OVERRIDE {
112 rwh_->AccessibilityDoDefaultAction(id); 112 rfh_->AccessibilityDoDefaultAction(id);
113 } 113 }
114 114
115 virtual void Focus(int32 id) OVERRIDE { 115 virtual void Focus(int32 id) OVERRIDE {
116 rwh_->AccessibilitySetFocus(id); 116 rfh_->AccessibilitySetFocus(id);
117 } 117 }
118 118
119 virtual void MakeVisible(int32 id) OVERRIDE { 119 virtual void MakeVisible(int32 id) OVERRIDE {
120 rwh_->AccessibilityScrollToMakeVisible(id, gfx::Rect()); 120 rfh_->AccessibilityScrollToMakeVisible(id, gfx::Rect());
121 } 121 }
122 122
123 virtual void SetSelection(int32 id, int32 start, int32 end) OVERRIDE { 123 virtual void SetSelection(int32 id, int32 start, int32 end) OVERRIDE {
124 rwh_->AccessibilitySetTextSelection(id, start, end); 124 rfh_->AccessibilitySetTextSelection(id, start, end);
125 } 125 }
126 126
127 private: 127 private:
128 content::RenderWidgetHost* rwh_; 128 content::RenderFrameHost* rfh_;
129 129
130 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostActionAdapter); 130 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostActionAdapter);
131 }; 131 };
132 132
133 ExtensionFunction::ResponseAction 133 ExtensionFunction::ResponseAction
134 AutomationInternalEnableTabFunction::Run() { 134 AutomationInternalEnableTabFunction::Run() {
135 const AutomationInfo* automation_info = AutomationInfo::Get(GetExtension()); 135 const AutomationInfo* automation_info = AutomationInfo::Get(GetExtension());
136 EXTENSION_FUNCTION_VALIDATE(automation_info); 136 EXTENSION_FUNCTION_VALIDATE(automation_info);
137 137
138 using api::automation_internal::EnableTab::Params; 138 using api::automation_internal::EnableTab::Params;
139 scoped_ptr<Params> params(Params::Create(*args_)); 139 scoped_ptr<Params> params(Params::Create(*args_));
140 EXTENSION_FUNCTION_VALIDATE(params.get()); 140 EXTENSION_FUNCTION_VALIDATE(params.get());
141 content::WebContents* contents = NULL; 141 content::WebContents* contents = NULL;
142 if (params->tab_id.get()) { 142 if (params->tab_id.get()) {
143 int tab_id = *params->tab_id; 143 int tab_id = *params->tab_id;
144 if (!ExtensionTabUtil::GetTabById(tab_id, 144 if (!ExtensionTabUtil::GetTabById(tab_id,
145 GetProfile(), 145 GetProfile(),
146 include_incognito(), 146 include_incognito(),
147 NULL, /* browser out param*/ 147 NULL, /* browser out param*/
148 NULL, /* tab_strip out param */ 148 NULL, /* tab_strip out param */
149 &contents, 149 &contents,
150 NULL /* tab_index out param */)) { 150 NULL /* tab_index out param */)) {
151 return RespondNow( 151 return RespondNow(
152 Error(tabs_constants::kTabNotFoundError, base::IntToString(tab_id))); 152 Error(tabs_constants::kTabNotFoundError, base::IntToString(tab_id)));
153 } 153 }
154 } else { 154 } else {
155 contents = GetCurrentBrowser()->tab_strip_model()->GetActiveWebContents(); 155 contents = GetCurrentBrowser()->tab_strip_model()->GetActiveWebContents();
156 if (!contents) 156 if (!contents)
157 return RespondNow(Error("No active tab")); 157 return RespondNow(Error("No active tab"));
158 } 158 }
159 content::RenderWidgetHost* rwh = 159 content::RenderFrameHost* rfh = contents->GetMainFrame();
160 contents->GetRenderWidgetHostView()->GetRenderWidgetHost(); 160 if (!rfh)
161 if (!rwh)
162 return RespondNow(Error("Could not enable accessibility for active tab")); 161 return RespondNow(Error("Could not enable accessibility for active tab"));
163 162
164 if (!CanRequestAutomation(GetExtension(), automation_info, contents)) { 163 if (!CanRequestAutomation(GetExtension(), automation_info, contents)) {
165 return RespondNow( 164 return RespondNow(
166 Error(kCannotRequestAutomationOnPage, contents->GetURL().spec())); 165 Error(kCannotRequestAutomationOnPage, contents->GetURL().spec()));
167 } 166 }
168 AutomationWebContentsObserver::CreateForWebContents(contents); 167 AutomationWebContentsObserver::CreateForWebContents(contents);
169 rwh->EnableTreeOnlyAccessibilityMode(); 168 contents->EnableTreeOnlyAccessibilityMode();
170 return RespondNow( 169 return RespondNow(
171 ArgumentList(api::automation_internal::EnableTab::Results::Create( 170 ArgumentList(api::automation_internal::EnableTab::Results::Create(
172 rwh->GetProcess()->GetID(), rwh->GetRoutingID()))); 171 rfh->GetProcess()->GetID(), rfh->GetRoutingID())));
173 } 172 }
174 173
175 ExtensionFunction::ResponseAction 174 ExtensionFunction::ResponseAction
176 AutomationInternalPerformActionFunction::Run() { 175 AutomationInternalPerformActionFunction::Run() {
177 const AutomationInfo* automation_info = AutomationInfo::Get(GetExtension()); 176 const AutomationInfo* automation_info = AutomationInfo::Get(GetExtension());
178 EXTENSION_FUNCTION_VALIDATE(automation_info && automation_info->interact); 177 EXTENSION_FUNCTION_VALIDATE(automation_info && automation_info->interact);
179 178
180 using api::automation_internal::PerformAction::Params; 179 using api::automation_internal::PerformAction::Params;
181 scoped_ptr<Params> params(Params::Create(*args_)); 180 scoped_ptr<Params> params(Params::Create(*args_));
182 EXTENSION_FUNCTION_VALIDATE(params.get()); 181 EXTENSION_FUNCTION_VALIDATE(params.get());
183 182
184 if (params->args.process_id == kDesktopProcessID && 183 if (params->args.process_id == kDesktopProcessID &&
185 params->args.routing_id == kDesktopRoutingID) { 184 params->args.routing_id == kDesktopRoutingID) {
186 #if defined(OS_CHROMEOS) 185 #if defined(OS_CHROMEOS)
187 return RouteActionToAdapter( 186 return RouteActionToAdapter(
188 params.get(), AutomationManagerAsh::GetInstance()); 187 params.get(), AutomationManagerAsh::GetInstance());
189 #else 188 #else
190 NOTREACHED(); 189 NOTREACHED();
191 return RespondNow(Error("Unexpected action on desktop automation tree;" 190 return RespondNow(Error("Unexpected action on desktop automation tree;"
192 " platform does not support desktop automation")); 191 " platform does not support desktop automation"));
193 #endif // defined(OS_CHROMEOS) 192 #endif // defined(OS_CHROMEOS)
194 } 193 }
195 content::RenderWidgetHost* rwh = content::RenderWidgetHost::FromID( 194 content::RenderFrameHost* rfh =
196 params->args.process_id, params->args.routing_id); 195 content::RenderFrameHost::FromID(params->args.process_id,
196 params->args.routing_id);
197 if (!rfh)
198 return RespondNow(Error("Ignoring action on destroyed node"));
197 199
198 if (!rwh) 200 const content::WebContents* contents =
199 return RespondNow(Error("Ignoring action on destroyed node")); 201 content::WebContents::FromRenderFrameHost(rfh);
200 if (rwh->IsRenderView()) { 202 if (!CanRequestAutomation(GetExtension(), automation_info, contents)) {
201 const content::RenderViewHost* rvh = content::RenderViewHost::From(rwh); 203 return RespondNow(
202 const content::WebContents* contents = 204 Error(kCannotRequestAutomationOnPage, contents->GetURL().spec()));
203 content::WebContents::FromRenderViewHost(rvh);
204 if (!CanRequestAutomation(GetExtension(), automation_info, contents)) {
205 return RespondNow(
206 Error(kCannotRequestAutomationOnPage, contents->GetURL().spec()));
207 }
208 } 205 }
209 RenderWidgetHostActionAdapter adapter(rwh); 206
207 RenderFrameHostActionAdapter adapter(rfh);
210 return RouteActionToAdapter(params.get(), &adapter); 208 return RouteActionToAdapter(params.get(), &adapter);
211 } 209 }
212 210
213 ExtensionFunction::ResponseAction 211 ExtensionFunction::ResponseAction
214 AutomationInternalPerformActionFunction::RouteActionToAdapter( 212 AutomationInternalPerformActionFunction::RouteActionToAdapter(
215 api::automation_internal::PerformAction::Params* params, 213 api::automation_internal::PerformAction::Params* params,
216 AutomationActionAdapter* adapter) { 214 AutomationActionAdapter* adapter) {
217 int32 automation_id = params->args.automation_node_id; 215 int32 automation_id = params->args.automation_node_id;
218 switch (params->args.action_type) { 216 switch (params->args.action_type) {
219 case api::automation_internal::ACTION_TYPE_DODEFAULT: 217 case api::automation_internal::ACTION_TYPE_DODEFAULT:
(...skipping 29 matching lines...) Expand all
249 return RespondNow(Error("desktop permission must be requested")); 247 return RespondNow(Error("desktop permission must be requested"));
250 248
251 AutomationManagerAsh::GetInstance()->Enable(browser_context()); 249 AutomationManagerAsh::GetInstance()->Enable(browser_context());
252 return RespondNow(NoArguments()); 250 return RespondNow(NoArguments());
253 #else 251 #else
254 return RespondNow(Error("getDesktop is unsupported by this platform")); 252 return RespondNow(Error("getDesktop is unsupported by this platform"));
255 #endif // defined(OS_CHROMEOS) 253 #endif // defined(OS_CHROMEOS)
256 } 254 }
257 255
258 } // namespace extensions 256 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698