mirror of
https://github.com/servo/servo.git
synced 2025-07-24 15:50:21 +01:00
Migrate EventTarget
event firing functions to use Atom
s.
This allows us to utilize more `atom` macros.
This commit is contained in:
parent
80575c3d2e
commit
f447040ea9
16 changed files with 42 additions and 33 deletions
|
@ -70,4 +70,8 @@ keydown
|
||||||
abort
|
abort
|
||||||
beforescriptexecute
|
beforescriptexecute
|
||||||
afterscriptexecute
|
afterscriptexecute
|
||||||
|
invalid
|
||||||
|
change
|
||||||
|
open
|
||||||
|
toggle
|
||||||
|
|
||||||
|
|
|
@ -606,7 +606,7 @@ impl Document {
|
||||||
|
|
||||||
self.ready_state.set(state);
|
self.ready_state.set(state);
|
||||||
|
|
||||||
self.upcast::<EventTarget>().fire_event("readystatechange");
|
self.upcast::<EventTarget>().fire_event(atom!("readystatechange"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return whether scripting is enabled or not
|
/// Return whether scripting is enabled or not
|
||||||
|
|
|
@ -330,7 +330,9 @@ impl Runnable for EventRunnable {
|
||||||
|
|
||||||
fn handler(self: Box<EventRunnable>) {
|
fn handler(self: Box<EventRunnable>) {
|
||||||
let target = self.target.root();
|
let target = self.target.root();
|
||||||
target.fire_event_with_params(&*self.name, self.bubbles, self.cancelable);
|
let bubbles = self.bubbles.clone();
|
||||||
|
let cancelable = self.cancelable.clone();
|
||||||
|
target.fire_event_with_params(self.name, bubbles, cancelable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -345,6 +347,6 @@ impl Runnable for SimpleEventRunnable {
|
||||||
|
|
||||||
fn handler(self: Box<SimpleEventRunnable>) {
|
fn handler(self: Box<SimpleEventRunnable>) {
|
||||||
let target = self.target.root();
|
let target = self.target.root();
|
||||||
target.fire_event(&*self.name);
|
target.fire_event(self.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -491,28 +491,28 @@ impl EventTarget {
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://dom.spec.whatwg.org/#concept-event-fire
|
// https://dom.spec.whatwg.org/#concept-event-fire
|
||||||
pub fn fire_event(&self, name: &str) -> Root<Event> {
|
pub fn fire_event(&self, name: Atom) -> Root<Event> {
|
||||||
self.fire_event_with_params(name,
|
self.fire_event_with_params(name,
|
||||||
EventBubbles::DoesNotBubble,
|
EventBubbles::DoesNotBubble,
|
||||||
EventCancelable::NotCancelable)
|
EventCancelable::NotCancelable)
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://dom.spec.whatwg.org/#concept-event-fire
|
// https://dom.spec.whatwg.org/#concept-event-fire
|
||||||
pub fn fire_bubbling_event(&self, name: &str) -> Root<Event> {
|
pub fn fire_bubbling_event(&self, name: Atom) -> Root<Event> {
|
||||||
self.fire_event_with_params(name,
|
self.fire_event_with_params(name,
|
||||||
EventBubbles::Bubbles,
|
EventBubbles::Bubbles,
|
||||||
EventCancelable::NotCancelable)
|
EventCancelable::NotCancelable)
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://dom.spec.whatwg.org/#concept-event-fire
|
// https://dom.spec.whatwg.org/#concept-event-fire
|
||||||
pub fn fire_cancelable_event(&self, name: &str) -> Root<Event> {
|
pub fn fire_cancelable_event(&self, name: Atom) -> Root<Event> {
|
||||||
self.fire_event_with_params(name,
|
self.fire_event_with_params(name,
|
||||||
EventBubbles::DoesNotBubble,
|
EventBubbles::DoesNotBubble,
|
||||||
EventCancelable::Cancelable)
|
EventCancelable::Cancelable)
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://dom.spec.whatwg.org/#concept-event-fire
|
// https://dom.spec.whatwg.org/#concept-event-fire
|
||||||
pub fn fire_bubbling_cancelable_event(&self, name: &str) -> Root<Event> {
|
pub fn fire_bubbling_cancelable_event(&self, name: Atom) -> Root<Event> {
|
||||||
self.fire_event_with_params(name,
|
self.fire_event_with_params(name,
|
||||||
EventBubbles::Bubbles,
|
EventBubbles::Bubbles,
|
||||||
EventCancelable::Cancelable)
|
EventCancelable::Cancelable)
|
||||||
|
@ -520,11 +520,11 @@ impl EventTarget {
|
||||||
|
|
||||||
// https://dom.spec.whatwg.org/#concept-event-fire
|
// https://dom.spec.whatwg.org/#concept-event-fire
|
||||||
pub fn fire_event_with_params(&self,
|
pub fn fire_event_with_params(&self,
|
||||||
name: &str,
|
name: Atom,
|
||||||
bubbles: EventBubbles,
|
bubbles: EventBubbles,
|
||||||
cancelable: EventCancelable)
|
cancelable: EventCancelable)
|
||||||
-> Root<Event> {
|
-> Root<Event> {
|
||||||
let event = Event::new(&self.global(), Atom::from(name), bubbles, cancelable);
|
let event = Event::new(&self.global(), name, bubbles, cancelable);
|
||||||
event.fire(self);
|
event.fire(self);
|
||||||
event
|
event
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,7 +94,7 @@ impl Runnable for DetailsNotificationRunnable {
|
||||||
fn handler(self: Box<DetailsNotificationRunnable>) {
|
fn handler(self: Box<DetailsNotificationRunnable>) {
|
||||||
let target = self.element.root();
|
let target = self.element.root();
|
||||||
if target.check_toggle_count(self.toggle_number) {
|
if target.check_toggle_count(self.toggle_number) {
|
||||||
target.upcast::<EventTarget>().fire_event("toggle");
|
target.upcast::<EventTarget>().fire_event(atom!("toggle"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,14 +304,14 @@ impl HTMLFormElement {
|
||||||
{
|
{
|
||||||
if self.interactive_validation().is_err() {
|
if self.interactive_validation().is_err() {
|
||||||
// TODO: Implement event handlers on all form control elements
|
// TODO: Implement event handlers on all form control elements
|
||||||
self.upcast::<EventTarget>().fire_event("invalid");
|
self.upcast::<EventTarget>().fire_event(atom!("invalid"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Step 5
|
// Step 5
|
||||||
if submit_method_flag == SubmittedFrom::NotFromForm {
|
if submit_method_flag == SubmittedFrom::NotFromForm {
|
||||||
let event = self.upcast::<EventTarget>()
|
let event = self.upcast::<EventTarget>()
|
||||||
.fire_bubbling_cancelable_event("submit");
|
.fire_bubbling_cancelable_event(atom!("submit"));
|
||||||
if event.DefaultPrevented() {
|
if event.DefaultPrevented() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -481,7 +481,7 @@ impl HTMLFormElement {
|
||||||
// Step 5-6
|
// Step 5-6
|
||||||
let unhandled_invalid_controls = invalid_controls.into_iter().filter_map(|field| {
|
let unhandled_invalid_controls = invalid_controls.into_iter().filter_map(|field| {
|
||||||
let event = field.as_event_target()
|
let event = field.as_event_target()
|
||||||
.fire_cancelable_event("invalid");
|
.fire_cancelable_event(atom!("invalid"));
|
||||||
if !event.DefaultPrevented() { return Some(field); }
|
if !event.DefaultPrevented() { return Some(field); }
|
||||||
None
|
None
|
||||||
}).collect::<Vec<FormSubmittableElement>>();
|
}).collect::<Vec<FormSubmittableElement>>();
|
||||||
|
@ -610,7 +610,7 @@ impl HTMLFormElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
let event = self.upcast::<EventTarget>()
|
let event = self.upcast::<EventTarget>()
|
||||||
.fire_bubbling_cancelable_event("reset");
|
.fire_bubbling_cancelable_event(atom!("reset"));
|
||||||
if event.DefaultPrevented() {
|
if event.DefaultPrevented() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,7 +239,7 @@ impl HTMLIFrameElement {
|
||||||
// TODO Step 3 - set child document `mut iframe load` flag
|
// TODO Step 3 - set child document `mut iframe load` flag
|
||||||
|
|
||||||
// Step 4
|
// Step 4
|
||||||
self.upcast::<EventTarget>().fire_event("load");
|
self.upcast::<EventTarget>().fire_event(atom!("load"));
|
||||||
|
|
||||||
let mut blocker = self.load_blocker.borrow_mut();
|
let mut blocker = self.load_blocker.borrow_mut();
|
||||||
LoadBlocker::terminate(&mut blocker);
|
LoadBlocker::terminate(&mut blocker);
|
||||||
|
|
|
@ -105,12 +105,12 @@ impl Runnable for ImageResponseHandlerRunnable {
|
||||||
|
|
||||||
// Fire image.onload
|
// Fire image.onload
|
||||||
if trigger_image_load {
|
if trigger_image_load {
|
||||||
element.upcast::<EventTarget>().fire_event("load");
|
element.upcast::<EventTarget>().fire_event(atom!("load"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fire image.onerror
|
// Fire image.onerror
|
||||||
if trigger_image_error {
|
if trigger_image_error {
|
||||||
element.upcast::<EventTarget>().fire_event("error");
|
element.upcast::<EventTarget>().fire_event(atom!("error"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Trigger reflow
|
// Trigger reflow
|
||||||
|
@ -180,8 +180,8 @@ impl HTMLImageElement {
|
||||||
// Step 11, substep 5
|
// Step 11, substep 5
|
||||||
let img = self.img.root();
|
let img = self.img.root();
|
||||||
img.current_request.borrow_mut().source_url = Some(self.src.into());
|
img.current_request.borrow_mut().source_url = Some(self.src.into());
|
||||||
img.upcast::<EventTarget>().fire_event("error");
|
img.upcast::<EventTarget>().fire_event(atom!("error"));
|
||||||
img.upcast::<EventTarget>().fire_event("loadend");
|
img.upcast::<EventTarget>().fire_event(atom!("loadend"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -849,8 +849,8 @@ impl HTMLInputElement {
|
||||||
let filelist = FileList::new(&window, files);
|
let filelist = FileList::new(&window, files);
|
||||||
self.filelist.set(Some(&filelist));
|
self.filelist.set(Some(&filelist));
|
||||||
|
|
||||||
target.fire_bubbling_event("input");
|
target.fire_bubbling_event(atom!("input"));
|
||||||
target.fire_bubbling_event("change");
|
target.fire_bubbling_event(atom!("change"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1286,8 +1286,8 @@ impl Activatable for HTMLInputElement {
|
||||||
// https://html.spec.whatwg.org/multipage/#radio-button-state-(type=radio):activation-behavior
|
// https://html.spec.whatwg.org/multipage/#radio-button-state-(type=radio):activation-behavior
|
||||||
// Check if document owner is fully active
|
// Check if document owner is fully active
|
||||||
let target = self.upcast::<EventTarget>();
|
let target = self.upcast::<EventTarget>();
|
||||||
target.fire_bubbling_event("input");
|
target.fire_bubbling_event(atom!("input"));
|
||||||
target.fire_bubbling_event("change");
|
target.fire_bubbling_event(atom!("change"));
|
||||||
},
|
},
|
||||||
InputType::InputFile => self.select_files(None),
|
InputType::InputFile => self.select_files(None),
|
||||||
_ => ()
|
_ => ()
|
||||||
|
|
|
@ -325,7 +325,7 @@ impl FetchResponseListener for StylesheetContext {
|
||||||
if let Some(ref meta) = self.metadata {
|
if let Some(ref meta) = self.metadata {
|
||||||
if let Some(Serde(ContentType(Mime(TopLevel::Text, SubLevel::Css, _)))) = meta.content_type {
|
if let Some(Serde(ContentType(Mime(TopLevel::Text, SubLevel::Css, _)))) = meta.content_type {
|
||||||
} else {
|
} else {
|
||||||
self.elem.root().upcast::<EventTarget>().fire_event("error");
|
self.elem.root().upcast::<EventTarget>().fire_event(atom!("error"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -380,7 +380,7 @@ impl FetchResponseListener for StylesheetContext {
|
||||||
|
|
||||||
document.finish_load(LoadType::Stylesheet(self.url.clone()));
|
document.finish_load(LoadType::Stylesheet(self.url.clone()));
|
||||||
|
|
||||||
let event = if successful { "load" } else { "error" };
|
let event = if successful { atom!("load") } else { atom!("error") };
|
||||||
|
|
||||||
elem.upcast::<EventTarget>().fire_event(event);
|
elem.upcast::<EventTarget>().fire_event(event);
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,7 +142,7 @@ impl WeakMediaQueryListVec {
|
||||||
pub fn evaluate_and_report_changes(&self) {
|
pub fn evaluate_and_report_changes(&self) {
|
||||||
for mql in self.cell.borrow().iter() {
|
for mql in self.cell.borrow().iter() {
|
||||||
if let MediaQueryListMatchState::Changed(_) = mql.root().unwrap().evaluate_changes() {
|
if let MediaQueryListMatchState::Changed(_) = mql.root().unwrap().evaluate_changes() {
|
||||||
mql.root().unwrap().upcast::<EventTarget>().fire_event("change");
|
mql.root().unwrap().upcast::<EventTarget>().fire_event(atom!("change"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ use dom::globalscope::GlobalScope;
|
||||||
use js::jsapi::{HandleValue, JSContext};
|
use js::jsapi::{HandleValue, JSContext};
|
||||||
use script_thread::Runnable;
|
use script_thread::Runnable;
|
||||||
use script_traits::{ScriptMsg, DOMMessage};
|
use script_traits::{ScriptMsg, DOMMessage};
|
||||||
|
use servo_atoms::Atom;
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
|
@ -56,12 +57,12 @@ impl ServiceWorker {
|
||||||
|
|
||||||
pub fn dispatch_simple_error(address: TrustedServiceWorkerAddress) {
|
pub fn dispatch_simple_error(address: TrustedServiceWorkerAddress) {
|
||||||
let service_worker = address.root();
|
let service_worker = address.root();
|
||||||
service_worker.upcast().fire_event("error");
|
service_worker.upcast().fire_event(atom!("error"));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_transition_state(&self, state: ServiceWorkerState) {
|
pub fn set_transition_state(&self, state: ServiceWorkerState) {
|
||||||
self.state.set(state);
|
self.state.set(state);
|
||||||
self.upcast::<EventTarget>().fire_event("statechange");
|
self.upcast::<EventTarget>().fire_event(Atom::from("statechange"));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_script_url(&self) -> Url {
|
pub fn get_script_url(&self) -> Url {
|
||||||
|
|
|
@ -15,6 +15,7 @@ use dom::promise::Promise;
|
||||||
use dom::serviceworker::ServiceWorker;
|
use dom::serviceworker::ServiceWorker;
|
||||||
use dom::serviceworkerregistration::ServiceWorkerRegistration;
|
use dom::serviceworkerregistration::ServiceWorkerRegistration;
|
||||||
use script_thread::ScriptThread;
|
use script_thread::ScriptThread;
|
||||||
|
use servo_atoms::Atom;
|
||||||
use std::ascii::AsciiExt;
|
use std::ascii::AsciiExt;
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
@ -45,7 +46,7 @@ pub trait Controllable {
|
||||||
impl Controllable for ServiceWorkerContainer {
|
impl Controllable for ServiceWorkerContainer {
|
||||||
fn set_controller(&self, active_worker: &ServiceWorker) {
|
fn set_controller(&self, active_worker: &ServiceWorker) {
|
||||||
self.controller.set(Some(active_worker));
|
self.controller.set(Some(active_worker));
|
||||||
self.upcast::<EventTarget>().fire_event("controllerchange");
|
self.upcast::<EventTarget>().fire_event(Atom::from("controllerchange"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ use net_traits::request::{CredentialsMode, Destination, RequestInit, Type as Req
|
||||||
use rand::random;
|
use rand::random;
|
||||||
use script_runtime::{CommonScriptMsg, StackRootTLS, get_reports, new_rt_and_cx, ScriptChan};
|
use script_runtime::{CommonScriptMsg, StackRootTLS, get_reports, new_rt_and_cx, ScriptChan};
|
||||||
use script_traits::{TimerEvent, WorkerGlobalScopeInit, ScopeThings, ServiceWorkerMsg, WorkerScriptLoadOrigin};
|
use script_traits::{TimerEvent, WorkerGlobalScopeInit, ScopeThings, ServiceWorkerMsg, WorkerScriptLoadOrigin};
|
||||||
|
use servo_atoms::Atom;
|
||||||
use std::sync::mpsc::{Receiver, RecvError, Select, Sender, channel};
|
use std::sync::mpsc::{Receiver, RecvError, Select, Sender, channel};
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
@ -268,7 +269,7 @@ impl ServiceWorkerGlobalScope {
|
||||||
// TODO XXXcreativcoder This will eventually use a FetchEvent interface to fire event
|
// TODO XXXcreativcoder This will eventually use a FetchEvent interface to fire event
|
||||||
// when we have the Request and Response dom api's implemented
|
// 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
|
// https://slightlyoff.github.io/ServiceWorker/spec/service_worker_1/index.html#fetch-event-section
|
||||||
self.upcast::<EventTarget>().fire_event("fetch");
|
self.upcast::<EventTarget>().fire_event(Atom::from("fetch"));
|
||||||
let _ = mediator.response_chan.send(None);
|
let _ = mediator.response_chan.send(None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -498,7 +498,7 @@ impl Runnable for ConnectionEstablishedTask {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 6.
|
// Step 6.
|
||||||
ws.upcast().fire_event("open");
|
ws.upcast().fire_event(atom!("open"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -548,7 +548,7 @@ impl Runnable for CloseTask {
|
||||||
|
|
||||||
// Step 2.
|
// Step 2.
|
||||||
if self.failed {
|
if self.failed {
|
||||||
ws.upcast().fire_event("error");
|
ws.upcast().fire_event(atom!("error"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 3.
|
// Step 3.
|
||||||
|
|
|
@ -138,7 +138,7 @@ impl Worker {
|
||||||
|
|
||||||
pub fn dispatch_simple_error(address: TrustedWorkerAddress) {
|
pub fn dispatch_simple_error(address: TrustedWorkerAddress) {
|
||||||
let worker = address.root();
|
let worker = address.root();
|
||||||
worker.upcast().fire_event("error");
|
worker.upcast().fire_event(atom!("error"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue