OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 /** | 5 /** |
6 * @fileoverview Basic facillities to handle events from a single automation | 6 * @fileoverview Basic facillities to handle events from a single automation |
7 * node. | 7 * node. |
8 */ | 8 */ |
9 | 9 |
10 goog.provide('BaseAutomationHandler'); | 10 goog.provide('BaseAutomationHandler'); |
11 | 11 |
12 goog.scope(function() { | 12 goog.scope(function() { |
13 var AutomationEvent = chrome.automation.AutomationEvent; | 13 var AutomationEvent = chrome.automation.AutomationEvent; |
14 var AutomationNode = chrome.automation.AutomationNode; | 14 var AutomationNode = chrome.automation.AutomationNode; |
15 var EventType = chrome.automation.EventType; | 15 var EventType = chrome.automation.EventType; |
16 | 16 |
17 /** | 17 /** |
18 * @param {!AutomationNode} node | 18 * @param {!AutomationNode} node |
19 * @constructor | 19 * @constructor |
20 */ | 20 */ |
21 BaseAutomationHandler = function(node) { | 21 BaseAutomationHandler = function(node) { |
22 /** | 22 /** |
23 * @type {!AutomationNode} | 23 * @type {!AutomationNode} |
24 */ | 24 */ |
25 this.node_ = node; | 25 this.node_ = node; |
26 | 26 |
27 /** | 27 /** @type {!Object<EventType, function(!AutomationEvent): void>} @private */ |
28 * Maps an automation event to its listener. | |
29 * @type {!Object<EventType, function(!AutomationEvent) : void>} | |
30 */ | |
31 this.listenerMap_ = { | |
32 alert: this.onAlert, | |
33 ariaAttributeChanged: this.onEventIfInRange, | |
34 checkedStateChanged: this.onEventIfInRange, | |
35 focus: this.onFocus, | |
36 hover: this.onEventWithFlushedOutput, | |
37 loadComplete: this.onLoadComplete, | |
38 menuListItemSelected: this.onEventDefault, | |
39 menuStart: this.onMenuStart, | |
40 menuEnd: this.onMenuEnd, | |
41 scrollPositionChanged: this.onScrollPositionChanged, | |
42 selection: this.onEventWithFlushedOutput, | |
43 textChanged: this.onTextChanged, | |
44 textSelectionChanged: this.onTextSelectionChanged, | |
45 valueChanged: this.onValueChanged | |
46 }; | |
47 | |
48 /** @type {!Object<string, function(!AutomationEvent): void>} @private */ | |
49 this.listeners_ = {}; | 28 this.listeners_ = {}; |
50 | |
51 this.register_(); | |
52 }; | 29 }; |
53 | 30 |
54 BaseAutomationHandler.prototype = { | 31 BaseAutomationHandler.prototype = { |
55 /** | 32 /** |
56 * Registers event listeners. Can be called repeatedly without duplicate | 33 * Adds an event listener to this handler. |
57 * listeners. | 34 * @param {chrome.automation.EventType} eventType |
58 * @private | 35 * @param {!function(!AutomationEvent): void} eventCallback |
| 36 * @protected |
59 */ | 37 */ |
60 register_: function() { | 38 addListener_: function(eventType, eventCallback) { |
61 for (var eventType in this.listenerMap_) { | 39 if (this.listeners_[eventType]) |
62 var listener = | 40 throw 'Listener already added: ' + eventType; |
63 this.makeListener_(this.listenerMap_[eventType].bind(this)); | 41 |
64 this.node_.addEventListener(eventType, listener, true); | 42 var listener = this.makeListener_(eventCallback.bind(this)); |
65 this.listeners_[eventType] = listener; | 43 this.node_.addEventListener(eventType, listener, true); |
66 } | 44 this.listeners_[eventType] = listener; |
67 }, | 45 }, |
68 | 46 |
69 /** | 47 /** |
70 * Unregisters listeners. | 48 * Removes all listeners from this handler. |
71 */ | 49 */ |
72 unregister: function() { | 50 removeAllListeners: function() { |
73 for (var eventType in this.listenerMap_) { | 51 for (var eventType in this.listeners_) { |
74 this.node_.removeEventListener( | 52 this.node_.removeEventListener( |
75 eventType, this.listeners_[eventType], true); | 53 eventType, this.listeners_[eventType], true); |
76 } | 54 } |
77 }, | 55 }, |
78 | 56 |
79 /** | 57 /** |
80 * @return {!function(!AutomationEvent): void} | 58 * @return {!function(!AutomationEvent): void} |
81 * @private | 59 * @private |
82 */ | 60 */ |
83 makeListener_: function(callback) { | 61 makeListener_: function(callback) { |
(...skipping 12 matching lines...) Expand all Loading... |
96 */ | 74 */ |
97 willHandleEvent_: function(evt) { | 75 willHandleEvent_: function(evt) { |
98 return false; | 76 return false; |
99 }, | 77 }, |
100 | 78 |
101 /** | 79 /** |
102 * Called after the event |evt| is handled. | 80 * Called after the event |evt| is handled. |
103 * @protected | 81 * @protected |
104 */ | 82 */ |
105 didHandleEvent_: function(evt) { | 83 didHandleEvent_: function(evt) { |
106 }, | 84 } |
107 | |
108 /** | |
109 * @param {!AutomationEvent} evt | |
110 */ | |
111 onAlert: function(evt) {}, | |
112 | |
113 /** | |
114 * @param {!AutomationEvent} evt | |
115 */ | |
116 onFocus: function(evt) {}, | |
117 | |
118 /** | |
119 * @param {!AutomationEvent} evt | |
120 */ | |
121 onLoadComplete: function(evt) {}, | |
122 | |
123 /** | |
124 * @param {!AutomationEvent} evt | |
125 */ | |
126 onEventDefault: function(evt) {}, | |
127 | |
128 /** | |
129 * @param {!AutomationEvent} evt | |
130 */ | |
131 onEventIfInRange: function(evt) { | |
132 // TODO(dtseng): Consider the end of the current range as well. | |
133 if (AutomationUtil.isDescendantOf( | |
134 global.backgroundObj.currentRange.start.node, evt.target) || | |
135 evt.target.state.focused) | |
136 this.onEventDefault(evt); | |
137 }, | |
138 | |
139 /** | |
140 * @param {!AutomationEvent} evt | |
141 */ | |
142 onEventWithFlushedOutput: function(evt) { | |
143 Output.flushNextSpeechUtterance(); | |
144 this.onEventDefault(evt); | |
145 }, | |
146 | |
147 /** | |
148 * @param {!AutomationEvent} evt | |
149 */ | |
150 onMenuStart: function(evt) {}, | |
151 | |
152 /** | |
153 * @param {!AutomationEvent} evt | |
154 */ | |
155 onMenuEnd: function(evt) {}, | |
156 | |
157 /** | |
158 * @param {!AutomationEvent} evt | |
159 */ | |
160 onScrollPositionChanged: function(evt) {}, | |
161 | |
162 /** | |
163 * @param {!AutomationEvent} evt | |
164 */ | |
165 onTextChanged: function(evt) {}, | |
166 | |
167 /** | |
168 * @param {!AutomationEvent} evt | |
169 */ | |
170 onTextSelectionChanged: function(evt) {}, | |
171 | |
172 /** | |
173 * @param {!AutomationEvent} evt | |
174 */ | |
175 onValueChanged: function(evt) {} | |
176 }; | 85 }; |
177 | 86 |
178 }); // goog.scope | 87 }); // goog.scope |
OLD | NEW |