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" |
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 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 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 Loading... |
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 |
OLD | NEW |