Initialize trusted-ness of DOM events properly

Fixes #3740
This commit is contained in:
Gilles Leblanc 2015-01-21 20:16:45 -05:00
parent 902c16497c
commit a1804effaf
11 changed files with 34 additions and 33 deletions

View file

@ -7,7 +7,7 @@ use dom::bindings::codegen::InheritTypes::{EventCast, EventTargetCast};
use dom::bindings::js::{JSRef, Temporary, OptionalRootable};
use dom::element::{Element, ActivationElementHelpers};
use dom::event::{Event, EventHelpers};
use dom::eventtarget::{EventTarget, EventTargetHelpers};
use dom::eventtarget::EventTarget;
use dom::mouseevent::MouseEvent;
use dom::node::window_from_node;
@ -53,8 +53,7 @@ pub trait Activatable : Copy {
0, 0, 0, 0, ctrlKey, shiftKey, altKey, metaKey,
0, None).root();
let event: JSRef<Event> = EventCast::from_ref(mouse.r());
event.set_trusted(true);
target.dispatch_event(event);
event.fire(target);
// Step 5
if event.DefaultPrevented() {

View file

@ -7,7 +7,6 @@ use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::DocumentBinding;
use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, DocumentReadyState};
use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods;
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
use dom::bindings::codegen::Bindings::NodeFilterBinding::NodeFilter;
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
@ -35,7 +34,7 @@ use dom::documenttype::DocumentType;
use dom::domimplementation::DOMImplementation;
use dom::element::{Element, ElementCreator, AttributeHandlers, get_attribute_parts};
use dom::element::ElementTypeId;
use dom::event::{Event, EventBubbles, EventCancelable};
use dom::event::{Event, EventBubbles, EventCancelable, EventHelpers};
use dom::eventtarget::{EventTarget, EventTargetTypeId, EventTargetHelpers};
use dom::htmlanchorelement::HTMLAnchorElement;
use dom::htmlcollection::{HTMLCollection, CollectionFilter};
@ -344,7 +343,7 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> {
EventBubbles::DoesNotBubble,
EventCancelable::NotCancelable).root();
let target: JSRef<EventTarget> = EventTargetCast::from_ref(self);
let _ = target.DispatchEvent(event.r());
let _ = event.r().fire(target);
}
/// Return the element that currently has focus.

View file

@ -32,8 +32,8 @@ use dom::domrect::DOMRect;
use dom::domrectlist::DOMRectList;
use dom::document::{Document, DocumentHelpers, LayoutDocumentHelpers};
use dom::domtokenlist::DOMTokenList;
use dom::event::Event;
use dom::eventtarget::{EventTarget, EventTargetTypeId, EventTargetHelpers};
use dom::event::{Event, EventHelpers};
use dom::eventtarget::{EventTarget, EventTargetTypeId};
use dom::htmlbodyelement::{HTMLBodyElement, HTMLBodyElementHelpers};
use dom::htmlcollection::HTMLCollection;
use dom::htmlelement::HTMLElementTypeId;
@ -1512,7 +1512,7 @@ impl<'a> ActivationElementHelpers<'a> for JSRef<'a, Element> {
Some(elem) => {
// Step 5-6
elem.pre_click_activation();
target.dispatch_event(event);
event.fire(target);
if !event.DefaultPrevented() {
// post click activation
elem.activation_behavior();
@ -1521,10 +1521,10 @@ impl<'a> ActivationElementHelpers<'a> for JSRef<'a, Element> {
}
}
// Step 6
None => {target.dispatch_event(event);}
None => {event.fire(target);}
},
// Step 6
None => {target.dispatch_event(event);}
None => {event.fire(target);}
}
// Step 7
self.set_click_in_progress(false);

View file

