diff options
author | Josh Matthews <josh@joshmatthews.net> | 2017-01-12 18:05:54 -0500 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2017-01-13 09:59:57 -0500 |
commit | 3f35c3eee22cb52de04dea764e529517f6bfef0d (patch) | |
tree | caa59c9b7955f2dc6730eac3289b3232ea681a89 /components/script/dom/eventtarget.rs | |
parent | 550df86ac88ff12ad3964d08b6a678ae0d1b4436 (diff) | |
download | servo-3f35c3eee22cb52de04dea764e529517f6bfef0d.tar.gz servo-3f35c3eee22cb52de04dea764e529517f6bfef0d.zip |
Add a permanent root to WebIDL callbacks, ensuring they are always safe to store.
Diffstat (limited to 'components/script/dom/eventtarget.rs')
-rw-r--r-- | components/script/dom/eventtarget.rs | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index 09cafb65bac..1023b97600f 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -441,13 +441,13 @@ impl EventTarget { assert!(!funobj.is_null()); // Step 1.14 if is_error { - Some(CommonEventHandler::ErrorEventHandler(OnErrorEventHandlerNonNull::new(funobj))) + Some(CommonEventHandler::ErrorEventHandler(OnErrorEventHandlerNonNull::new(cx, funobj))) } else { if ty == &atom!("beforeunload") { Some(CommonEventHandler::BeforeUnloadEventHandler( - OnBeforeUnloadEventHandlerNonNull::new(funobj))) + OnBeforeUnloadEventHandlerNonNull::new(cx, funobj))) } else { - Some(CommonEventHandler::EventHandler(EventHandlerNonNull::new(funobj))) + Some(CommonEventHandler::EventHandler(EventHandlerNonNull::new(cx, funobj))) } } } @@ -455,36 +455,47 @@ impl EventTarget { pub fn set_event_handler_common<T: CallbackContainer>( &self, ty: &str, listener: Option<Rc<T>>) { + let cx = self.global().get_cx(); + let event_listener = listener.map(|listener| InlineEventListener::Compiled( CommonEventHandler::EventHandler( - EventHandlerNonNull::new(listener.callback())))); + EventHandlerNonNull::new(cx, listener.callback())))); self.set_inline_event_listener(Atom::from(ty), event_listener); } pub fn set_error_event_handler<T: CallbackContainer>( &self, ty: &str, listener: Option<Rc<T>>) { + let cx = self.global().get_cx(); + let event_listener = listener.map(|listener| InlineEventListener::Compiled( CommonEventHandler::ErrorEventHandler( - OnErrorEventHandlerNonNull::new(listener.callback())))); + OnErrorEventHandlerNonNull::new(cx, listener.callback())))); self.set_inline_event_listener(Atom::from(ty), event_listener); } pub fn set_beforeunload_event_handler<T: CallbackContainer>(&self, ty: &str, - listener: Option<Rc<T>>) { + listener: Option<Rc<T>>) { + let cx = self.global().get_cx(); + let event_listener = listener.map(|listener| InlineEventListener::Compiled( CommonEventHandler::BeforeUnloadEventHandler( - OnBeforeUnloadEventHandlerNonNull::new(listener.callback()))) + OnBeforeUnloadEventHandlerNonNull::new(cx, listener.callback()))) ); self.set_inline_event_listener(Atom::from(ty), event_listener); } + #[allow(unsafe_code)] pub fn get_event_handler_common<T: CallbackContainer>(&self, ty: &str) -> Option<Rc<T>> { + let cx = self.global().get_cx(); let listener = self.get_inline_event_listener(&Atom::from(ty)); - listener.map(|listener| CallbackContainer::new(listener.parent().callback_holder().get())) + unsafe { + listener.map(|listener| + CallbackContainer::new(cx, listener.parent().callback_holder().get())) + } } pub fn has_handlers(&self) -> bool { |