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..9336e05da8d0b196203fa9f29ce22b9193f46061 100644 |
--- a/chrome/renderer/resources/extensions/automation_custom_bindings.js |
+++ b/chrome/renderer/resources/extensions/automation_custom_bindings.js |
@@ -15,21 +15,40 @@ 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 = {}; |
+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) { |
+automationUtil.createAutomationRootNodeID = function(pid, rid) { |
return pid + '_' + rid; |
}; |
-var DESKTOP_TREE_ID = createAutomationRootNodeID(0, 0); |
+automationUtil.DESKTOP_TREE_ID = |
+ automationUtil.createAutomationRootNodeID(0, 0); |
+ |
+automationUtil.onTreeLoaded = function(pid, rid, callback) { |
+ var id = automationUtil.createAutomationRootNodeID(pid, rid); |
+ 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; |
@@ -38,7 +57,7 @@ automation.registerCustomHook(function(bindingsAPI) { |
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 |
+ // 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 |
@@ -48,35 +67,24 @@ automation.registerCustomHook(function(bindingsAPI) { |
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.onTreeLoaded(pid, rid, 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; |
} |
@@ -93,14 +101,14 @@ automation.registerCustomHook(function(bindingsAPI) { |
automationInternal.onAccessibilityEvent.addListener(function(data) { |
var pid = data.processID; |
var rid = data.routingID; |
- var id = createAutomationRootNodeID(pid, rid); |
- var targetTree = idToAutomationRootNode[id]; |
+ var id = automationUtil.createAutomationRootNodeID(pid, rid); |
+ 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; |
+ automationUtil.idToAutomationRootNode[id] = targetTree; |
} |
if (!privates(targetTree).impl.onAccessibilityEvent(data)) |
return; |
@@ -113,7 +121,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; |
} |
@@ -130,15 +138,15 @@ automationInternal.onAccessibilityEvent.addListener(function(data) { |
}); |
automationInternal.onAccessibilityTreeDestroyed.addListener(function(pid, rid) { |
- var id = createAutomationRootNodeID(pid, rid); |
- var targetTree = idToAutomationRootNode[id]; |
+ var id = automationUtil.createAutomationRootNodeID(pid, rid); |
+ 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(); |