@ -9,7 +9,7 @@ use dom::bindings::error::Fallible;
use dom::bindings::global::GlobalRef;
use dom::bindings::js::{MutNullableJS, JSRef, Temporary};
use dom::bindings::utils::{Reflector, reflect_dom_object};
use dom::eventtarget::EventTarget;
use dom::eventtarget::{EventTarget, EventTargetHelpers};
use util::str::DOMString;
use std::borrow::ToOwned;
@ -245,10 +245,17 @@ impl<'a> EventMethods for JSRef<'a, Event> {
pub trait EventHelpers {
fn set_trusted(self, trusted: bool);
fn fire(self, target: JSRef<EventTarget>);
}
impl<'a> EventHelpers for JSRef<'a, Event> {
fn set_trusted(self, trusted: bool) {
self.trusted.set(trusted);
}
// https://html.spec.whatwg.org/multipage/webappapis.html#fire-a-simple-event
fn fire(self, target: JSRef<EventTarget>) {
self.set_trusted(true);
target.dispatch_event(self);
}
}

View file

@ -11,7 +11,7 @@ use dom::bindings::error::{Fallible, report_pending_exception};
use dom::bindings::error::Error::InvalidState;
use dom::bindings::js::JSRef;
use dom::bindings::utils::{Reflectable, Reflector};
use dom::event::Event;
use dom::event::{Event, EventHelpers};
use dom::eventdispatcher::dispatch_event;
use dom::node::NodeTypeId;
use dom::workerglobalscope::WorkerGlobalScopeTypeId;
@ -303,6 +303,7 @@ impl<'a> EventTargetMethods for JSRef<'a, EventTarget> {
if event.dispatching() || !event.initialized() {
return Err(InvalidState);
}
event.set_trusted(false);
Ok(self.dispatch_event(event))
}
}

View file

@ -4,7 +4,6 @@
use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
use dom::bindings::codegen::Bindings::EventBinding::EventMethods;
use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods;
use dom::bindings::codegen::Bindings::HTMLFormElementBinding;
use dom::bindings::codegen::Bindings::HTMLFormElementBinding::HTMLFormElementMethods;
use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods;
@ -165,9 +164,8 @@ impl<'a> HTMLFormElementHelpers for JSRef<'a, HTMLFormElement> {
"submit".to_owned(),
EventBubbles::Bubbles,
EventCancelable::Cancelable).root();
event.r().set_trusted(true);
let target: JSRef<EventTarget> = EventTargetCast::from_ref(self);
target.DispatchEvent(event.r()).ok();
event.r().fire(target);
if event.r().DefaultPrevented() {
return;
}
@ -353,7 +351,7 @@ impl<'a> HTMLFormElementHelpers for JSRef<'a, HTMLFormElement> {
EventBubbles::Bubbles,
EventCancelable::Cancelable).root();
let target: JSRef<EventTarget> = EventTargetCast::from_ref(self);
target.DispatchEvent(event.r()).ok();
event.r().fire(target);
if event.r().DefaultPrevented() {
return;
}

View file

@ -8,7 +8,6 @@ use dom::attr::AttrHelpers;
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::AttrBinding::AttrMethods;
use dom::bindings::codegen::Bindings::EventBinding::EventMethods;
use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods;
use dom::bindings::codegen::Bindings::HTMLInputElementBinding;
use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods;
use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast, HTMLInputElementCast, NodeCast};
@ -763,17 +762,15 @@ impl<'a> Activatable for JSRef<'a, HTMLInputElement> {
"input".to_owned(),
EventBubbles::Bubbles,
EventCancelable::NotCancelable).root();
event.r().set_trusted(true);
let target: JSRef<EventTarget> = EventTargetCast::from_ref(*self);
target.DispatchEvent(event.r()).ok();
event.r().fire(target);
let event = Event::new(GlobalRef::Window(win.r()),
"change".to_owned(),
EventBubbles::Bubbles,
EventCancelable::NotCancelable).root();
event.r().set_trusted(true);
let target: JSRef<EventTarget> = EventTargetCast::from_ref(*self);
target.DispatchEvent(event.r()).ok();
event.r().fire(target);
}
},
_ => ()

View file

