Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

A couple improvements to `EventTarget` event firing. #14036

Merged
merged 3 commits into from Nov 4, 2016
Merged
Changes from 1 commit
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Next

Remove "fire a simple event" concept, refactor event firing API.

"fire a simple event" concept was removed in
whatwg/html#1933.
  • Loading branch information
frewsxcv committed Nov 3, 2016
commit c3b279a4c301609cd2f413fb9fd5222e6dd45014
@@ -606,7 +606,7 @@ impl Document {

self.ready_state.set(state);

self.upcast::<EventTarget>().fire_simple_event("readystatechange");
self.upcast::<EventTarget>().fire_event("readystatechange");
}

/// Return whether scripting is enabled or not
@@ -330,7 +330,7 @@ impl Runnable for EventRunnable {

fn handler(self: Box<EventRunnable>) {
let target = self.target.root();
target.fire_event(&*self.name, self.bubbles, self.cancelable);
target.fire_event_with_params(&*self.name, self.bubbles, self.cancelable);
}
}

@@ -345,6 +345,6 @@ impl Runnable for SimpleEventRunnable {

fn handler(self: Box<SimpleEventRunnable>) {
let target = self.target.root();
target.fire_simple_event(&*self.name);
target.fire_event(&*self.name);
}
}
@@ -490,21 +490,42 @@ impl EventTarget {
!self.handlers.borrow().is_empty()
}

