diff options
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/htmlmeterelement.rs | 128 | ||||
-rw-r--r-- | components/script/dom/webidls/HTMLMeterElement.webidl | 24 |
2 files changed, 139 insertions, 13 deletions
diff --git a/components/script/dom/htmlmeterelement.rs b/components/script/dom/htmlmeterelement.rs index 917258a1ea8..53fa61e9074 100644 --- a/components/script/dom/htmlmeterelement.rs +++ b/components/script/dom/htmlmeterelement.rs @@ -2,14 +2,18 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +use std::ops::{Add, Div}; + use dom_struct::dom_struct; -use html5ever::{LocalName, Prefix}; +use html5ever::{local_name, LocalName, Prefix}; use js::rust::HandleObject; use crate::dom::bindings::codegen::Bindings::HTMLMeterElementBinding::HTMLMeterElementMethods; use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::num::Finite; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::document::Document; +use crate::dom::element::Element; use crate::dom::htmlelement::HTMLElement; use crate::dom::node::Node; use crate::dom::nodelist::NodeList; @@ -20,6 +24,7 @@ pub struct HTMLMeterElement { labels_node_list: MutNullableDom<NodeList>, } +/// <https://html.spec.whatwg.org/multipage/#the-meter-element> impl HTMLMeterElement { fn new_inherited( local_name: LocalName, @@ -52,4 +57,125 @@ impl HTMLMeterElement { impl HTMLMeterElementMethods for HTMLMeterElement { // https://html.spec.whatwg.org/multipage/#dom-lfe-labels make_labels_getter!(Labels, labels_node_list); + + /// <https://html.spec.whatwg.org/multipage/#concept-meter-actual> + fn Value(&self) -> Finite<f64> { + let min = *self.Min(); + let max = *self.Max(); + + Finite::wrap( + self.upcast::<Element>() + .get_string_attribute(&local_name!("value")) + .parse_floating_point_number() + .map_or(0.0, |candidate_actual_value| { + candidate_actual_value.clamp(min, max) + }), + ) + } + + /// <https://html.spec.whatwg.org/multipage/#dom-meter-value> + fn SetValue(&self, value: Finite<f64>) { + self.upcast::<Element>() + .set_string_attribute(&local_name!("value"), (*value).to_string().into()); + } + + /// <https://html.spec.whatwg.org/multipage/#concept-meter-minimum> + fn Min(&self) -> Finite<f64> { + Finite::wrap( + self.upcast::<Element>() + .get_string_attribute(&local_name!("min")) + .parse_floating_point_number() + .unwrap_or(0.0), + ) + } + + /// <https://html.spec.whatwg.org/multipage/#dom-meter-min> + fn SetMin(&self, value: Finite<f64>) { + self.upcast::<Element>() + .set_string_attribute(&local_name!("min"), (*value).to_string().into()); + } + + /// <https://html.spec.whatwg.org/multipage/#concept-meter-maximum> + fn Max(&self) -> Finite<f64> { + Finite::wrap( + self.upcast::<Element>() + .get_string_attribute(&local_name!("max")) + .parse_floating_point_number() + .unwrap_or(1.0) + .max(*self.Min()), + ) + } + + /// <https://html.spec.whatwg.org/multipage/#concept-meter-maximum> + fn SetMax(&self, value: Finite<f64>) { + self.upcast::<Element>() + .set_string_attribute(&local_name!("max"), (*value).to_string().into()); + } + + /// <https://html.spec.whatwg.org/multipage/#concept-meter-low> + fn Low(&self) -> Finite<f64> { + let min = *self.Min(); + let max = *self.Max(); + + Finite::wrap( + self.upcast::<Element>() + .get_string_attribute(&local_name!("low")) + .parse_floating_point_number() + .map_or(min, |candidate_low_boundary| { + candidate_low_boundary.clamp(min, max) + }), + ) + } + + /// <https://html.spec.whatwg.org/multipage/#dom-meter-low> + fn SetLow(&self, value: Finite<f64>) { + self.upcast::<Element>() + .set_string_attribute(&local_name!("low"), (*value).to_string().into()); + } + + /// <https://html.spec.whatwg.org/multipage/#concept-meter-high> + fn High(&self) -> Finite<f64> { + let max: f64 = *self.Max(); + let low: f64 = *self.Low(); + + Finite::wrap( + self.upcast::<Element>() + .get_string_attribute(&local_name!("high")) + .parse_floating_point_number() + .map_or(max, |candidate_high_boundary| { + if candidate_high_boundary < low { + return low; + } + + candidate_high_boundary.clamp(*self.Min(), max) + }), + ) + } + + /// <https://html.spec.whatwg.org/multipage/#dom-meter-high> + fn SetHigh(&self, value: Finite<f64>) { + self.upcast::<Element>() + .set_string_attribute(&local_name!("high"), (*value).to_string().into()); + } + + /// <https://html.spec.whatwg.org/multipage/#concept-meter-optimum> + fn Optimum(&self) -> Finite<f64> { + let max = *self.Max(); + let min = *self.Min(); + + Finite::wrap( + self.upcast::<Element>() + .get_string_attribute(&local_name!("optimum")) + .parse_floating_point_number() + .map_or(max.add(min).div(2.0), |candidate_optimum_point| { + candidate_optimum_point.clamp(min, max) + }), + ) + } + + /// <https://html.spec.whatwg.org/multipage/#dom-meter-optimum> + fn SetOptimum(&self, value: Finite<f64>) { + self.upcast::<Element>() + .set_string_attribute(&local_name!("optimum"), (*value).to_string().into()); + } } diff --git a/components/script/dom/webidls/HTMLMeterElement.webidl b/components/script/dom/webidls/HTMLMeterElement.webidl index 4021d2ec185..23e6bc16b3e 100644 --- a/components/script/dom/webidls/HTMLMeterElement.webidl +++ b/components/script/dom/webidls/HTMLMeterElement.webidl @@ -7,17 +7,17 @@ interface HTMLMeterElement : HTMLElement { [HTMLConstructor] constructor(); - // [CEReactions] - // attribute double value; - // [CEReactions] - // attribute double min; - // [CEReactions] - // attribute double max; - // [CEReactions] - // attribute double low; - // [CEReactions] - // attribute double high; - // [CEReactions] - // attribute double optimum; + [CEReactions] + attribute double value; + [CEReactions] + attribute double min; + [CEReactions] + attribute double max; + [CEReactions] + attribute double low; + [CEReactions] + attribute double high; + [CEReactions] + attribute double optimum; readonly attribute NodeList labels; }; |