@ -18,7 +18,7 @@ use dom::bindings::js::{JSRef, Temporary, OptionalRootable};
use dom::bindings::refcounted::Trusted;
use dom::document::Document;
use dom::element::{Element, AttributeHandlers, ElementCreator};
use dom::eventtarget::{EventTarget, EventTargetTypeId, EventTargetHelpers};
use dom::eventtarget::{EventTarget, EventTargetTypeId};
use dom::event::{Event, EventBubbles, EventCancelable, EventHelpers};
use dom::element::ElementTypeId;
use dom::htmlelement::{HTMLElement, HTMLElementTypeId};
@ -243,9 +243,8 @@ impl<'a> HTMLScriptElementHelpers for JSRef<'a, HTMLScriptElement> {
"load".to_owned(),
EventBubbles::DoesNotBubble,
EventCancelable::NotCancelable).root();
event.r().set_trusted(true);
let target: JSRef<EventTarget> = EventTargetCast::from_ref(self);
target.dispatch_event(event.r());
event.r().fire(target);
}
fn is_javascript(self) -> bool {

View file

@ -10,8 +10,8 @@ use dom::bindings::error::Fallible;
use dom::bindings::global::GlobalRef;
use dom::bindings::js::{JSRef, Temporary};
use dom::bindings::utils::reflect_dom_object;
use dom::event::{Event, EventTypeId};
use dom::eventtarget::{EventTarget, EventTargetHelpers};
use dom::event::{Event, EventHelpers, EventTypeId};
use dom::eventtarget::EventTarget;
use util::str::DOMString;
@ -83,7 +83,7 @@ impl MessageEvent {
scope, "message".to_owned(), false, false, message,
"".to_owned(), "".to_owned()).root();
let event: JSRef<Event> = EventCast::from_ref(messageevent.r());
target.dispatch_event(event);
event.fire(target);
}
}

View file

@ -19,7 +19,7 @@ use dom::bindings::refcounted::Trusted;
use dom::bindings::str::ByteString;
use dom::bindings::utils::{Reflectable, reflect_dom_object};
use dom::document::Document;
use dom::event::{Event, EventBubbles, EventCancelable};
use dom::event::{Event, EventBubbles, EventCancelable, EventHelpers};
use dom::eventtarget::{EventTarget, EventTargetHelpers, EventTargetTypeId};
use dom::progressevent::ProgressEvent;
use dom::urlsearchparams::URLSearchParamsHelpers;
@ -792,7 +792,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
EventBubbles::DoesNotBubble,
EventCancelable::Cancelable).root();
let target: JSRef<EventTarget> = EventTargetCast::from_ref(self);
target.dispatch_event(event.r());
event.r().fire(target);
}
fn process_partial_response(self, progress: XHRProgress) {
@ -932,7 +932,7 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
EventTargetCast::from_ref(self)
};
let event: JSRef<Event> = EventCast::from_ref(progressevent.r());
target.dispatch_event(event);
event.fire(target);
}
fn dispatch_upload_progress_event(self, type_: DOMString, partial_load: Option<u64>) {

View file

@ -1121,7 +1121,7 @@ impl ScriptTask {
let event: JSRef<Event> = EventCast::from_ref(uievent.r());
let wintarget: JSRef<EventTarget> = EventTargetCast::from_ref(window.r());
wintarget.dispatch_event(event);
event.fire(wintarget);
}
None => ()
}
@ -1231,7 +1231,7 @@ impl ScriptTask {
let event: JSRef<Event> = EventCast::from_ref(mouse_event.r());
let target: JSRef<EventTarget> = EventTargetCast::from_ref(top_most_node.r());
target.dispatch_event(event);
event.fire(target);
}
}
@ -1391,6 +1391,7 @@ impl DocumentProgressHandler {
EventCancelable::NotCancelable).root();
let wintarget: JSRef<EventTarget> = EventTargetCast::from_ref(window.r());
let doctarget: JSRef<EventTarget> = EventTargetCast::from_ref(document.r());
event.set_trusted(true);
let _ = wintarget.dispatch_event_with_target(doctarget, event.r());
}
}