Commit 73e2f915 authored by dmazzoni's avatar dmazzoni Committed by Commit bot

Give automation API access to browser plugin objects.

BUG=488693

Review URL: https://codereview.chromium.org/1232643003

Cr-Commit-Position: refs/heads/master@{#339698}
parent f3ee5185
...@@ -278,6 +278,7 @@ class TreeSerializationState { ...@@ -278,6 +278,7 @@ class TreeSerializationState {
update.nodes, update.nodes,
event, event,
node_id, node_id,
std::map<int32, int>(),
kPid, kPid,
routing_id); routing_id);
std::vector<content::AXEventNotificationDetails> details; std::vector<content::AXEventNotificationDetails> details;
......
...@@ -10,6 +10,11 @@ ...@@ -10,6 +10,11 @@
#include "base/values.h" #include "base/values.h"
#include "chrome/browser/accessibility/ax_tree_id_registry.h" #include "chrome/browser/accessibility/ax_tree_id_registry.h"
#include "chrome/common/extensions/api/automation_internal.h" #include "chrome/common/extensions/api/automation_internal.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_plugin_guest_manager.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_contents.h"
#include "extensions/browser/event_router.h" #include "extensions/browser/event_router.h"
#include "ui/accessibility/ax_enums.h" #include "ui/accessibility/ax_enums.h"
#include "ui/accessibility/ax_node_data.h" #include "ui/accessibility/ax_node_data.h"
...@@ -152,6 +157,29 @@ void DispatchAccessibilityEventsToAutomation( ...@@ -152,6 +157,29 @@ void DispatchAccessibilityEventsToAutomation(
linked_ptr<api::automation_internal::AXNodeData> out_node( linked_ptr<api::automation_internal::AXNodeData> out_node(
new api::automation_internal::AXNodeData()); new api::automation_internal::AXNodeData());
PopulateNodeData(src, out_node); PopulateNodeData(src, out_node);
if (src.HasBoolAttribute(ui::AX_ATTR_IS_AX_TREE_HOST)) {
const auto& iter = event.node_to_browser_plugin_instance_id_map.find(
src.id);
if (iter != event.node_to_browser_plugin_instance_id_map.end()) {
int instance_id = iter->second;
content::BrowserPluginGuestManager* guest_manager =
browser_context->GetGuestManager();
content::WebContents* guest_web_contents =
guest_manager->GetGuestByInstanceID(event.process_id,
instance_id);
if (guest_web_contents) {
content::RenderFrameHost* guest_rfh =
guest_web_contents->GetMainFrame();
int guest_tree_id =
AXTreeIDRegistry::GetInstance()->GetOrCreateAXTreeID(
guest_rfh->GetProcess()->GetID(),
guest_rfh->GetRoutingID());
out_node->int_attributes->additional_properties.SetInteger(
ToString(ui::AX_ATTR_CHILD_TREE_ID),
guest_tree_id);
}
}
}
ax_tree_update.nodes.push_back(out_node); ax_tree_update.nodes.push_back(out_node);
} }
......
...@@ -140,6 +140,7 @@ void AutomationManagerAura::SendEvent(BrowserContext* context, ...@@ -140,6 +140,7 @@ void AutomationManagerAura::SendEvent(BrowserContext* context,
// TODO(dtseng): Would idealy define these special desktop constants in idl. // TODO(dtseng): Would idealy define these special desktop constants in idl.
content::AXEventNotificationDetails detail( content::AXEventNotificationDetails detail(
update.node_id_to_clear, update.nodes, event_type, aura_obj->GetID(), update.node_id_to_clear, update.nodes, event_type, aura_obj->GetID(),
std::map<int32, int>(),
0, /* process_id */ 0, /* process_id */
0 /* routing_id */); 0 /* routing_id */);
std::vector<content::AXEventNotificationDetails> details; std::vector<content::AXEventNotificationDetails> details;
......
...@@ -779,7 +779,8 @@ AutomationRootNodeImpl.prototype = { ...@@ -779,7 +779,8 @@ AutomationRootNodeImpl.prototype = {
var nodeImpl = privates(node).impl; var nodeImpl = privates(node).impl;
// TODO(dtseng): Make into set listing all hosting node roles. // TODO(dtseng): Make into set listing all hosting node roles.
if (nodeData.role == schema.RoleType.webView) { if (nodeData.role == schema.RoleType.webView ||
nodeData.role == schema.RoleType.embeddedObject) {
if (nodeImpl.childTreeID !== nodeData.intAttributes.childTreeId) if (nodeImpl.childTreeID !== nodeData.intAttributes.childTreeId)
nodeImpl.pendingChildFrame = true; nodeImpl.pendingChildFrame = true;
......
...@@ -1374,12 +1374,14 @@ void RenderFrameHostImpl::OnAccessibilityEvents( ...@@ -1374,12 +1374,14 @@ void RenderFrameHostImpl::OnAccessibilityEvents(
details.reserve(params.size()); details.reserve(params.size());
for (size_t i = 0; i < params.size(); ++i) { for (size_t i = 0; i < params.size(); ++i) {
const AccessibilityHostMsg_EventParams& param = params[i]; const AccessibilityHostMsg_EventParams& param = params[i];
AXEventNotificationDetails detail(param.update.node_id_to_clear, AXEventNotificationDetails detail(
param.update.nodes, param.update.node_id_to_clear,
param.event_type, param.update.nodes,
param.id, param.event_type,
GetProcess()->GetID(), param.id,
routing_id_); param.node_to_browser_plugin_instance_id_map,
GetProcess()->GetID(),
routing_id_);
details.push_back(detail); details.push_back(detail);
} }
......
...@@ -11,12 +11,15 @@ AXEventNotificationDetails::AXEventNotificationDetails( ...@@ -11,12 +11,15 @@ AXEventNotificationDetails::AXEventNotificationDetails(
const std::vector<ui::AXNodeData>& nodes, const std::vector<ui::AXNodeData>& nodes,
ui::AXEvent event_type, ui::AXEvent event_type,
int id, int id,
std::map<int32, int> node_to_browser_plugin_instance_id_map,
int process_id, int process_id,
int routing_id) int routing_id)
: node_id_to_clear(node_id_to_clear), : node_id_to_clear(node_id_to_clear),
nodes(nodes), nodes(nodes),
event_type(event_type), event_type(event_type),
id(id), id(id),
node_to_browser_plugin_instance_id_map(
node_to_browser_plugin_instance_id_map),
process_id(process_id), process_id(process_id),
routing_id(routing_id) { routing_id(routing_id) {
} }
......
...@@ -17,12 +17,14 @@ namespace content { ...@@ -17,12 +17,14 @@ namespace content {
// |WebContentsObserver::AccessibilityEventReceived| method. // |WebContentsObserver::AccessibilityEventReceived| method.
struct CONTENT_EXPORT AXEventNotificationDetails { struct CONTENT_EXPORT AXEventNotificationDetails {
public: public:
AXEventNotificationDetails(int node_id_to_clear, AXEventNotificationDetails(
const std::vector<ui::AXNodeData>& nodes, int node_id_to_clear,
ui::AXEvent event_type, const std::vector<ui::AXNodeData>& nodes,
int id, ui::AXEvent event_type,
int process_id, int id,
int routing_id); std::map<int32, int> node_to_browser_plugin_instance_id_map,
int process_id,
int routing_id);
~AXEventNotificationDetails(); ~AXEventNotificationDetails();
...@@ -30,6 +32,7 @@ struct CONTENT_EXPORT AXEventNotificationDetails { ...@@ -30,6 +32,7 @@ struct CONTENT_EXPORT AXEventNotificationDetails {
std::vector<ui::AXNodeData> nodes; std::vector<ui::AXNodeData> nodes;
ui::AXEvent event_type; ui::AXEvent event_type;
int id; int id;
std::map<int32, int> node_to_browser_plugin_instance_id_map;
int process_id; int process_id;
int routing_id; int routing_id;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment