aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/document.rs
diff options
context:
space:
mode:
authorGregory Terzian <gterzian@users.noreply.github.com>2018-04-27 13:35:53 +0800
committerGregory Terzian <gterzian@users.noreply.github.com>2018-05-05 19:14:43 +0800
commit29d1cf6270b56af65971f27af4aa47c549eef788 (patch)
treebe7ec3a78ac287d662a7f3426f75edd4cef68cba /components/script/dom/document.rs
parent427eaed535dfdeaf735a40e3cb82ad7077aa86c5 (diff)
downloadservo-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.rs19
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() {