aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2015-12-22 22:38:19 +0530
committerbors-servo <lbergstrom+bors@mozilla.com>2015-12-22 22:38:19 +0530
commitdafdc856ac3fc2bd000e61bdcaed2c024828de0c (patch)
treea52201e537222e7655c5e9ac4563d83470d4f3fd /components/script
parent9306be60c23bdb828dc41f3379e77781d3eafff7 (diff)
parentd38771e2708b7beabfb9c31c5bbc288534c20b77 (diff)
downloadservo-dafdc856ac3fc2bd000e61bdcaed2c024828de0c.tar.gz
servo-dafdc856ac3fc2bd000e61bdcaed2c024828de0c.zip
Auto merge of #9030 - askobara:refactoring-add-htmlformelement-fire_event, r=Manishearth
Add helper method HTMLFormElement::fire_event Fixes #8777 <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/9030) <!-- Reviewable:end -->
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/document.rs8
-rw-r--r--components/script/dom/eventtarget.rs22
-rw-r--r--components/script/dom/htmlformelement.rs42
-rw-r--r--components/script/dom/htmliframeelement.rs10
-rw-r--r--components/script/dom/htmlimageelement.rs9
-rw-r--r--components/script/dom/htmlinputelement.rs23
-rw-r--r--components/script/dom/websocket.rs14
-rw-r--r--components/script/dom/worker.rs6
8 files changed, 62 insertions, 72 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index b2033a2a92e..d1e529f3bfa 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -558,12 +558,8 @@ impl Document {
self.ready_state.set(state);
- let event = Event::new(GlobalRef::Window(&self.window),
- atom!("readystatechange"),
- EventBubbles::DoesNotBubble,
- EventCancelable::NotCancelable);
- let target = self.upcast::<EventTarget>();
- let _ = event.fire(target);
+ self.upcast::<EventTarget>().fire_simple_event("readystatechange",
+ GlobalRef::Window(&self.window));
}
/// Return whether scripting is enabled or not
diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs
index 612c3d78b11..94998185507 100644
--- a/components/script/dom/eventtarget.rs
+++ b/components/script/dom/eventtarget.rs
@@ -11,12 +11,12 @@ use dom::bindings::codegen::Bindings::EventListenerBinding::EventListener;
use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods;
use dom::bindings::codegen::UnionTypes::EventOrString;
use dom::bindings::error::{Error, Fallible, report_pending_exception};
-use dom::bindings::global::global_root_from_reflector;
+use dom::bindings::global::{GlobalRef, global_root_from_reflector};
use dom::bindings::inheritance::{Castable, EventTargetTypeId};
use dom::bindings::js::Root;
use dom::bindings::reflector::{Reflectable, Reflector};
use dom::errorevent::ErrorEvent;
-use dom::event::Event;
+use dom::event::{Event, EventBubbles, EventCancelable};
use dom::eventdispatcher::dispatch_event;
use dom::virtualmethods::VirtualMethods;
use dom::window::Window;
@@ -329,6 +329,24 @@ impl EventTarget {
pub fn has_handlers(&self) -> bool {
!self.handlers.borrow().is_empty()
}
+
+ /// Implements https://html.spec.whatwg.org/multipage/#fire-a-simple-event
+ pub fn fire_simple_event(&self, name: &str, win: GlobalRef) -> Root<Event> {
+ self.fire_simple_event_params(name, EventBubbles::DoesNotBubble,
+ EventCancelable::NotCancelable, win)
+ }
+
+ /// Implements more customizable variant of EventTarget::fire_simple_event.
+ pub fn fire_simple_event_params(&self, name: &str,
+ bubbles: EventBubbles,
+ cancelable: EventCancelable,
+ win: GlobalRef) -> Root<Event> {
+ let event = Event::new(win, Atom::from(name), bubbles, cancelable);
+
+ event.fire(self);
+
+ event
+ }
}
impl EventTargetMethods for EventTarget {
diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs
index f3c98dec0d9..6515eb58471 100644
--- a/components/script/dom/htmlformelement.rs
+++ b/components/script/dom/htmlformelement.rs
@@ -16,7 +16,7 @@ use dom::bindings::js::{Root};
use dom::bindings::reflector::Reflectable;
use dom::document::Document;
use dom::element::Element;
-use dom::event::{Event, EventBubbles, EventCancelable};
+use dom::event::{EventBubbles, EventCancelable};
use dom::eventtarget::EventTarget;
use dom::htmlbuttonelement::HTMLButtonElement;
use dom::htmldatalistelement::HTMLDataListElement;
@@ -169,23 +169,18 @@ impl HTMLFormElement {
{
if self.interactive_validation().is_err() {
// TODO: Implement event handlers on all form control elements
- // XXXKiChjang: We're also calling the following two statements quite often,
- // we should refactor it into a function
- let event = Event::new(GlobalRef::Window(win.r()),
- atom!("invalid"),
- EventBubbles::DoesNotBubble,
- EventCancelable::NotCancelable);
- event.fire(self.upcast());
+ self.upcast::<EventTarget>()
+ .fire_simple_event("invalid", GlobalRef::Window(win.r()));
return;
}
}
// Step 5
if submit_method_flag == SubmittedFrom::NotFromFormSubmitMethod {
- let event = Event::new(GlobalRef::Window(win.r()),
- atom!("submit"),
- EventBubbles::Bubbles,
- EventCancelable::Cancelable);
- event.fire(self.upcast());
+ let event = self.upcast::<EventTarget>()
+ .fire_simple_event_params("submit",
+ EventBubbles::Bubbles,
+ EventCancelable::Cancelable,
+ GlobalRef::Window(win.r()));
if event.DefaultPrevented() {
return;
}
@@ -280,11 +275,11 @@ impl HTMLFormElement {
// Step 5-6
let win = window_from_node(self);
let unhandled_invalid_controls = invalid_controls.into_iter().filter_map(|field| {
- let event = Event::new(GlobalRef::Window(win.r()),
- atom!("invalid"),
- EventBubbles::DoesNotBubble,
- EventCancelable::Cancelable);
- event.fire(field.as_event_target());
+ let event = field.as_event_target()
+ .fire_simple_event_params("invalid",
+ EventBubbles::DoesNotBubble,
+ EventCancelable::Cancelable,
+ GlobalRef::Window(win.r()));
if !event.DefaultPrevented() { return Some(field); }
None
}).collect::<Vec<FormSubmittableElement>>();
@@ -393,11 +388,11 @@ impl HTMLFormElement {
}
let win = window_from_node(self);
- let event = Event::new(GlobalRef::Window(win.r()),
- atom!("reset"),
- EventBubbles::Bubbles,
- EventCancelable::Cancelable);
- event.fire(self.upcast());
+ let event = self.upcast::<EventTarget>()
+ .fire_simple_event_params("reset",
+ EventBubbles::Bubbles,
+ EventCancelable::Cancelable,
+ GlobalRef::Window(win.r()));
if event.DefaultPrevented() {
return;
}
@@ -430,6 +425,7 @@ impl HTMLFormElement {
};
self.marked_for_reset.set(false);
}
+
}
// TODO: add file support
diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs
index 8b3def1c7cb..c51e98d8f92 100644
--- a/components/script/dom/htmliframeelement.rs
+++ b/components/script/dom/htmliframeelement.rs
@@ -17,7 +17,8 @@ use dom::bindings::reflector::Reflectable;
use dom::customevent::CustomEvent;
use dom::document::Document;
use dom::element::{AttributeMutation, Element, RawLayoutElementHelpers};
-use dom::event::{Event, EventBubbles, EventCancelable};
+use dom::event::Event;
+use dom::eventtarget::EventTarget;
use dom::htmlelement::HTMLElement;
use dom::node::{Node, window_from_node};
use dom::urlhelper::UrlHelper;
@@ -208,12 +209,7 @@ impl HTMLIFrameElement {
// Step 4
let window = window_from_node(self);
- let event = Event::new(GlobalRef::Window(window.r()),
- atom!("load"),
- EventBubbles::DoesNotBubble,
- EventCancelable::NotCancelable);
- event.fire(self.upcast());
-
+ self.upcast::<EventTarget>().fire_simple_event("load", GlobalRef::Window(window.r()));
// TODO Step 5 - unset child document `mut iframe load` flag
}
}
diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs
index de25eb87369..39b485d6d6c 100644
--- a/components/script/dom/htmlimageelement.rs
+++ b/components/script/dom/htmlimageelement.rs
@@ -15,7 +15,7 @@ use dom::bindings::js::{LayoutJS, Root};
use dom::bindings::refcounted::Trusted;
use dom::document::Document;
use dom::element::AttributeMutation;
-use dom::event::{Event, EventBubbles, EventCancelable};
+use dom::eventtarget::EventTarget;
use dom::htmlelement::HTMLElement;
use dom::node::{Node, NodeDamage, document_from_node, window_from_node};
use dom::virtualmethods::VirtualMethods;
@@ -77,12 +77,7 @@ impl Runnable for ImageResponseHandlerRunnable {
// Fire image.onload
let window = window_from_node(document.r());
- let event = Event::new(GlobalRef::Window(window.r()),
- atom!("load"),
- EventBubbles::DoesNotBubble,
- EventCancelable::NotCancelable);
- event.fire(element.upcast());
-
+ element.upcast::<EventTarget>().fire_simple_event("load", GlobalRef::Window(window.r()));
// Trigger reflow
window.add_pending_reflow();
}
diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs
index 35d04fed47e..a7143133b05 100644
--- a/components/script/dom/htmlinputelement.rs
+++ b/components/script/dom/htmlinputelement.rs
@@ -858,19 +858,16 @@ impl Activatable for HTMLInputElement {
// https://html.spec.whatwg.org/multipage/#radio-button-state-(type=radio):activation-behavior
if self.mutable() {
let win = window_from_node(self);
- let target = self.upcast();
-
- let event = Event::new(GlobalRef::Window(win.r()),
- atom!("input"),
- EventBubbles::Bubbles,
- EventCancelable::NotCancelable);
- event.fire(target);
-
- let event = Event::new(GlobalRef::Window(win.r()),
- atom!("change"),
- EventBubbles::Bubbles,
- EventCancelable::NotCancelable);
- event.fire(target);
+ let target = self.upcast::<EventTarget>();
+
+ target.fire_simple_event_params("input",
+ EventBubbles::Bubbles,
+ EventCancelable::NotCancelable,
+ GlobalRef::Window(win.r()));
+ target.fire_simple_event_params("change",
+ EventBubbles::Bubbles,
+ EventCancelable::NotCancelable,
+ GlobalRef::Window(win.r()));
}
},
_ => ()
diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs
index b7a07d494cb..8f008255993 100644
--- a/components/script/dom/websocket.rs
+++ b/components/script/dom/websocket.rs
@@ -498,10 +498,7 @@ impl Runnable for ConnectionEstablishedTask {
// Step 5: Cookies.
// Step 6.
- let event = Event::new(global.r(), atom!("open"),
- EventBubbles::DoesNotBubble,
- EventCancelable::NotCancelable);
- event.fire(ws.upcast());
+ ws.upcast().fire_simple_event("open", global.r());
}
}
@@ -539,11 +536,10 @@ impl Runnable for CloseTask {
ws.full.set(false);
//A Bad close
ws.clean_close.set(false);
- let event = Event::new(global.r(),
- atom!("error"),
- EventBubbles::DoesNotBubble,
- EventCancelable::Cancelable);
- event.fire(ws.upcast());
+ ws.upcast().fire_simple_event_params("error",
+ EventBubbles::DoesNotBubble,
+ EventCancelable::Cancelable,
+ global.r());
}
let reason = ws.reason.borrow().clone();
/*In addition, we also have to fire a close even if error event fired
diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs
index 2253d5e6dfb..5ca3d3316fc 100644
--- a/components/script/dom/worker.rs
+++ b/components/script/dom/worker.rs
@@ -126,11 +126,7 @@ impl Worker {
pub fn dispatch_simple_error(address: TrustedWorkerAddress) {
let worker = address.root();
let global = worker.r().global.root();
- let event = Event::new(global.r(),
- atom!("error"),
- EventBubbles::DoesNotBubble,
- EventCancelable::NotCancelable);
- event.fire(worker.upcast());
+ worker.upcast().fire_simple_event("error", global.r());
}
pub fn handle_error_message(address: TrustedWorkerAddress, message: DOMString,