| 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 |