Skip to content

Commit 01dbaa5

Browse files
author
bors-servo
authored
Auto merge of #15142 - nox:beforeunload, r=<try>
Properly cancel event when beforeunload handler returns null <!-- 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/15142) <!-- Reviewable:end -->
2 parents 2b623fc + 9808270 commit 01dbaa5

File tree

3 files changed

+12
-20
lines changed

3 files changed

+12
-20
lines changed

components/script/dom/beforeunloadevent.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use dom::bindings::str::DOMString;
1515
use dom::event::{Event, EventBubbles, EventCancelable};
1616
use dom::window::Window;
1717
use servo_atoms::Atom;
18+
use std::cell::Ref;
1819

1920
// https://html.spec.whatwg.org/multipage/#beforeunloadevent
2021
#[dom_struct]
@@ -49,6 +50,10 @@ impl BeforeUnloadEvent {
4950
}
5051
ev
5152
}
53+
54+
pub fn return_value(&self) -> Ref<DOMString> {
55+
self.return_value.borrow()
56+
}
5257
}
5358

5459
impl BeforeUnloadEventMethods for BeforeUnloadEvent {

components/script/dom/eventtarget.rs

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -178,22 +178,15 @@ impl CompiledEventListener {
178178
}
179179

180180
CommonEventHandler::BeforeUnloadEventHandler(ref handler) => {
181-
if let Some(event) = event.downcast::<BeforeUnloadEvent>() {
182-
let rv = event.ReturnValue();
183-
184-
if let Ok(value) = handler.Call_(object,
185-
event.upcast::<Event>(),
186-
exception_handle) {
187-
match value {
188-
Some(value) => {
189-
if rv.is_empty() {
190-
event.SetReturnValue(value);
191-
}
192-
}
193-
None => {
194-
event.upcast::<Event>().PreventDefault();
181+
if let Ok(value) = handler.Call_(object, event, exception_handle) {
182+
if let Some(return_value) = value {
183+
if let Some(before_unload_event) = event.downcast::<BeforeUnloadEvent>() {
184+
if before_unload_event.return_value().is_empty() {
185+
before_unload_event.SetReturnValue(return_value);
195186
}
196187
}
188+
} else {
189+
event.PreventDefault();
197190
}
198191
}
199192
}

tests/wpt/metadata/html/webappapis/scripting/events/event-handler-processing-algorithm.html.ini

Lines changed: 0 additions & 6 deletions
This file was deleted.

0 commit comments

Comments
 (0)