OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Custom bindings for the automation API. | 5 // Custom bindings for the automation API. |
6 var AutomationNode = require('automationNode').AutomationNode; | 6 var AutomationNode = require('automationNode').AutomationNode; |
7 var AutomationRootNode = require('automationNode').AutomationRootNode; | 7 var AutomationRootNode = require('automationNode').AutomationRootNode; |
8 var automation = require('binding').Binding.create('automation'); | 8 var automation = require('binding').Binding.create('automation'); |
9 var automationInternal = | 9 var automationInternal = |
10 require('binding').Binding.create('automationInternal').generate(); | 10 require('binding').Binding.create('automationInternal').generate(); |
11 var eventBindings = require('event_bindings'); | 11 var eventBindings = require('event_bindings'); |
12 var Event = eventBindings.Event; | 12 var Event = eventBindings.Event; |
13 var exceptionHandler = require('uncaught_exception_handler'); | 13 var exceptionHandler = require('uncaught_exception_handler'); |
14 var forEach = require('utils').forEach; | 14 var forEach = require('utils').forEach; |
15 var lastError = require('lastError'); | 15 var lastError = require('lastError'); |
16 var logging = requireNative('logging'); | 16 var logging = requireNative('logging'); |
17 var nativeAutomationInternal = requireNative('automationInternal'); | 17 var nativeAutomationInternal = requireNative('automationInternal'); |
18 var GetRoutingID = nativeAutomationInternal.GetRoutingID; | 18 var GetRoutingID = nativeAutomationInternal.GetRoutingID; |
19 var GetSchemaAdditions = nativeAutomationInternal.GetSchemaAdditions; | |
20 var DestroyAccessibilityTree = | 19 var DestroyAccessibilityTree = |
21 nativeAutomationInternal.DestroyAccessibilityTree; | 20 nativeAutomationInternal.DestroyAccessibilityTree; |
22 var GetIntAttribute = nativeAutomationInternal.GetIntAttribute; | 21 var GetIntAttribute = nativeAutomationInternal.GetIntAttribute; |
23 var StartCachingAccessibilityTrees = | 22 var StartCachingAccessibilityTrees = |
24 nativeAutomationInternal.StartCachingAccessibilityTrees; | 23 nativeAutomationInternal.StartCachingAccessibilityTrees; |
25 var AddTreeChangeObserver = nativeAutomationInternal.AddTreeChangeObserver; | 24 var AddTreeChangeObserver = nativeAutomationInternal.AddTreeChangeObserver; |
26 var RemoveTreeChangeObserver = | 25 var RemoveTreeChangeObserver = |
27 nativeAutomationInternal.RemoveTreeChangeObserver; | 26 nativeAutomationInternal.RemoveTreeChangeObserver; |
28 var GetFocusNative = nativeAutomationInternal.GetFocus; | 27 var GetFocusNative = nativeAutomationInternal.GetFocus; |
29 var schema = GetSchemaAdditions(); | |
30 | 28 |
31 /** | 29 /** |
32 * A namespace to export utility functions to other files in automation. | 30 * A namespace to export utility functions to other files in automation. |
33 */ | 31 */ |
34 window.automationUtil = function() {}; | 32 window.automationUtil = function() {}; |
35 | 33 |
36 // TODO(aboxhall): Look into using WeakMap | 34 // TODO(aboxhall): Look into using WeakMap |
37 var idToCallback = {}; | 35 var idToCallback = {}; |
38 | 36 |
39 var DESKTOP_TREE_ID = 0; | 37 var DESKTOP_TREE_ID = 0; |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 // A WebView in the desktop tree has a different AX tree as its child. | 211 // A WebView in the desktop tree has a different AX tree as its child. |
214 // When we encounter a WebView with a child AX tree id that we don't | 212 // When we encounter a WebView with a child AX tree id that we don't |
215 // currently have cached, explicitly request that AX tree from the | 213 // currently have cached, explicitly request that AX tree from the |
216 // browser process and set up a callback when it loads to attach that | 214 // browser process and set up a callback when it loads to attach that |
217 // tree as a child of this node and fire appropriate events. | 215 // tree as a child of this node and fire appropriate events. |
218 var childTreeID = GetIntAttribute(treeID, nodeID, 'childTreeId'); | 216 var childTreeID = GetIntAttribute(treeID, nodeID, 'childTreeId'); |
219 if (!childTreeID) | 217 if (!childTreeID) |
220 return; | 218 return; |
221 | 219 |
222 var subroot = AutomationRootNode.get(childTreeID); | 220 var subroot = AutomationRootNode.get(childTreeID); |
223 if (!subroot || subroot.role == schema.EventType.unknown) { | 221 if (!subroot || subroot.role == 'unknown') { |
224 automationUtil.storeTreeCallback(childTreeID, function(root) { | 222 automationUtil.storeTreeCallback(childTreeID, function(root) { |
225 // Return early if the root has already been attached. | 223 // Return early if the root has already been attached. |
226 if (root.parent) | 224 if (root.parent) |
227 return; | 225 return; |
228 | 226 |
229 privates(root).impl.setHostNode(node); | 227 privates(root).impl.setHostNode(node); |
230 | 228 |
231 if (root.docLoaded) { | 229 if (root.docLoaded) { |
232 privates(root).impl.dispatchEvent( | 230 privates(root).impl.dispatchEvent('loadComplete', 'page'); |
233 schema.EventType.loadComplete, 'page'); | |
234 } | 231 } |
235 | 232 |
236 privates(node).impl.dispatchEvent( | 233 privates(node).impl.dispatchEvent('childrenChanged', 'none'); |
237 schema.EventType.childrenChanged, 'none'); | |
238 }); | 234 }); |
239 | 235 |
240 automationInternal.enableFrame(childTreeID); | 236 automationInternal.enableFrame(childTreeID); |
241 } else { | 237 } else { |
242 privates(subroot).impl.setHostNode(node); | 238 privates(subroot).impl.setHostNode(node); |
243 } | 239 } |
244 }); | 240 }); |
245 | 241 |
246 automationInternal.onTreeChange.addListener(function(observerID, | 242 automationInternal.onTreeChange.addListener(function(observerID, |
247 treeID, | 243 treeID, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 /** | 276 /** |
281 * Dispatch accessibility events fired on individual nodes to its | 277 * Dispatch accessibility events fired on individual nodes to its |
282 * corresponding AutomationNode. Handle focus events specially | 278 * corresponding AutomationNode. Handle focus events specially |
283 * (see below). | 279 * (see below). |
284 */ | 280 */ |
285 automationInternal.onAccessibilityEvent.addListener(function(eventParams) { | 281 automationInternal.onAccessibilityEvent.addListener(function(eventParams) { |
286 var id = eventParams.treeID; | 282 var id = eventParams.treeID; |
287 var targetTree = AutomationRootNode.getOrCreate(id); | 283 var targetTree = AutomationRootNode.getOrCreate(id); |
288 | 284 |
289 var isFocusEvent = false; | 285 var isFocusEvent = false; |
290 if (eventParams.eventType == schema.EventType.focus) { | 286 if (eventParams.eventType == 'focus') { |
291 isFocusEvent = true; | 287 isFocusEvent = true; |
292 } else if (eventParams.eventType == schema.EventType.blur) { | 288 } else if (eventParams.eventType == 'blur') { |
293 // Work around an issue where Chrome sends us 'blur' events on the | 289 // Work around an issue where Chrome sends us 'blur' events on the |
294 // root node when nothing has focus, we need to treat those as focus | 290 // root node when nothing has focus, we need to treat those as focus |
295 // events but otherwise not handle blur events specially. | 291 // events but otherwise not handle blur events specially. |
296 var node = privates(targetTree).impl.get(eventParams.targetID); | 292 var node = privates(targetTree).impl.get(eventParams.targetID); |
297 if (node == node.root) | 293 if (node == node.root) |
298 automationUtil.updateFocusedNodeOnBlur(); | 294 automationUtil.updateFocusedNodeOnBlur(); |
299 } else if (eventParams.eventType == schema.EventType.mediaStartedPlaying || | 295 } else if (eventParams.eventType == 'mediaStartedPlaying' || |
300 eventParams.eventType == schema.EventType.mediaStoppedPlaying) { | 296 eventParams.eventType == 'mediaStoppedPlaying') { |
301 // These events are global to the tree. | 297 // These events are global to the tree. |
302 eventParams.targetID = privates(targetTree).impl.id; | 298 eventParams.targetID = privates(targetTree).impl.id; |
303 } | 299 } |
304 | 300 |
305 // When we get a focus event, ignore the actual event target, and instead | 301 // When we get a focus event, ignore the actual event target, and instead |
306 // check what node has focus globally. If that represents a focus change, | 302 // check what node has focus globally. If that represents a focus change, |
307 // fire a focus event on the correct target. | 303 // fire a focus event on the correct target. |
308 if (isFocusEvent) { | 304 if (isFocusEvent) { |
309 var previousFocusedNode = automationUtil.focusedNode; | 305 var previousFocusedNode = automationUtil.focusedNode; |
310 automationUtil.updateFocusedNode(); | 306 automationUtil.updateFocusedNode(); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 // Destroy the native cache of the accessibility tree. | 354 // Destroy the native cache of the accessibility tree. |
359 DestroyAccessibilityTree(id); | 355 DestroyAccessibilityTree(id); |
360 }); | 356 }); |
361 | 357 |
362 automationInternal.onAccessibilityTreeSerializationError.addListener( | 358 automationInternal.onAccessibilityTreeSerializationError.addListener( |
363 function(id) { | 359 function(id) { |
364 automationInternal.enableFrame(id); | 360 automationInternal.enableFrame(id); |
365 }); | 361 }); |
366 | 362 |
367 var binding = automation.generate(); | 363 var binding = automation.generate(); |
368 // Add additional accessibility bindings not specified in the automation IDL. | |
369 // Accessibility and automation share some APIs (see | |
370 // ui/accessibility/ax_enums.idl). | |
371 forEach(schema, function(k, v) { | |
372 binding[k] = v; | |
373 }); | |
374 | |
375 exports.$set('binding', binding); | 364 exports.$set('binding', binding); |
OLD | NEW |