aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/eventtarget.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/eventtarget.rs')
-rw-r--r--components/script/dom/eventtarget.rs57
1 files changed, 33 insertions, 24 deletions
diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs
index 396ffb75441..1d80781a2fb 100644
--- a/components/script/dom/eventtarget.rs
+++ b/components/script/dom/eventtarget.rs
@@ -33,6 +33,7 @@ use crate::dom::htmlformelement::FormControlElementHelpers;
use crate::dom::node::document_from_node;
use crate::dom::virtualmethods::VirtualMethods;
use crate::dom::window::Window;
+use crate::dom::workerglobalscope::WorkerGlobalScope;
use crate::realms::enter_realm;
use dom_struct::dom_struct;
use fnv::FnvHasher;
@@ -152,9 +153,9 @@ pub enum CompiledEventListener {
impl CompiledEventListener {
// https://html.spec.whatwg.org/multipage/#the-event-handler-processing-algorithm
- pub fn call_or_handle_event<T: DomObject>(
+ pub fn call_or_handle_event(
&self,
- object: &T,
+ object: &EventTarget,
event: &Event,
exception_handle: ExceptionHandling,
) {
@@ -167,27 +168,29 @@ impl CompiledEventListener {
match *handler {
CommonEventHandler::ErrorEventHandler(ref handler) => {
if let Some(event) = event.downcast::<ErrorEvent>() {
- let cx = object.global().get_cx();
- rooted!(in(*cx) let error = event.Error(cx));
- let return_value = handler.Call_(
- object,
- EventOrString::String(event.Message()),
- Some(event.Filename()),
- Some(event.Lineno()),
- Some(event.Colno()),
- Some(error.handle()),
- exception_handle,
- );
- // Step 4
- if let Ok(return_value) = return_value {
- rooted!(in(*cx) let return_value = return_value);
- if return_value.handle().is_boolean() &&
- return_value.handle().to_boolean() == true
- {
- event.upcast::<Event>().PreventDefault();
+ if object.is::<Window>() || object.is::<WorkerGlobalScope>() {
+ let cx = object.global().get_cx();
+ rooted!(in(*cx) let error = event.Error(cx));
+ let return_value = handler.Call_(
+ object,
+ EventOrString::String(event.Message()),
+ Some(event.Filename()),
+ Some(event.Lineno()),
+ Some(event.Colno()),
+ Some(error.handle()),
+ exception_handle,
+ );
+ // Step 4
+ if let Ok(return_value) = return_value {
+ rooted!(in(*cx) let return_value = return_value);
+ if return_value.handle().is_boolean() &&
+ return_value.handle().to_boolean() == true
+ {
+ event.upcast::<Event>().PreventDefault();
+ }
}
+ return;
}
- return;
}
let _ = handler.Call_(
@@ -401,9 +404,15 @@ impl EventTarget {
});
match idx {
- Some(idx) => {
- entries[idx].listener =
- EventListenerType::Inline(listener.unwrap_or(InlineEventListener::Null));
+ Some(idx) => match listener {
+ // Replace if there's something to replace with,
+ // but remove entirely if there isn't.
+ Some(listener) => {
+ entries[idx].listener = EventListenerType::Inline(listener);
+ },
+ None => {
+ entries.remove(idx);
+ },
},
None => {
if let Some(listener) = listener {