Auto merge of #13245 - servo:reset-stop-propagation, r=nox

Correct an unsound optimization in event dispatch.

<!-- Reviewable:start -->
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/13245)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2016-09-12 13:22:18 -05:00 committed by GitHub
commit bb53da6957
3 changed files with 12 additions and 14 deletions

View file

@ -112,19 +112,23 @@ pub fn dispatch_event(target: &EventTarget,
assert_eq!(event.phase(), EventPhase::None);
assert!(event.GetCurrentTarget().is_none());
// Step 1.
event.mark_as_dispatching();
// Step 2.
event.set_target(target_override.unwrap_or(target));
if event.stop_propagation() {
// If the event's stop propagation flag is set, we can skip everything because
// it prevents the calls of the invoke algorithm in the spec and we asserted
// at the beginning that steps 10-12 don't need to be executed.
// it prevents the calls of the invoke algorithm in the spec.
// Step 10-12.
event.clear_dispatching_flags();
// Step 14.
return !event.DefaultPrevented();
}
// Step 1. Postponed here for the reason stated above.
event.mark_as_dispatching();
// Step 3. The "invoke" algorithm is only used on `target` separately,
// so we don't put it in the path.
rooted_vec!(let mut event_path);