diff options
author | Gregory Terzian <gterzian@users.noreply.github.com> | 2018-04-27 13:35:53 +0800 |
---|---|---|
committer | Gregory Terzian <gterzian@users.noreply.github.com> | 2018-05-05 19:14:43 +0800 |
commit | 29d1cf6270b56af65971f27af4aa47c549eef788 (patch) | |
tree | be7ec3a78ac287d662a7f3426f75edd4cef68cba /components/script/dom/document.rs | |
parent | 427eaed535dfdeaf735a40e3cb82ad7077aa86c5 (diff) | |
download | servo-29d1cf6270b56af65971f27af4aa47c549eef788.tar.gz servo-29d1cf6270b56af65971f27af4aa47c549eef788.zip |
implement "has event listener", plug into (before)unload
Diffstat (limited to 'components/script/dom/document.rs')
-rw-r--r-- | components/script/dom/document.rs | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 4fa33056253..af58c8e53b7 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -1646,15 +1646,15 @@ impl Document { EventCancelable::Cancelable); let event = beforeunload_event.upcast::<Event>(); event.set_trusted(true); - self.window.upcast::<EventTarget>().dispatch_event_with_target( + let event_target = self.window.upcast::<EventTarget>(); + let has_listeners = event.has_listeners_for(&event_target, &atom!("beforeunload")); + event_target.dispatch_event_with_target( document.root().upcast(), &event, ); // TODO: Step 6, decrease the event loop's termination nesting level by 1. // Step 7 - if event.get_cancel_state() != EventDefault::Allowed { - self.salvageable.set(false); - } + self.salvageable.set(!has_listeners); let mut can_unload = true; // TODO: Step 8 send a message to embedder to prompt user. // Step 9 @@ -1698,7 +1698,6 @@ impl Document { ); // TODO Step 6, document visibility steps. } - let mut event_handled = false; // Step 7 if !self.fired_unload.get() { let event = Event::new( @@ -1708,16 +1707,18 @@ impl Document { EventCancelable::Cancelable, ); event.set_trusted(true); - let _ = self.window.upcast::<EventTarget>().dispatch_event_with_target( + let event_target = self.window.upcast::<EventTarget>(); + let has_listeners = event.has_listeners_for(&event_target, &atom!("unload")); + let _ = event_target.dispatch_event_with_target( document.root().upcast(), &event, ); self.fired_unload.set(true); - event_handled = event.get_cancel_state() != EventDefault::Allowed; + // Step 9 + self.salvageable.set(!has_listeners); } // TODO: Step 8, decrease the event loop's termination nesting level by 1. - // Step 9 - self.salvageable.set(!event_handled); + // Step 13 if !recursive_flag { for iframe in self.iter_iframes() { |