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..123053625ec12ec38898137744073738d8caf7f1 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() {}; |
aboxhall
2014/11/03 17:15:49
I'm really not sure about the implications of this
David Tseng
2014/11/03 19:31:53
kalman can probably better comment, but window is
|
+ |
// TODO(aboxhall): Look into using WeakMap |
-var idToAutomationRootNode = {}; |
+automationUtil.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; |
-}; |
+automationUtil.DESKTOP_TREE_ID = 0; |
aboxhall
2014/11/03 17:15:49
Why does DESKTOP_TREE_ID need to be on automationU
David Tseng
2014/11/03 19:31:53
Removed.
|
+ |
+automationUtil.storeTreeCallback = function(id, callback) { |
+ if (!callback) |
+ return; |
-var DESKTOP_TREE_ID = createAutomationRootNodeID(0, 0); |
+ var targetTree = automationUtil.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,46 +49,37 @@ 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 automationUtil.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 = |
+ automationUtil.idToAutomationRootNode[automationUtil.DESKTOP_TREE_ID]; |
if (!desktopTree) { |
- if (DESKTOP_TREE_ID in idToCallback) |
- idToCallback[DESKTOP_TREE_ID].push(callback); |
+ if (automationUtil.DESKTOP_TREE_ID in idToCallback) |
+ idToCallback[automationUtil.DESKTOP_TREE_ID].push(callback); |
else |
- idToCallback[DESKTOP_TREE_ID] = [callback]; |
+ idToCallback[automationUtil.DESKTOP_TREE_ID] = [callback]; |
// TODO(dtseng): Disable desktop tree once desktop object goes out of |
// scope. |
automationInternal.enableDesktop(function() { |
if (lastError.hasError(chrome)) { |
- delete idToAutomationRootNode[DESKTOP_TREE_ID]; |
+ delete automationUtil.idToAutomationRootNode[ |
+ automationUtil.DESKTOP_TREE_ID]; |
callback(); |
return; |
} |
@@ -91,16 +94,14 @@ 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 targetTree = idToAutomationRootNode[id]; |
+ var id = data.treeID; |
+ var targetTree = automationUtil.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); |
- idToAutomationRootNode[id] = targetTree; |
+ targetTree = new AutomationRootNode(id); |
+ automationUtil.idToAutomationRootNode[id] = targetTree; |
} |
if (!privates(targetTree).impl.onAccessibilityEvent(data)) |
return; |
@@ -113,7 +114,7 @@ automationInternal.onAccessibilityEvent.addListener(function(data) { |
// attribute or child nodes. If we've got that, wait for the full tree before |
// calling the callback. |
// TODO(dmazzoni): Don't send down placeholder (crbug.com/397553) |
- if (id != DESKTOP_TREE_ID && !targetTree.attributes.url && |
+ if (id != automationUtil.DESKTOP_TREE_ID && !targetTree.attributes.url && |
targetTree.children.length == 0) { |
return; |
} |
@@ -129,16 +130,15 @@ automationInternal.onAccessibilityEvent.addListener(function(data) { |
delete idToCallback[id]; |
}); |
-automationInternal.onAccessibilityTreeDestroyed.addListener(function(pid, rid) { |
- var id = createAutomationRootNodeID(pid, rid); |
- var targetTree = idToAutomationRootNode[id]; |
+automationInternal.onAccessibilityTreeDestroyed.addListener(function(id) { |
+ var targetTree = automationUtil.idToAutomationRootNode[id]; |
if (targetTree) { |
privates(targetTree).impl.destroy(); |
- delete idToAutomationRootNode[id]; |
+ delete automationUtil.idToAutomationRootNode[id]; |
} else { |
logging.WARNING('no targetTree to destroy'); |
} |
- delete idToAutomationRootNode[id]; |
+ delete automationUtil.idToAutomationRootNode[id]; |
}); |
exports.binding = automation.generate(); |