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