1
1
//! Core event structure
2
2
3
3
use crate :: avm2:: activation:: Activation ;
4
- use crate :: avm2:: error:: make_error_2007;
5
4
use crate :: avm2:: globals:: slots:: flash_events_event_dispatcher as slots;
6
5
use crate :: avm2:: object:: { EventObject , Object , TObject } ;
7
6
use crate :: avm2:: value:: Value ;
@@ -73,9 +72,6 @@ pub struct Event<'gc> {
73
72
74
73
/// The name of the event being triggered.
75
74
event_type : AvmString < ' gc > ,
76
-
77
- /// Whether is event has been dispatched before.
78
- dispatched : bool ,
79
75
}
80
76
81
77
impl < ' gc > Event < ' gc > {
@@ -93,7 +89,6 @@ impl<'gc> Event<'gc> {
93
89
event_phase : EventPhase :: AtTarget ,
94
90
target : None ,
95
91
event_type : event_type. into ( ) ,
96
- dispatched : false ,
97
92
}
98
93
}
99
94
@@ -373,13 +368,14 @@ pub fn parent_of(target: Object<'_>) -> Option<Object<'_>> {
373
368
fn dispatch_event_to_target < ' gc > (
374
369
activation : & mut Activation < ' _ , ' gc > ,
375
370
dispatcher : Object < ' gc > ,
376
- target : Object < ' gc > ,
371
+ real_target : Object < ' gc > ,
372
+ current_target : Object < ' gc > ,
377
373
event : EventObject < ' gc > ,
378
374
simulate_dispatch : bool ,
379
375
) -> Result < ( ) , Error < ' gc > > {
380
376
avm_debug ! (
381
377
activation. context. avm2,
382
- "Event dispatch: {} to {target :?}" ,
378
+ "Event dispatch: {} to {current_target :?}" ,
383
379
event. event( ) . event_type( ) ,
384
380
) ;
385
381
@@ -402,10 +398,9 @@ fn dispatch_event_to_target<'gc>(
402
398
. iter_event_handlers ( name, use_capture)
403
399
. collect ( ) ;
404
400
405
- evtmut. set_current_target ( target) ;
406
-
407
401
if !handlers. is_empty ( ) {
408
- evtmut. dispatched = true ;
402
+ evtmut. set_target ( real_target) ;
403
+ evtmut. set_current_target ( current_target) ;
409
404
}
410
405
411
406
drop ( evtmut) ;
@@ -437,7 +432,7 @@ fn dispatch_event_to_target<'gc>(
437
432
pub fn dispatch_event < ' gc > (
438
433
activation : & mut Activation < ' _ , ' gc > ,
439
434
this : Object < ' gc > ,
440
- event_object : EventObject < ' gc > ,
435
+ event : EventObject < ' gc > ,
441
436
simulate_dispatch : bool ,
442
437
) -> Result < bool , Error < ' gc > > {
443
438
let target = this. get_slot ( slots:: TARGET ) . as_object ( ) . unwrap_or ( this) ;
@@ -455,23 +450,9 @@ pub fn dispatch_event<'gc>(
455
450
parent = parent_dobj. parent ( ) ;
456
451
}
457
452
458
- let dispatched = event_object. event ( ) . dispatched ;
459
-
460
- let event = if dispatched {
461
- Value :: from ( event_object)
462
- . call_public_property ( "clone" , & [ ] , activation) ?
463
- . as_object ( )
464
- . ok_or_else ( || make_error_2007 ( activation, "event" ) ) ?
465
- . as_event_object ( )
466
- . expect ( "Event.clone should return an Event" )
467
- } else {
468
- event_object
469
- } ;
470
-
471
453
let mut evtmut = event. event_mut ( activation. gc ( ) ) ;
472
454
473
455
evtmut. set_phase ( EventPhase :: Capturing ) ;
474
- evtmut. set_target ( target) ;
475
456
476
457
drop ( evtmut) ;
477
458
@@ -480,15 +461,22 @@ pub fn dispatch_event<'gc>(
480
461
break ;
481
462
}
482
463
483
- dispatch_event_to_target ( activation, * ancestor, * ancestor, event, simulate_dispatch) ?;
464
+ dispatch_event_to_target (
465
+ activation,
466
+ * ancestor,
467
+ target,
468
+ * ancestor,
469
+ event,
470
+ simulate_dispatch,
471
+ ) ?;
484
472
}
485
473
486
474
event
487
475
. event_mut ( activation. gc ( ) )
488
476
. set_phase ( EventPhase :: AtTarget ) ;
489
477
490
478
if !event. event ( ) . is_propagation_stopped ( ) {
491
- dispatch_event_to_target ( activation, this, target, event, simulate_dispatch) ?;
479
+ dispatch_event_to_target ( activation, this, target, target , event, simulate_dispatch) ?;
492
480
}
493
481
494
482
event
@@ -501,10 +489,17 @@ pub fn dispatch_event<'gc>(
501
489
break ;
502
490
}
503
491
504
- dispatch_event_to_target ( activation, * ancestor, * ancestor, event, simulate_dispatch) ?;
492
+ dispatch_event_to_target (
493
+ activation,
494
+ * ancestor,
495
+ target,
496
+ * ancestor,
497
+ event,
498
+ simulate_dispatch,
499
+ ) ?;
505
500
}
506
501
}
507
502
508
- let handled = event. event ( ) . dispatched ;
503
+ let handled = event. event ( ) . target . is_some ( ) ;
509
504
Ok ( handled)
510
505
}
0 commit comments