From a8f9887d8634da3862b150e91cb4eb4ebeb09c2a Mon Sep 17 00:00:00 2001 From: Adrian Utrilla Date: Sun, 3 Apr 2016 18:25:40 +0200 Subject: [PATCH] Added .form property for legend tag --- components/script/dom/htmllegendelement.rs | 70 ++++++++++++++++--- .../dom/webidls/HTMLLegendElement.webidl | 2 +- .../wpt/metadata/html/dom/interfaces.html.ini | 6 -- .../the-legend-element/legend-form.html.ini | 5 -- .../forms/the-legend-element/legend-form.html | 14 +++- 5 files changed, 73 insertions(+), 24 deletions(-) delete mode 100644 tests/wpt/metadata/html/semantics/forms/the-legend-element/legend-form.html.ini diff --git a/components/script/dom/htmllegendelement.rs b/components/script/dom/htmllegendelement.rs index 8686c5a4c10..343f28f9c65 100644 --- a/components/script/dom/htmllegendelement.rs +++ b/components/script/dom/htmllegendelement.rs @@ -1,12 +1,20 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. +use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; use dom::bindings::codegen::Bindings::HTMLLegendElementBinding; +use dom::bindings::codegen::Bindings::HTMLLegendElementBinding::HTMLLegendElementMethods; +use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; +use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::document::Document; +use dom::element::Element; use dom::htmlelement::HTMLElement; -use dom::node::Node; +use dom::htmlfieldsetelement::HTMLFieldSetElement; +use dom::htmlformelement::{HTMLFormElement, FormControl}; +use dom::node::{ChildrenMutation, Node, NodeDamage, UnbindContext}; +use dom::virtualmethods::VirtualMethods; use string_cache::Atom; use util::str::DOMString; @@ -18,18 +26,60 @@ pub struct HTMLLegendElement { impl HTMLLegendElement { fn new_inherited(localName: Atom, prefix: Option, - document: &Document) -> HTMLLegendElement { - HTMLLegendElement { - htmlelement: - HTMLElement::new_inherited(localName, prefix, document) - } + document: &Document) + -> HTMLLegendElement { + HTMLLegendElement { htmlelement: HTMLElement::new_inherited(localName, prefix, document) } } #[allow(unrooted_must_root)] pub fn new(localName: Atom, prefix: Option, - document: &Document) -> Root { + document: &Document) + -> Root { let element = HTMLLegendElement::new_inherited(localName, prefix, document); Node::reflect_node(box element, document, HTMLLegendElementBinding::Wrap) } } + +impl VirtualMethods for HTMLLegendElement { + fn super_type(&self) -> Option<&VirtualMethods> { + Some(self.upcast::() as &VirtualMethods) + } + + fn bind_to_tree(&self, tree_in_doc: bool) { + if let Some(ref s) = self.super_type() { + s.bind_to_tree(tree_in_doc); + } + + self.upcast::().check_ancestors_disabled_state_for_form_control(); + } + + fn unbind_from_tree(&self, context: &UnbindContext) { + self.super_type().unwrap().unbind_from_tree(context); + + let node = self.upcast::(); + let el = self.upcast::(); + if node.ancestors().any(|ancestor| ancestor.is::()) { + el.check_ancestors_disabled_state_for_form_control(); + } else { + el.check_disabled_attribute(); + } + } +} + + +impl HTMLLegendElementMethods for HTMLLegendElement { + // https://html.spec.whatwg.org/multipage/#dom-legend-form + fn GetForm(&self) -> Option> { + let parent = match self.upcast::().GetParentElement() { + Some(parent) => parent, + None => return None, + }; + if parent.is::() { + return self.form_owner(); + } + None + } +} + +impl FormControl for HTMLLegendElement {} diff --git a/components/script/dom/webidls/HTMLLegendElement.webidl b/components/script/dom/webidls/HTMLLegendElement.webidl index 8c8b55c3e14..0fa9227975b 100644 --- a/components/script/dom/webidls/HTMLLegendElement.webidl +++ b/components/script/dom/webidls/HTMLLegendElement.webidl @@ -5,7 +5,7 @@ // https://html.spec.whatwg.org/multipage/#htmllegendelement interface HTMLLegendElement : HTMLElement { - //readonly attribute HTMLFormElement? form; + readonly attribute HTMLFormElement? form; // also has obsolete members }; diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini index f8bce1adc76..8a287c9c996 100644 --- a/tests/wpt/metadata/html/dom/interfaces.html.ini +++ b/tests/wpt/metadata/html/dom/interfaces.html.ini @@ -5319,15 +5319,9 @@ [HTMLFieldSetElement interface: operation setCustomValidity(DOMString)] expected: FAIL - [HTMLLegendElement interface: attribute form] - expected: FAIL - [HTMLLegendElement interface: attribute align] expected: FAIL - [HTMLLegendElement interface: document.createElement("legend") must inherit property "form" with the proper type (0)] - expected: FAIL - [HTMLLegendElement interface: document.createElement("legend") must inherit property "align" with the proper type (1)] expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/forms/the-legend-element/legend-form.html.ini b/tests/wpt/metadata/html/semantics/forms/the-legend-element/legend-form.html.ini deleted file mode 100644 index 9fccac3e419..00000000000 --- a/tests/wpt/metadata/html/semantics/forms/the-legend-element/legend-form.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[legend-form.html] - type: testharness - [Check if legend.form return null when legend has no fieldset element as its parent] - expected: FAIL - diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-legend-element/legend-form.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-legend-element/legend-form.html index 60d7e4dbdfa..b127164aed0 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/the-legend-element/legend-form.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-legend-element/legend-form.html @@ -13,11 +13,21 @@ +
+
+
+ radio +
+
+