aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorMatthew Rasmus <mattr@zzntd.com>2014-11-27 15:48:01 -0800
committerMatthew Rasmus <mattr@zzntd.com>2014-12-16 11:33:56 -0800
commitf0ce2af89ce264ddb707c67822ae1f4e4fb622e8 (patch)
tree32f9f353d8f4f4740ad5733e153e9d328fb0ede5 /components/script
parentf932a6947a0c5df0ab82bbeebf0a289ab2fc1ae8 (diff)
downloadservo-f0ce2af89ce264ddb707c67822ae1f4e4fb622e8.tar.gz
servo-f0ce2af89ce264ddb707c67822ae1f4e4fb622e8.zip
Implements basic form resetting
What can this do? Reset `<input type=text>` fields back to their default value through a call to a form's reset method. That's all for now! Fixes compile error after rebase
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/htmlformelement.rs72
-rw-r--r--components/script/dom/webidls/HTMLFormElement.webidl2
2 files changed, 73 insertions, 1 deletions
diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs
index 1d12bdebf39..a08b8eec270 100644
--- a/components/script/dom/htmlformelement.rs
+++ b/components/script/dom/htmlformelement.rs
@@ -15,6 +15,7 @@ use dom::bindings::utils::{Reflectable, Reflector};
use dom::document::{Document, DocumentHelpers};
use dom::element::{Element, AttributeHandlers, HTMLFormElementTypeId, HTMLTextAreaElementTypeId, HTMLDataListElementTypeId};
use dom::element::{HTMLInputElementTypeId, HTMLButtonElementTypeId, HTMLObjectElementTypeId, HTMLSelectElementTypeId};
+use dom::element::{HTMLOutputElementTypeId};
use dom::event::{Event, EventHelpers, Bubbles, Cancelable};
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
@@ -117,6 +118,11 @@ impl<'a> HTMLFormElementMethods for JSRef<'a, HTMLFormElement> {
fn Submit(self) {
self.submit(FromFormSubmitMethod, FormElement(self));
}
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-form-reset
+ fn Reset(self) {
+ self.reset(FromFormResetMethod);
+ }
}
pub enum SubmittedFrom {
@@ -124,11 +130,18 @@ pub enum SubmittedFrom {
NotFromFormSubmitMethod
}
+pub enum ResetFrom {
+ FromFormResetMethod,
+ NotFromFormResetMethod
+}
+
pub trait HTMLFormElementHelpers {
// https://html.spec.whatwg.org/multipage/forms.html#concept-form-submit
fn submit(self, submit_method_flag: SubmittedFrom, submitter: FormSubmitter);
// https://html.spec.whatwg.org/multipage/forms.html#constructing-the-form-data-set
fn get_form_dataset(self, submitter: Option<FormSubmitter>) -> Vec<FormDatum>;
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-form-reset
+ fn reset(self, submit_method_flag: ResetFrom);
}
impl<'a> HTMLFormElementHelpers for JSRef<'a, HTMLFormElement> {
@@ -316,6 +329,65 @@ impl<'a> HTMLFormElementHelpers for JSRef<'a, HTMLFormElement> {
};
ret
}
+
+ fn reset(self, _reset_method_flag: ResetFrom) {
+ let win = window_from_node(self).root();
+ let event = Event::new(Window(*win),
+ "reset".to_string(),
+ Bubbles, Cancelable).root();
+ let target: JSRef<EventTarget> = EventTargetCast::from_ref(self);
+ target.DispatchEvent(*event).ok();
+ if event.DefaultPrevented() {
+ return;
+ }
+
+ let node: JSRef<Node> = NodeCast::from_ref(self);
+
+ // TODO: This is an incorrect way of getting controls owned
+ // by the form, but good enough until html5ever lands
+ for child in node.traverse_preorder() {
+ // TODO This is the wrong place to do this. Each resettable
+ // element should implement its own reset method (trait?)
+ //
+ // List of resettable elements:
+ // https://html.spec.whatwg.org/multipage/forms.html#category-reset
+ match child.type_id() {
+ ElementNodeTypeId(HTMLInputElementTypeId) => {
+ let input: JSRef<HTMLInputElement> = HTMLInputElementCast::to_ref(child)
+ .unwrap();
+ let ty = input.Type();
+
+ match ty.as_slice() {
+ "radio" | "checkbox" => {
+ // TODO Reset radios/checkboxes here
+ },
+ "image" => (),
+ _ => ()
+ }
+
+ input.SetValue(input.DefaultValue());
+ }
+ // TODO HTMLKeygenElement unimplemented
+ /*ElementNodeTypeID(HTMLKeygenElementTypeId) => {
+ // Unimplemented
+ {}
+ }*/
+ ElementNodeTypeId(HTMLSelectElementTypeId) => {
+ // Unimplemented
+ {}
+ }
+ ElementNodeTypeId(HTMLTextAreaElementTypeId) => {
+ // Unimplemented
+ {}
+ }
+ ElementNodeTypeId(HTMLOutputElementTypeId) => {
+ // Unimplemented
+ {}
+ }
+ _ => {}
+ }
+ };
+ }
}
impl Reflectable for HTMLFormElement {
diff --git a/components/script/dom/webidls/HTMLFormElement.webidl b/components/script/dom/webidls/HTMLFormElement.webidl
index 1971680b5be..ce64cac7ec6 100644
--- a/components/script/dom/webidls/HTMLFormElement.webidl
+++ b/components/script/dom/webidls/HTMLFormElement.webidl
@@ -22,7 +22,7 @@ interface HTMLFormElement : HTMLElement {
//getter (RadioNodeList or Element) (DOMString name);
void submit();
- //void reset();
+ void reset();
//boolean checkValidity();
//boolean reportValidity();