// https://html.spec.whatwg.org/multipage/#fire-a-simple-event
pub fn fire_simple_event(&self, name: &str) -> Root<Event> {
self.fire_event(name, EventBubbles::DoesNotBubble,
EventCancelable::NotCancelable)
// https://dom.spec.whatwg.org/#concept-event-fire
pub fn fire_event(&self, name: &str) -> Root<Event> {
self.fire_event_with_params(name,
EventBubbles::DoesNotBubble,
EventCancelable::NotCancelable)
}

// https://dom.spec.whatwg.org/#concept-event-fire
pub fn fire_event(&self, name: &str,
bubbles: EventBubbles,
cancelable: EventCancelable)
-> Root<Event> {
let event = Event::new(&self.global(), Atom::from(name), bubbles, cancelable);
pub fn fire_bubbling_event(&self, name: &str) -> Root<Event> {
self.fire_event_with_params(name,
EventBubbles::Bubbles,
EventCancelable::NotCancelable)
}

event.fire(self);
// https://dom.spec.whatwg.org/#concept-event-fire
pub fn fire_cancelable_event(&self, name: &str) -> Root<Event> {
self.fire_event_with_params(name,
EventBubbles::DoesNotBubble,
EventCancelable::Cancelable)
}

// https://dom.spec.whatwg.org/#concept-event-fire
pub fn fire_bubbling_cancelable_event(&self, name: &str) -> Root<Event> {
self.fire_event_with_params(name,
EventBubbles::Bubbles,
EventCancelable::Cancelable)
}

// https://dom.spec.whatwg.org/#concept-event-fire
pub fn fire_event_with_params(&self,
name: &str,
bubbles: EventBubbles,
cancelable: EventCancelable)
-> Root<Event> {
let event = Event::new(&self.global(), Atom::from(name), bubbles, cancelable);
event.fire(self);
event
}
}
@@ -94,7 +94,7 @@ impl Runnable for DetailsNotificationRunnable {
fn handler(self: Box<DetailsNotificationRunnable>) {
let target = self.element.root();
if target.check_toggle_count(self.toggle_number) {
target.upcast::<EventTarget>().fire_simple_event("toggle");
target.upcast::<EventTarget>().fire_event("toggle");
}
}
}
@@ -20,7 +20,6 @@ use dom::bindings::str::DOMString;
use dom::blob::Blob;
use dom::document::Document;
use dom::element::Element;
use dom::event::{EventBubbles, EventCancelable};
use dom::eventtarget::EventTarget;
use dom::file::File;
use dom::globalscope::GlobalScope;
@@ -305,16 +304,14 @@ impl HTMLFormElement {
{
if self.interactive_validation().is_err() {
// TODO: Implement event handlers on all form control elements
self.upcast::<EventTarget>().fire_simple_event("invalid");
self.upcast::<EventTarget>().fire_event("invalid");
return;
}
}
// Step 5
if submit_method_flag == SubmittedFrom::NotFromForm {
let event = self.upcast::<EventTarget>()
.fire_event("submit",
EventBubbles::Bubbles,
EventCancelable::Cancelable);
.fire_bubbling_cancelable_event("submit");
if event.DefaultPrevented() {
return;
}
@@ -484,9 +481,7 @@ impl HTMLFormElement {
// Step 5-6
let unhandled_invalid_controls = invalid_controls.into_iter().filter_map(|field| {
let event = field.as_event_target()
.fire_event("invalid",
EventBubbles::DoesNotBubble,
EventCancelable::Cancelable);
.fire_cancelable_event("invalid");
if !event.DefaultPrevented() { return Some(field); }
None
}).collect::<Vec<FormSubmittableElement>>();
@@ -615,9 +610,7 @@ impl HTMLFormElement {
}

let event = self.upcast::<EventTarget>()
.fire_event("reset",
EventBubbles::Bubbles,
EventCancelable::Cancelable);
.fire_bubbling_cancelable_event("reset");
if event.DefaultPrevented() {
return;
}
@@ -239,7 +239,7 @@ impl HTMLIFrameElement {
// TODO Step 3 - set child document `mut iframe load` flag

// Step 4
self.upcast::<EventTarget>().fire_simple_event("load");
self.upcast::<EventTarget>().fire_event("load");

let mut blocker = self.load_blocker.borrow_mut();
LoadBlocker::terminate(&mut blocker);
@@ -105,12 +105,12 @@ impl Runnable for ImageResponseHandlerRunnable {

// Fire image.onload
if trigger_image_load {
element.upcast::<EventTarget>().fire_simple_event("load");
element.upcast::<EventTarget>().fire_event("load");
}

// Fire image.onerror
if trigger_image_error {
element.upcast::<EventTarget>().fire_simple_event("error");
element.upcast::<EventTarget>().fire_event("error");
}

// Trigger reflow
@@ -180,8 +180,8 @@ impl HTMLImageElement {
// Step 11, substep 5
let img = self.img.root();
img.current_request.borrow_mut().source_url = Some(self.src.into());
img.upcast::<EventTarget>().fire_simple_event("error");
img.upcast::<EventTarget>().fire_simple_event("loadend");
img.upcast::<EventTarget>().fire_event("error");
img.upcast::<EventTarget>().fire_event("loadend");
}
}

@@ -849,12 +849,8 @@ impl HTMLInputElement {
let filelist = FileList::new(&window, files);
self.filelist.set(Some(&filelist));

target.fire_event("input",
EventBubbles::Bubbles,
EventCancelable::NotCancelable);
target.fire_event("change",
EventBubbles::Bubbles,
EventCancelable::NotCancelable);
target.fire_bubbling_event("input");
target.fire_bubbling_event("change");
}
}
}
@@ -1290,12 +1286,8 @@ impl Activatable for HTMLInputElement {
// https://html.spec.whatwg.org/multipage/#radio-button-state-(type=radio):activation-behavior
// Check if document owner is fully active
let target = self.upcast::<EventTarget>();
target.fire_event("input",
EventBubbles::Bubbles,
EventCancelable::NotCancelable);
target.fire_event("change",
EventBubbles::Bubbles,
EventCancelable::NotCancelable);
target.fire_bubbling_event("input");
target.fire_bubbling_event("change");
},
InputType::InputFile => self.select_files(None),
_ => ()
@@ -325,7 +325,7 @@ impl FetchResponseListener for StylesheetContext {
if let Some(ref meta) = self.metadata {
if let Some(Serde(ContentType(Mime(TopLevel::Text, SubLevel::Css, _)))) = meta.content_type {
} else {
self.elem.root().upcast::<EventTarget>().fire_simple_event("error");
self.elem.root().upcast::<EventTarget>().fire_event("error");
}
}
}
@@ -382,7 +382,7 @@ impl FetchResponseListener for StylesheetContext {

let event = if successful { "load" } else { "error" };

elem.upcast::<EventTarget>().fire_simple_event(event);
elem.upcast::<EventTarget>().fire_event(event);
}
}

@@ -142,7 +142,7 @@ impl WeakMediaQueryListVec {
pub fn evaluate_and_report_changes(&self) {
for mql in self.cell.borrow().iter() {
if let MediaQueryListMatchState::Changed(_) = mql.root().unwrap().evaluate_changes() {
mql.root().unwrap().upcast::<EventTarget>().fire_simple_event("change");
mql.root().unwrap().upcast::<EventTarget>().fire_event("change");
}
}
}
@@ -56,12 +56,12 @@ impl ServiceWorker {

pub fn dispatch_simple_error(address: TrustedServiceWorkerAddress) {
let service_worker = address.root();
service_worker.upcast().fire_simple_event("error");
service_worker.upcast().fire_event("error");
}

pub fn set_transition_state(&self, state: ServiceWorkerState) {
self.state.set(state);
self.upcast::<EventTarget>().fire_simple_event("statechange");
self.upcast::<EventTarget>().fire_event("statechange");
}

pub fn get_script_url(&self) -> Url {
@@ -45,7 +45,7 @@ pub trait Controllable {
impl Controllable for ServiceWorkerContainer {
fn set_controller(&self, active_worker: &ServiceWorker) {
self.controller.set(Some(active_worker));
self.upcast::<EventTarget>().fire_simple_event("controllerchange");
self.upcast::<EventTarget>().fire_event("controllerchange");
}
}

@@ -268,7 +268,7 @@ impl ServiceWorkerGlobalScope {
// TODO XXXcreativcoder This will eventually use a FetchEvent interface to fire event
// when we have the Request and Response dom api's implemented
// https://slightlyoff.github.io/ServiceWorker/spec/service_worker_1/index.html#fetch-event-section
self.upcast::<EventTarget>().fire_simple_event("fetch");
self.upcast::<EventTarget>().fire_event("fetch");
let _ = mediator.response_chan.send(None);
}
}
@@ -498,7 +498,7 @@ impl Runnable for ConnectionEstablishedTask {
}

// Step 6.
ws.upcast().fire_simple_event("open");
ws.upcast().fire_event("open");
}
}

@@ -548,7 +548,7 @@ impl Runnable for CloseTask {

// Step 2.
if self.failed {
ws.upcast().fire_simple_event("error");
ws.upcast().fire_event("error");
}

// Step 3.
@@ -138,7 +138,7 @@ impl Worker {

pub fn dispatch_simple_error(address: TrustedWorkerAddress) {
let worker = address.root();
worker.upcast().fire_simple_event("error");
worker.upcast().fire_event("error");
}

#[allow(unsafe_code)]
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.