| Index: chrome/renderer/resources/extensions/automation_custom_bindings.js
|
| diff --git a/chrome/renderer/resources/extensions/automation_custom_bindings.js b/chrome/renderer/resources/extensions/automation_custom_bindings.js
|
| index 7a7878dcd1de51510d7e756abb7627c28ff3ec52..a23cdca5b4d95d63abf88370c75e6eccb5ddb0fb 100644
|
| --- a/chrome/renderer/resources/extensions/automation_custom_bindings.js
|
| +++ b/chrome/renderer/resources/extensions/automation_custom_bindings.js
|
| @@ -15,21 +15,33 @@ var lastError = require('lastError');
|
| var logging = requireNative('logging');
|
| var schema = requireNative('automationInternal').GetSchemaAdditions();
|
|
|
| +/**
|
| + * A namespace to export utility functions to other files in automation.
|
| + */
|
| +window.automationUtil = function() {};
|
| +
|
| // TODO(aboxhall): Look into using WeakMap
|
| var idToAutomationRootNode = {};
|
| var idToCallback = {};
|
|
|
| -// TODO(dtseng): Move out to automation/automation_util.js or as a static member
|
| -// of AutomationRootNode to keep this file clean.
|
| -/*
|
| - * Creates an id associated with a particular AutomationRootNode based upon a
|
| - * renderer/renderer host pair's process and routing id.
|
| - */
|
| -var createAutomationRootNodeID = function(pid, rid) {
|
| - return pid + '_' + rid;
|
| -};
|
| +var DESKTOP_TREE_ID = 0;
|
|
|
| -var DESKTOP_TREE_ID = createAutomationRootNodeID(0, 0);
|
| +automationUtil.storeTreeCallback = function(id, callback) {
|
| + if (!callback)
|
| + return;
|
| +
|
| + var targetTree = idToAutomationRootNode[id];
|
| + if (!targetTree) {
|
| + // If we haven't cached the tree, hold the callback until the tree is
|
| + // populated by the initial onAccessibilityEvent call.
|
| + if (id in idToCallback)
|
| + idToCallback[id].push(callback);
|
| + else
|
| + idToCallback[id] = [callback];
|
| + } else {
|
| + callback(targetTree);
|
| + }
|
| +};
|
|
|
| automation.registerCustomHook(function(bindingsAPI) {
|
| var apiFunctions = bindingsAPI.apiFunctions;
|
| @@ -37,35 +49,25 @@ automation.registerCustomHook(function(bindingsAPI) {
|
| // TODO(aboxhall, dtseng): Make this return the speced AutomationRootNode obj.
|
| apiFunctions.setHandleRequest('getTree', function getTree(tabId, callback) {
|
| // enableTab() ensures the renderer for the active or specified tab has
|
| - // accessibility enabled, and fetches its process and routing ids to use as
|
| - // a key in the idToAutomationRootNode map. The callback to enableTab is is
|
| - // bound to the callback passed in to getTree(), so that once the tree is
|
| - // available (either due to having been cached earlier, or after an
|
| - // accessibility event occurs which causes the tree to be populated), the
|
| + // accessibility enabled, and fetches its ax tree id to use as
|
| + // a key in the idToAutomationRootNode map. The callback to
|
| + // enableTab is bound to the callback passed in to getTree(), so that once
|
| + // the tree is available (either due to having been cached earlier, or after
|
| + // an accessibility event occurs which causes the tree to be populated), the
|
| // callback can be called.
|
| - automationInternal.enableTab(tabId, function onEnable(pid, rid) {
|
| + automationInternal.enableTab(tabId, function onEnable(id) {
|
| if (lastError.hasError(chrome)) {
|
| callback();
|
| return;
|
| }
|
| - var id = createAutomationRootNodeID(pid, rid);
|
| - var targetTree = idToAutomationRootNode[id];
|
| - if (!targetTree) {
|
| - // If we haven't cached the tree, hold the callback until the tree is
|
| - // populated by the initial onAccessibilityEvent call.
|
| - if (id in idToCallback)
|
| - idToCallback[id].push(callback);
|
| - else
|
| - idToCallback[id] = [callback];
|
| - } else {
|
| - callback(targetTree);
|
| - }
|
| + automationUtil.storeTreeCallback(id, callback);
|
| });
|
| });
|
|
|
| var desktopTree = null;
|
| apiFunctions.setHandleRequest('getDesktop', function(callback) {
|
| - desktopTree = idToAutomationRootNode[DESKTOP_TREE_ID];
|
| + desktopTree =
|
| + idToAutomationRootNode[DESKTOP_TREE_ID];
|
| if (!desktopTree) {
|
| if (DESKTOP_TREE_ID in idToCallback)
|
| idToCallback[DESKTOP_TREE_ID].push(callback);
|
| @@ -76,7 +78,8 @@ automation.registerCustomHook(function(bindingsAPI) {
|
| // scope.
|
| automationInternal.enableDesktop(function() {
|
| if (lastError.hasError(chrome)) {
|
| - delete idToAutomationRootNode[DESKTOP_TREE_ID];
|
| + delete idToAutomationRootNode[
|
| + DESKTOP_TREE_ID];
|
| callback();
|
| return;
|
| }
|
| @@ -91,15 +94,13 @@ automation.registerCustomHook(function(bindingsAPI) {
|
| // essentially a proxy for the AccessibilityHostMsg_Events IPC from the
|
| // renderer.
|
| automationInternal.onAccessibilityEvent.addListener(function(data) {
|
| - var pid = data.processID;
|
| - var rid = data.routingID;
|
| - var id = createAutomationRootNodeID(pid, rid);
|
| + var id = data.treeID;
|
| var targetTree = idToAutomationRootNode[id];
|
| if (!targetTree) {
|
| // If this is the first time we've gotten data for this tree, it will
|
| // contain all of the tree's data, so create a new tree which will be
|
| // bootstrapped from |data|.
|
| - targetTree = new AutomationRootNode(pid, rid);
|
| + targetTree = new AutomationRootNode(id);
|
| idToAutomationRootNode[id] = targetTree;
|
| }
|
| if (!privates(targetTree).impl.onAccessibilityEvent(data))
|
| @@ -129,8 +130,7 @@ automationInternal.onAccessibilityEvent.addListener(function(data) {
|
| delete idToCallback[id];
|
| });
|
|
|
| -automationInternal.onAccessibilityTreeDestroyed.addListener(function(pid, rid) {
|
| - var id = createAutomationRootNodeID(pid, rid);
|
| +automationInternal.onAccessibilityTreeDestroyed.addListener(function(id) {
|
| var targetTree = idToAutomationRootNode[id];
|
| if (targetTree) {
|
| privates(targetTree).impl.destroy();
|
|
|