From 9df375195eb389ae851acac525bc00f10421d36b Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Sat, 10 Oct 2015 13:44:28 -0400 Subject: [PATCH] Implement 'labels' attribute on 'labelable elements' --- components/script/dom/htmlbuttonelement.rs | 6 ++ components/script/dom/htmlelement.rs | 44 +++++++++++++- components/script/dom/htmlinputelement.rs | 11 ++++ components/script/dom/htmllabelelement.rs | 2 +- components/script/dom/htmlmeterelement.rs | 11 +++- components/script/dom/htmloutputelement.rs | 7 +++ components/script/dom/htmlprogresselement.rs | 11 +++- components/script/dom/htmlselectelement.rs | 6 ++ components/script/dom/htmltextareaelement.rs | 6 ++ components/script/dom/nodelist.rs | 4 ++ .../dom/webidls/HTMLButtonElement.webidl | 2 +- .../dom/webidls/HTMLInputElement.webidl | 2 +- .../dom/webidls/HTMLMeterElement.webidl | 2 +- .../dom/webidls/HTMLOutputElement.webidl | 2 +- .../dom/webidls/HTMLProgressElement.webidl | 2 +- .../dom/webidls/HTMLSelectElement.webidl | 2 +- .../dom/webidls/HTMLTextAreaElement.webidl | 2 +- .../wpt/metadata/html/dom/interfaces.html.ini | 42 ------------- .../label-attributes.html.ini | 9 --- .../labelable-elements.html.ini | 3 + .../the-label-element/label-attributes.html | 11 +++- .../the-label-element/labelable-elements.html | 60 +++++++++++++++++++ 22 files changed, 184 insertions(+), 63 deletions(-) diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs index 203f04c0009..7ea783fc68b 100644 --- a/components/script/dom/htmlbuttonelement.rs +++ b/components/script/dom/htmlbuttonelement.rs @@ -17,6 +17,7 @@ use dom::htmlfieldsetelement::HTMLFieldSetElement; use dom::htmlformelement::{FormControl, FormSubmitter}; use dom::htmlformelement::{SubmittedFrom, HTMLFormElement}; use dom::node::{Node, document_from_node, window_from_node}; +use dom::nodelist::NodeList; use dom::validitystate::ValidityState; use dom::virtualmethods::VirtualMethods; use selectors::states::*; @@ -131,6 +132,11 @@ impl HTMLButtonElementMethods for HTMLButtonElement { // https://html.spec.whatwg.org/multipage/#dom-button-value make_setter!(SetValue, "value"); + + // https://html.spec.whatwg.org/multipage/#dom-lfe-labels + fn Labels(&self) -> Root { + self.upcast::().labels() + } } impl VirtualMethods for HTMLButtonElement { diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index 6ebf0106099..8d73511c6d5 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -4,6 +4,7 @@ use dom::attr::Attr; use dom::attr::AttrValue; +use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::HTMLElementBinding; use dom::bindings::codegen::Bindings::HTMLElementBinding::HTMLElementMethods; @@ -12,7 +13,7 @@ use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::codegen::InheritTypes::{ElementTypeId, HTMLElementTypeId, NodeTypeId}; use dom::bindings::conversions::Castable; use dom::bindings::error::{Error, ErrorResult}; -use dom::bindings::js::{JS, MutNullableHeap, Root}; +use dom::bindings::js::{JS, MutNullableHeap, Root, RootedReference}; use dom::bindings::utils::Reflectable; use dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration}; use dom::document::Document; @@ -23,8 +24,10 @@ use dom::htmlbodyelement::HTMLBodyElement; use dom::htmlframesetelement::HTMLFrameSetElement; use dom::htmlhtmlelement::HTMLHtmlElement; use dom::htmlinputelement::HTMLInputElement; +use dom::htmllabelelement::HTMLLabelElement; use dom::node::{Node, SEQUENTIALLY_FOCUSABLE}; use dom::node::{document_from_node, window_from_node}; +use dom::nodelist::NodeList; use dom::virtualmethods::VirtualMethods; use msg::constellation_msg::FocusType; use selectors::states::*; @@ -365,6 +368,45 @@ impl HTMLElement { to_camel_case(&raw_name) }).collect() } + + // https://html.spec.whatwg.org/multipage/#dom-lfe-labels + pub fn labels(&self) -> Root { + debug_assert!(self.is_labelable_element()); + + let element = self.upcast::(); + let window = window_from_node(element); + + // Traverse ancestors for implicitly associated