diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs
index d0647839a47e..bf2fd4f2de4b 100644
--- a/components/script/dom/htmlformelement.rs
+++ b/components/script/dom/htmlformelement.rs
@@ -3,20 +3,24 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::Bindings::HTMLFormElementBinding;
-use dom::bindings::codegen::InheritTypes::HTMLFormElementDerived;
+use dom::bindings::codegen::Bindings::HTMLFormElementBinding::HTMLFormElementMethods;
+use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLFormElementDerived};
use dom::bindings::js::{JSRef, Temporary};
use dom::bindings::utils::{Reflectable, Reflector};
-use dom::document::Document;
-use dom::element::HTMLFormElementTypeId;
+use dom::document::{Document, DocumentHelpers};
+use dom::element::{Element, AttributeHandlers, HTMLFormElementTypeId};
use dom::eventtarget::{EventTarget, NodeTargetTypeId};
use dom::htmlelement::HTMLElement;
-use dom::node::{Node, ElementNodeTypeId};
+use dom::node::{Node, ElementNodeTypeId, document_from_node};
use servo_util::str::DOMString;
+use std::ascii::OwnedStrAsciiExt;
+use url::UrlParser;
+
#[jstraceable]
#[must_root]
pub struct HTMLFormElement {
- pub htmlelement: HTMLElement
+ pub htmlelement: HTMLElement,
}
impl HTMLFormElementDerived for EventTarget {
@@ -39,6 +43,100 @@ impl HTMLFormElement {
}
}
+impl<'a> HTMLFormElementMethods for JSRef<'a, HTMLFormElement> {
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-form-acceptcharset
+ make_getter!(AcceptCharset, "accept-charset")
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-form-acceptcharset
+ make_setter!(SetAcceptCharset, "accept-charset")
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-fs-action
+ fn Action(self) -> DOMString {
+ let elem: JSRef = ElementCast::from_ref(self);
+ let action = elem.get_string_attribute("action");
+ let doc = document_from_node(self).root();
+ let base = doc.url();
+ // https://html.spec.whatwg.org/multipage/infrastructure.html#reflect
+ match UrlParser::new().base_url(base).parse(action.as_slice()) {
+ Ok(parsed) => parsed.serialize(),
+ Err(_) => base.serialize()
+ }
+ }
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-fs-action
+ make_setter!(SetAction, "action")
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-form-autocomplete
+ fn Autocomplete(self) -> DOMString {
+ let elem: JSRef = ElementCast::from_ref(self);
+ let ac = elem.get_string_attribute("autocomplete").into_ascii_lower();
+ // https://html.spec.whatwg.org/multipage/forms.html#attr-form-autocomplete
+ match ac.as_slice() {
+ "off" => ac,
+ _ => "on".to_string()
+ }
+ }
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-form-autocomplete
+ make_setter!(SetAutocomplete, "autocomplete")
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-fs-enctype
+ fn Enctype(self) -> DOMString {
+ let elem: JSRef = ElementCast::from_ref(self);
+ let enctype = elem.get_string_attribute("enctype").into_ascii_lower();
+ // https://html.spec.whatwg.org/multipage/forms.html#attr-fs-enctype
+ match enctype.as_slice() {
+ "text/plain" | "multipart/form-data" => enctype,
+ _ => "application/x-www-form-urlencoded".to_string()
+ }
+ }
+
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-fs-enctype
+ make_setter!(SetEnctype, "enctype")
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-fs-encoding
+ fn Encoding(self) -> DOMString {
+ self.Enctype()
+ }
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-fs-encoding
+ fn SetEncoding(self, value: DOMString) {
+ self.SetEnctype(value)
+ }
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-fs-method
+ fn Method(self) -> DOMString {
+ let elem: JSRef = ElementCast::from_ref(self);
+ let method = elem.get_string_attribute("method").into_ascii_lower();
+ // https://html.spec.whatwg.org/multipage/forms.html#attr-fs-method
+ match method.as_slice() {
+ "post" | "dialog" => method,
+ _ => "get".to_string()
+ }
+ }
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-fs-method
+ make_setter!(SetMethod, "method")
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-form-name
+ make_getter!(Name)
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-form-name
+ make_setter!(SetName, "name")
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-fs-novalidate
+ make_bool_getter!(NoValidate)
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-fs-novalidate
+ make_bool_setter!(SetNoValidate, "novalidate")
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-fs-target
+ make_getter!(Target)
+
+ // https://html.spec.whatwg.org/multipage/forms.html#dom-fs-target
+ make_setter!(SetTarget, "target")
+}
impl Reflectable for HTMLFormElement {
fn reflector<'a>(&'a self) -> &'a Reflector {
self.htmlelement.reflector()
diff --git a/components/script/dom/webidls/HTMLFormElement.webidl b/components/script/dom/webidls/HTMLFormElement.webidl
index ffa36bc4d6b6..0878a6931a28 100644
--- a/components/script/dom/webidls/HTMLFormElement.webidl
+++ b/components/script/dom/webidls/HTMLFormElement.webidl
@@ -6,15 +6,15 @@
// http://www.whatwg.org/html/#htmlformelement
//[OverrideBuiltins]
interface HTMLFormElement : HTMLElement {
- // attribute DOMString acceptCharset;
- // attribute DOMString action;
- // attribute DOMString autocomplete;
- // attribute DOMString enctype;
- // attribute DOMString encoding;
- // attribute DOMString method;
- // attribute DOMString name;
- // attribute boolean noValidate;
- // attribute DOMString target;
+ attribute DOMString acceptCharset;
+ attribute DOMString action;
+ attribute DOMString autocomplete;
+ attribute DOMString enctype;
+ attribute DOMString encoding;
+ attribute DOMString method;
+ attribute DOMString name;
+ attribute boolean noValidate;
+ attribute DOMString target;
//readonly attribute HTMLFormControlsCollection elements;
//readonly attribute long length;
diff --git a/tests/wpt/metadata/dom/nodes/case.html.ini b/tests/wpt/metadata/dom/nodes/case.html.ini
deleted file mode 100644
index 181257c9eef1..000000000000
--- a/tests/wpt/metadata/dom/nodes/case.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[case.html]
- type: testharness
-
diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini
index 050400abefe2..2f50c0d40bec 100644
--- a/tests/wpt/metadata/html/dom/interfaces.html.ini
+++ b/tests/wpt/metadata/html/dom/interfaces.html.ini
@@ -5397,33 +5397,6 @@
[HTMLTableCellElement interface: attribute bgColor]
expected: FAIL
- [HTMLFormElement interface: attribute acceptCharset]
- expected: FAIL
-
- [HTMLFormElement interface: attribute action]
- expected: FAIL
-
- [HTMLFormElement interface: attribute autocomplete]
- expected: FAIL
-
- [HTMLFormElement interface: attribute enctype]
- expected: FAIL
-
- [HTMLFormElement interface: attribute encoding]
- expected: FAIL
-
- [HTMLFormElement interface: attribute method]
- expected: FAIL
-
- [HTMLFormElement interface: attribute name]
- expected: FAIL
-
- [HTMLFormElement interface: attribute noValidate]
- expected: FAIL
-
- [HTMLFormElement interface: attribute target]
- expected: FAIL
-
[HTMLFormElement interface: attribute elements]
expected: FAIL
@@ -5445,33 +5418,6 @@
[HTMLFormElement interface: operation requestAutocomplete()]
expected: FAIL
- [HTMLFormElement interface: document.createElement("form") must inherit property "acceptCharset" with the proper type (0)]
- expected: FAIL
-
- [HTMLFormElement interface: document.createElement("form") must inherit property "action" with the proper type (1)]
- expected: FAIL
-
- [HTMLFormElement interface: document.createElement("form") must inherit property "autocomplete" with the proper type (2)]
- expected: FAIL
-
- [HTMLFormElement interface: document.createElement("form") must inherit property "enctype" with the proper type (3)]
- expected: FAIL
-
- [HTMLFormElement interface: document.createElement("form") must inherit property "encoding" with the proper type (4)]
- expected: FAIL
-
- [HTMLFormElement interface: document.createElement("form") must inherit property "method" with the proper type (5)]
- expected: FAIL
-
- [HTMLFormElement interface: document.createElement("form") must inherit property "name" with the proper type (6)]
- expected: FAIL
-
- [HTMLFormElement interface: document.createElement("form") must inherit property "noValidate" with the proper type (7)]
- expected: FAIL
-
- [HTMLFormElement interface: document.createElement("form") must inherit property "target" with the proper type (8)]
- expected: FAIL
-
[HTMLFormElement interface: document.createElement("form") must inherit property "elements" with the proper type (9)]
expected: FAIL