aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/htmlformelement.rs72
-rw-r--r--components/script/dom/webidls/HTMLFormElement.webidl2
-rw-r--r--tests/html/form_reset_handsfree.html23
3 files changed, 96 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();
diff --git a/tests/html/form_reset_handsfree.html b/tests/html/form_reset_handsfree.html
new file mode 100644
index 00000000000..4ba72451f09
--- /dev/null
+++ b/tests/html/form_reset_handsfree.html
@@ -0,0 +1,23 @@
+<html>
+<head></head>
+<body>
+<!-- Run with nc -l 8000 -->
+<form action="http://localhost:8000" method=get id="foo">
+<input name=bar type=checkbox checked>
+<input name=baz value="baz1" type=radio checked>
+<input name=baz value="baz2" type=radio>
+<input type=text id=hi name=bye value="hi!">
+<input type=text id=aloha name=empty value="">
+<input type=text id=welcome name=reallyempty>
+<script>
+// setTimeout because https://github.com/servo/servo/issues/3628
+setTimeout(function(){
+ document.getElementById("hi").value=("bloop");
+ document.getElementById("aloha").value=("bloop");
+ document.getElementById("welcome").value=("bloop");
+ setTimeout(function(){document.getElementById("foo").reset()},2000);
+},2000)
+</script>
+</form>
+</body>
+</html>