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 5f2e8c862a18f3231547b456665f47539d5e59b7..58efba5f7592f7e215f84d71488abb3f54384211 100644 |
--- a/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc |
+++ b/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc |
@@ -12,7 +12,6 @@ |
#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_event_router.h" |
-#include "chrome/browser/extensions/api/automation_internal/automation_util.h" |
#include "chrome/browser/extensions/api/tabs/tabs_constants.h" |
#include "chrome/browser/extensions/extension_tab_util.h" |
#include "chrome/browser/profiles/profile.h" |
@@ -23,12 +22,16 @@ |
#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/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/render_view_host.h" |
#include "content/public/browser/render_widget_host.h" |
#include "content/public/browser/render_widget_host_view.h" |
#include "content/public/browser/web_contents.h" |
+#include "content/public/browser/web_contents_observer.h" |
+#include "content/public/browser/web_contents_user_data.h" |
#include "extensions/common/extension_messages.h" |
#include "extensions/common/permissions/permissions_data.h" |
@@ -45,6 +48,7 @@ DEFINE_WEB_CONTENTS_USER_DATA_KEY(extensions::AutomationWebContentsObserver); |
namespace extensions { |
namespace { |
+ |
const int kDesktopTreeID = 0; |
const char kCannotRequestAutomationOnPage[] = |
"Cannot request automation tree on url \"*\". " |
@@ -193,24 +197,66 @@ class AutomationWebContentsObserver |
void AccessibilityEventReceived( |
const std::vector<content::AXEventNotificationDetails>& details) |
override { |
- automation_util::DispatchAccessibilityEventsToAutomation( |
- details, browser_context_, |
- web_contents()->GetContainerBounds().OffsetFromOrigin()); |
+ std::vector<content::AXEventNotificationDetails>::const_iterator iter = |
+ details.begin(); |
+ for (; iter != details.end(); ++iter) { |
+ const content::AXEventNotificationDetails& event = *iter; |
+ int tree_id = AXTreeIDRegistry::GetInstance()->GetOrCreateAXTreeID( |
+ event.process_id, event.routing_id); |
+ ExtensionMsg_AccessibilityEventParams params; |
+ params.tree_id = tree_id; |
+ params.id = event.id; |
+ params.event_type = event.event_type; |
+ params.update.node_id_to_clear = event.node_id_to_clear; |
+ params.update.nodes = event.nodes; |
+ params.location_offset = |
+ web_contents()->GetContainerBounds().OffsetFromOrigin(); |
+ |
+ for (size_t i = 0; i < params.update.nodes.size(); ++i) { |
+ ui::AXNodeData& node = params.update.nodes[i]; |
+ if (node.HasBoolAttribute(ui::AX_ATTR_IS_AX_TREE_HOST)) { |
+ const auto& iter = event.node_to_browser_plugin_instance_id_map.find( |
+ node.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()); |
+ node.AddIntAttribute(ui::AX_ATTR_CHILD_TREE_ID, guest_tree_id); |
+ } |
+ } |
+ } |
+ } |
+ |
+ AutomationEventRouter* router = AutomationEventRouter::GetInstance(); |
+ router->DispatchAccessibilityEvent(params); |
+ } |
} |
void RenderFrameDeleted( |
content::RenderFrameHost* render_frame_host) override { |
- automation_util::DispatchTreeDestroyedEventToAutomation( |
+ int tree_id = AXTreeIDRegistry::GetInstance()->GetOrCreateAXTreeID( |
render_frame_host->GetProcess()->GetID(), |
- render_frame_host->GetRoutingID(), |
+ render_frame_host->GetRoutingID()); |
+ AXTreeIDRegistry::GetInstance()->RemoveAXTreeID(tree_id); |
+ AutomationEventRouter::GetInstance()->DispatchTreeDestroyedEvent( |
+ tree_id, |
browser_context_); |
} |
private: |
friend class content::WebContentsUserData<AutomationWebContentsObserver>; |
- AutomationWebContentsObserver( |
- content::WebContents* web_contents) |
+ explicit AutomationWebContentsObserver(content::WebContents* web_contents) |
: content::WebContentsObserver(web_contents), |
browser_context_(web_contents->GetBrowserContext()) {} |
@@ -245,6 +291,7 @@ AutomationInternalEnableTabFunction::Run() { |
if (!contents) |
return RespondNow(Error("No active tab")); |
} |
+ |
content::RenderFrameHost* rfh = contents->GetMainFrame(); |
if (!rfh) |
return RespondNow(Error("Could not enable accessibility for active tab")); |
@@ -256,6 +303,7 @@ AutomationInternalEnableTabFunction::Run() { |
AutomationWebContentsObserver::CreateForWebContents(contents); |
contents->EnableTreeOnlyAccessibilityMode(); |
+ |
int ax_tree_id = AXTreeIDRegistry::GetInstance()->GetOrCreateAXTreeID( |
rfh->GetProcess()->GetID(), rfh->GetRoutingID()); |
@@ -270,11 +318,12 @@ AutomationInternalEnableTabFunction::Run() { |
} |
ExtensionFunction::ResponseAction AutomationInternalEnableFrameFunction::Run() { |
-// TODO(dtseng): Limited to desktop tree for now pending out of proc iframes. |
+ // TODO(dtseng): Limited to desktop tree for now pending out of proc iframes. |
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 = |