From a1804effaf4f633e92572697135fb0afff6ee367 Mon Sep 17 00:00:00 2001 From: Gilles Leblanc Date: Wed, 21 Jan 2015 20:16:45 -0500 Subject: [PATCH] Initialize trusted-ness of DOM events properly Fixes #3740 --- components/script/dom/activation.rs | 5 ++--- components/script/dom/document.rs | 5 ++--- components/script/dom/element.rs | 10 +++++----- components/script/dom/event.rs | 9 ++++++++- components/script/dom/eventtarget.rs | 3 ++- components/script/dom/htmlformelement.rs | 6 ++---- components/script/dom/htmlinputelement.rs | 7 ++----- components/script/dom/htmlscriptelement.rs | 5 ++--- components/script/dom/messageevent.rs | 6 +++--- components/script/dom/xmlhttprequest.rs | 6 +++--- components/script/script_task.rs | 5 +++-- 11 files changed, 34 insertions(+), 33 deletions(-) diff --git a/components/script/dom/activation.rs b/components/script/dom/activation.rs index 9bd7d4d8f36..842b776e48a 100644 --- a/components/script/dom/activation.rs +++ b/components/script/dom/activation.rs @@ -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 = EventCast::from_ref(mouse.r()); - event.set_trusted(true); - target.dispatch_event(event); + event.fire(target); // Step 5 if event.DefaultPrevented() { diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 47369b8a30c..b6a5659a88a 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -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 = EventTargetCast::from_ref(self); - let _ = target.DispatchEvent(event.r()); + let _ = event.r().fire(target); } /// Return the element that currently has focus. diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 943e4139dde..b1b458bad40 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -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); diff --git a/components/script/dom/event.rs b/components/script/dom/event.rs index 0cb8dbb6a29..7c9d73675d1 100644 --- a/components/script/dom/event.rs +++ b/components/script/dom/event.rs @@ -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); } 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) { + self.set_trusted(true); + target.dispatch_event(self); + } } diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index b2c8ca5187f..ee4fd3b2745 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -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)) } } diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index be296d04c15..5f0ec3f212a 100644 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -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 = 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 = EventTargetCast::from_ref(self); - target.DispatchEvent(event.r()).ok(); + event.r().fire(target); if event.r().DefaultPrevented() { return; } diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index a6622cd87f1..d8bfc492f42 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -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 = 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 = EventTargetCast::from_ref(*self); - target.DispatchEvent(event.r()).ok(); + event.r().fire(target); } }, _ => () diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index c1f933e362b..62a84450f9c 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -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 = EventTargetCast::from_ref(self); - target.dispatch_event(event.r()); + event.r().fire(target); } fn is_javascript(self) -> bool { diff --git a/components/script/dom/messageevent.rs b/components/script/dom/messageevent.rs index b474efb7385..09f0ac9eab0 100644 --- a/components/script/dom/messageevent.rs +++ b/components/script/dom/messageevent.rs @@ -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 = EventCast::from_ref(messageevent.r()); - target.dispatch_event(event); + event.fire(target); } } diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index bd7d947b6bf..a32045cff75 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -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 = 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 = EventCast::from_ref(progressevent.r()); - target.dispatch_event(event); + event.fire(target); } fn dispatch_upload_progress_event(self, type_: DOMString, partial_load: Option) { diff --git a/components/script/script_task.rs b/components/script/script_task.rs index b5d349164d9..35f85f593c9 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -1121,7 +1121,7 @@ impl ScriptTask { let event: JSRef = EventCast::from_ref(uievent.r()); let wintarget: JSRef = EventTargetCast::from_ref(window.r()); - wintarget.dispatch_event(event); + event.fire(wintarget); } None => () } @@ -1231,7 +1231,7 @@ impl ScriptTask { let event: JSRef = EventCast::from_ref(mouse_event.r()); let target: JSRef = 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 = EventTargetCast::from_ref(window.r()); let doctarget: JSRef = EventTargetCast::from_ref(document.r()); + event.set_trusted(true); let _ = wintarget.dispatch_event_with_target(doctarget, event.r()); } }