@@ -81,6 +81,13 @@ goog.events.EventTarget = function() {
81
81
* @private {!Object}
82
82
*/
83
83
this . actualEventTarget_ = this ;
84
+
85
+ /**
86
+ * If true, when mixing in, avoid calling fireListeners on
87
+ * the alternate target, call it on this instance
88
+ * @private {boolean}
89
+ */
90
+ this . alwaysFireLocal_ = false ;
84
91
85
92
/**
86
93
* Parent event target, used during event bubbling.
@@ -192,9 +199,10 @@ goog.events.EventTarget.prototype.dispatchEvent = function(e) {
192
199
'infinite loop' ) ;
193
200
}
194
201
}
195
-
196
- return goog . events . EventTarget . dispatchEventInternal_ (
197
- this . actualEventTarget_ , e , ancestorsTree ) ;
202
+ var actualTarget = this . actualEventTarget_ ;
203
+ var eventTarget = this . alwaysFireLocal_ ? this : actualTarget ;
204
+ return goog . events . EventTarget . dispatchEventInternal_ (
205
+ actualTarget , eventTarget , e , ancestorsTree ) ;
198
206
} ;
199
207
200
208
@@ -316,9 +324,11 @@ goog.events.EventTarget.prototype.hasListener = function(
316
324
* event. Mainly used for testing. For example, see
317
325
* {@code goog.testing.events.mixinListenable}.
318
326
* @param {!Object } target The target.
327
+ * @param {boolean= } use an external target only (fireListeners is called on this EventTarget).
319
328
*/
320
- goog . events . EventTarget . prototype . setTargetForTesting = function ( target ) {
329
+ goog . events . EventTarget . prototype . setTargetForTesting = function ( target , opt_external ) {
321
330
this . actualEventTarget_ = target ;
331
+ this . alwaysFireLocal_ = ! ! opt_external ;
322
332
} ;
323
333
324
334
@@ -337,7 +347,9 @@ goog.events.EventTarget.prototype.assertInitialized_ = function() {
337
347
/**
338
348
* Dispatches the given event on the ancestorsTree.
339
349
*
340
- * @param {!Object } target The target to dispatch on.
350
+ * @param {!Object } target The target for the event.
351
+ * @param {!Object } eventTarget The target to dispatch on.
352
+ * support for separating target and eventTarget permits proxy implementations
341
353
* @param {goog.events.Event|Object|string } e The event object.
342
354
* @param {Array<goog.events.Listenable>= } opt_ancestorsTree The ancestors
343
355
* tree of the target, in reverse order from the closest ancestor
@@ -347,7 +359,7 @@ goog.events.EventTarget.prototype.assertInitialized_ = function() {
347
359
* @private
348
360
*/
349
361
goog . events . EventTarget . dispatchEventInternal_ = function (
350
- target , e , opt_ancestorsTree ) {
362
+ target , eventTarget , e , opt_ancestorsTree , opt_dispatcher ) {
351
363
var type = e . type || /** @type {string } */ ( e ) ;
352
364
353
365
// If accepting a string or object, create a custom event object so that
@@ -375,7 +387,8 @@ goog.events.EventTarget.dispatchEventInternal_ = function(
375
387
376
388
// Executes capture and bubble listeners on the target.
377
389
if ( ! e . propagationStopped_ ) {
378
- currentTarget = /** @type {? } */ ( e . currentTarget = target ) ;
390
+ e . currentTarget = target ;
391
+ currentTarget /** @type {? } */ = eventTarget ;
379
392
rv = currentTarget . fireListeners ( type , true , e ) && rv ;
380
393
if ( ! e . propagationStopped_ ) {
381
394
rv = currentTarget . fireListeners ( type , false , e ) && rv ;
0 commit comments