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

Unified Diff: chrome/browser/extensions/api/automation_internal/automation_internal_api.cc

Issue 667713006: Implement automatic load of composed/embedded automation trees (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lkcr
Patch Set: Fix UAF Created 6 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/automation_internal/automation_internal_api.cc
diff --git a/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc b/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc
index 40e184bbf3b64d5776b523af8abb94ca9feb063d..aa2aa584702966fbdbc3fd9a69f5a1c5a9fd5e98 100644
--- a/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc
+++ b/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc
@@ -7,6 +7,7 @@
#include <vector>
#include "base/strings/string_number_conversions.h"
+#include "chrome/browser/accessibility/ax_tree_id_registry.h"
#include "chrome/browser/extensions/api/automation_internal/automation_action_adapter.h"
#include "chrome/browser/extensions/api/automation_internal/automation_util.h"
#include "chrome/browser/extensions/api/tabs/tabs_constants.h"
@@ -17,6 +18,7 @@
#include "chrome/common/extensions/api/automation_internal.h"
#include "chrome/common/extensions/manifest_handlers/automation.h"
#include "content/public/browser/ax_event_notification_details.h"
+#include "content/public/browser/browser_accessibility_state.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_widget_host.h"
@@ -35,9 +37,7 @@ class AutomationWebContentsObserver;
DEFINE_WEB_CONTENTS_USER_DATA_KEY(extensions::AutomationWebContentsObserver);
namespace {
-const int kDesktopProcessID = 0;
-const int kDesktopRoutingID = 0;
-
+const int kDesktopTreeID = 0;
const char kCannotRequestAutomationOnPage[] =
"Cannot request automation tree on url \"*\". "
"Extension manifest must request permission to access this host.";
@@ -164,10 +164,35 @@ AutomationInternalEnableTabFunction::Run() {
}
AutomationWebContentsObserver::CreateForWebContents(contents);
contents->EnableTreeOnlyAccessibilityMode();
- return RespondNow(
- ArgumentList(api::automation_internal::EnableTab::Results::Create(
- rfh->GetProcess()->GetID(), rfh->GetRoutingID())));
- }
+ int ax_tree_id = AXTreeIDRegistry::GetInstance()->GetOrCreateAXTreeID(
+ rfh->GetProcess()->GetID(), rfh->GetRoutingID());
+ return RespondNow(ArgumentList(
+ api::automation_internal::EnableTab::Results::Create(ax_tree_id)));
+}
+
+ExtensionFunction::ResponseAction AutomationInternalEnableFrameFunction::Run() {
+// TODO(dtseng): Limited to desktop tree for now pending out of proc iframes.
+#if defined(OS_CHROMEOS)
+ using api::automation_internal::EnableFrame::Params;
+
+ scoped_ptr<Params> params(Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+ AXTreeIDRegistry::FrameID frame_id =
+ AXTreeIDRegistry::GetInstance()->GetFrameID(params->tree_id);
+ content::RenderFrameHost* rfh =
+ content::RenderFrameHost::FromID(frame_id.first, frame_id.second);
+ if (!rfh)
+ return RespondNow(Error("unable to load tab"));
+
+ content::WebContents* contents =
+ content::WebContents::FromRenderFrameHost(rfh);
+ AutomationWebContentsObserver::CreateForWebContents(contents);
+ contents->EnableTreeOnlyAccessibilityMode();
+
+ return RespondNow(NoArguments());
+#endif
+ return RespondNow(Error("enableFrame is only supported on Chrome OS"));
+}
ExtensionFunction::ResponseAction
AutomationInternalPerformActionFunction::Run() {
@@ -178,8 +203,7 @@ AutomationInternalPerformActionFunction::Run() {
scoped_ptr<Params> params(Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
- if (params->args.process_id == kDesktopProcessID &&
- params->args.routing_id == kDesktopRoutingID) {
+ if (params->args.tree_id == kDesktopTreeID) {
#if defined(OS_CHROMEOS)
return RouteActionToAdapter(
params.get(), AutomationManagerAsh::GetInstance());
@@ -189,9 +213,10 @@ AutomationInternalPerformActionFunction::Run() {
" platform does not support desktop automation"));
#endif // defined(OS_CHROMEOS)
}
+ AXTreeIDRegistry::FrameID frame_id =
+ AXTreeIDRegistry::GetInstance()->GetFrameID(params->args.tree_id);
content::RenderFrameHost* rfh =
- content::RenderFrameHost::FromID(params->args.process_id,
- params->args.routing_id);
+ content::RenderFrameHost::FromID(frame_id.first, frame_id.second);
if (!rfh)
return RespondNow(Error("Ignoring action on destroyed node"));

Powered by Google App Engine
This is Rietveld 408576698