OLD | NEW |
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" | |
20 #include "content/public/browser/render_process_host.h" | 19 #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 Loading... |
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 RenderFrameDeleted( | 81 virtual void RenderViewDeleted( |
82 content::RenderFrameHost* render_frame_host) OVERRIDE { | 82 content::RenderViewHost* render_view_host) OVERRIDE { |
83 automation_util::DispatchTreeDestroyedEventToAutomation( | 83 automation_util::DispatchTreeDestroyedEventToAutomation( |
84 render_frame_host->GetProcess()->GetID(), | 84 render_view_host->GetProcess()->GetID(), |
85 render_frame_host->GetRoutingID(), | 85 render_view_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 |RenderFrameHost|. | 102 // Helper class that implements an action adapter for a |RenderWidgetHost|. |
103 class RenderFrameHostActionAdapter : public AutomationActionAdapter { | 103 class RenderWidgetHostActionAdapter : public AutomationActionAdapter { |
104 public: | 104 public: |
105 explicit RenderFrameHostActionAdapter(content::RenderFrameHost* rfh) | 105 explicit RenderWidgetHostActionAdapter(content::RenderWidgetHost* rwh) |
106 : rfh_(rfh) {} | 106 : rwh_(rwh) {} |
107 | 107 |
108 virtual ~RenderFrameHostActionAdapter() {} | 108 virtual ~RenderWidgetHostActionAdapter() {} |
109 | 109 |
110 // AutomationActionAdapter implementation. | 110 // AutomationActionAdapter implementation. |
111 virtual void DoDefault(int32 id) OVERRIDE { | 111 virtual void DoDefault(int32 id) OVERRIDE { |
112 rfh_->AccessibilityDoDefaultAction(id); | 112 rwh_->AccessibilityDoDefaultAction(id); |
113 } | 113 } |
114 | 114 |
115 virtual void Focus(int32 id) OVERRIDE { | 115 virtual void Focus(int32 id) OVERRIDE { |
116 rfh_->AccessibilitySetFocus(id); | 116 rwh_->AccessibilitySetFocus(id); |
117 } | 117 } |
118 | 118 |
119 virtual void MakeVisible(int32 id) OVERRIDE { | 119 virtual void MakeVisible(int32 id) OVERRIDE { |
120 rfh_->AccessibilityScrollToMakeVisible(id, gfx::Rect()); | 120 rwh_->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 rfh_->AccessibilitySetTextSelection(id, start, end); | 124 rwh_->AccessibilitySetTextSelection(id, start, end); |
125 } | 125 } |
126 | 126 |
127 private: | 127 private: |
128 content::RenderFrameHost* rfh_; | 128 content::RenderWidgetHost* rwh_; |
129 | 129 |
130 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostActionAdapter); | 130 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostActionAdapter); |
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::RenderFrameHost* rfh = contents->GetMainFrame(); | 159 content::RenderWidgetHost* rwh = |
160 if (!rfh) | 160 contents->GetRenderWidgetHostView()->GetRenderWidgetHost(); |
| 161 if (!rwh) |
161 return RespondNow(Error("Could not enable accessibility for active tab")); | 162 return RespondNow(Error("Could not enable accessibility for active tab")); |
162 | 163 |
163 if (!CanRequestAutomation(GetExtension(), automation_info, contents)) { | 164 if (!CanRequestAutomation(GetExtension(), automation_info, contents)) { |
164 return RespondNow( | 165 return RespondNow( |
165 Error(kCannotRequestAutomationOnPage, contents->GetURL().spec())); | 166 Error(kCannotRequestAutomationOnPage, contents->GetURL().spec())); |
166 } | 167 } |
167 AutomationWebContentsObserver::CreateForWebContents(contents); | 168 AutomationWebContentsObserver::CreateForWebContents(contents); |
168 contents->EnableTreeOnlyAccessibilityMode(); | 169 rwh->EnableTreeOnlyAccessibilityMode(); |
169 return RespondNow( | 170 return RespondNow( |
170 ArgumentList(api::automation_internal::EnableTab::Results::Create( | 171 ArgumentList(api::automation_internal::EnableTab::Results::Create( |
171 rfh->GetProcess()->GetID(), rfh->GetRoutingID()))); | 172 rwh->GetProcess()->GetID(), rwh->GetRoutingID()))); |
172 } | 173 } |
173 | 174 |
174 ExtensionFunction::ResponseAction | 175 ExtensionFunction::ResponseAction |
175 AutomationInternalPerformActionFunction::Run() { | 176 AutomationInternalPerformActionFunction::Run() { |
176 const AutomationInfo* automation_info = AutomationInfo::Get(GetExtension()); | 177 const AutomationInfo* automation_info = AutomationInfo::Get(GetExtension()); |
177 EXTENSION_FUNCTION_VALIDATE(automation_info && automation_info->interact); | 178 EXTENSION_FUNCTION_VALIDATE(automation_info && automation_info->interact); |
178 | 179 |
179 using api::automation_internal::PerformAction::Params; | 180 using api::automation_internal::PerformAction::Params; |
180 scoped_ptr<Params> params(Params::Create(*args_)); | 181 scoped_ptr<Params> params(Params::Create(*args_)); |
181 EXTENSION_FUNCTION_VALIDATE(params.get()); | 182 EXTENSION_FUNCTION_VALIDATE(params.get()); |
182 | 183 |
183 if (params->args.process_id == kDesktopProcessID && | 184 if (params->args.process_id == kDesktopProcessID && |
184 params->args.routing_id == kDesktopRoutingID) { | 185 params->args.routing_id == kDesktopRoutingID) { |
185 #if defined(OS_CHROMEOS) | 186 #if defined(OS_CHROMEOS) |
186 return RouteActionToAdapter( | 187 return RouteActionToAdapter( |
187 params.get(), AutomationManagerAsh::GetInstance()); | 188 params.get(), AutomationManagerAsh::GetInstance()); |
188 #else | 189 #else |
189 NOTREACHED(); | 190 NOTREACHED(); |
190 return RespondNow(Error("Unexpected action on desktop automation tree;" | 191 return RespondNow(Error("Unexpected action on desktop automation tree;" |
191 " platform does not support desktop automation")); | 192 " platform does not support desktop automation")); |
192 #endif // defined(OS_CHROMEOS) | 193 #endif // defined(OS_CHROMEOS) |
193 } | 194 } |
194 content::RenderFrameHost* rfh = | 195 content::RenderWidgetHost* rwh = content::RenderWidgetHost::FromID( |
195 content::RenderFrameHost::FromID(params->args.process_id, | 196 params->args.process_id, params->args.routing_id); |
196 params->args.routing_id); | 197 |
197 if (!rfh) | 198 if (!rwh) |
198 return RespondNow(Error("Ignoring action on destroyed node")); | 199 return RespondNow(Error("Ignoring action on destroyed node")); |
199 | 200 if (rwh->IsRenderView()) { |
200 const content::WebContents* contents = | 201 const content::RenderViewHost* rvh = content::RenderViewHost::From(rwh); |
201 content::WebContents::FromRenderFrameHost(rfh); | 202 const content::WebContents* contents = |
202 if (!CanRequestAutomation(GetExtension(), automation_info, contents)) { | 203 content::WebContents::FromRenderViewHost(rvh); |
203 return RespondNow( | 204 if (!CanRequestAutomation(GetExtension(), automation_info, contents)) { |
204 Error(kCannotRequestAutomationOnPage, contents->GetURL().spec())); | 205 return RespondNow( |
| 206 Error(kCannotRequestAutomationOnPage, contents->GetURL().spec())); |
| 207 } |
205 } | 208 } |
206 | 209 RenderWidgetHostActionAdapter adapter(rwh); |
207 RenderFrameHostActionAdapter adapter(rfh); | |
208 return RouteActionToAdapter(params.get(), &adapter); | 210 return RouteActionToAdapter(params.get(), &adapter); |
209 } | 211 } |
210 | 212 |
211 ExtensionFunction::ResponseAction | 213 ExtensionFunction::ResponseAction |
212 AutomationInternalPerformActionFunction::RouteActionToAdapter( | 214 AutomationInternalPerformActionFunction::RouteActionToAdapter( |
213 api::automation_internal::PerformAction::Params* params, | 215 api::automation_internal::PerformAction::Params* params, |
214 AutomationActionAdapter* adapter) { | 216 AutomationActionAdapter* adapter) { |
215 int32 automation_id = params->args.automation_node_id; | 217 int32 automation_id = params->args.automation_node_id; |
216 switch (params->args.action_type) { | 218 switch (params->args.action_type) { |
217 case api::automation_internal::ACTION_TYPE_DODEFAULT: | 219 case api::automation_internal::ACTION_TYPE_DODEFAULT: |
(...skipping 29 matching lines...) Expand all Loading... |
247 return RespondNow(Error("desktop permission must be requested")); | 249 return RespondNow(Error("desktop permission must be requested")); |
248 | 250 |
249 AutomationManagerAsh::GetInstance()->Enable(browser_context()); | 251 AutomationManagerAsh::GetInstance()->Enable(browser_context()); |
250 return RespondNow(NoArguments()); | 252 return RespondNow(NoArguments()); |
251 #else | 253 #else |
252 return RespondNow(Error("getDesktop is unsupported by this platform")); | 254 return RespondNow(Error("getDesktop is unsupported by this platform")); |
253 #endif // defined(OS_CHROMEOS) | 255 #endif // defined(OS_CHROMEOS) |
254 } | 256 } |
255 | 257 |
256 } // namespace extensions | 258 } // namespace extensions |
OLD | NEW |