diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 158d9612442..a6a98d91178 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -390,6 +390,9 @@ impl LayoutElementHelpers for LayoutJS { this.get_width() } else if let Some(this) = self.downcast::() { this.get_width() + } else if let Some(this) = self.downcast::() { + // https://html.spec.whatwg.org/multipage/#the-hr-element-2:attr-hr-width + this.get_width() } else { LengthOrPercentageOrAuto::Auto }; diff --git a/components/script/dom/htmlhrelement.rs b/components/script/dom/htmlhrelement.rs index eabd970c6f5..8b6cf338786 100644 --- a/components/script/dom/htmlhrelement.rs +++ b/components/script/dom/htmlhrelement.rs @@ -13,7 +13,7 @@ use dom::htmlelement::HTMLElement; use dom::node::Node; use dom::virtualmethods::VirtualMethods; use string_cache::Atom; -use util::str::DOMString; +use util::str::{DOMString, LengthOrPercentageOrAuto}; #[dom_struct] pub struct HTMLHRElement { @@ -42,10 +42,17 @@ impl HTMLHRElementMethods for HTMLHRElement { // https://html.spec.whatwg.org/multipage/#dom-hr-color make_legacy_color_setter!(SetColor, "color"); + + // https://html.spec.whatwg.org/multipage/#dom-hr-width + make_getter!(Width); + + // https://html.spec.whatwg.org/multipage/#dom-hr-width + make_dimension_setter!(SetWidth, "width"); } pub trait HTMLHRLayoutHelpers { fn get_color(&self) -> Option; + fn get_width(&self) -> LengthOrPercentageOrAuto; } impl HTMLHRLayoutHelpers for LayoutJS { @@ -58,6 +65,17 @@ impl HTMLHRLayoutHelpers for LayoutJS { .cloned() } } + + #[allow(unsafe_code)] + fn get_width(&self) -> LengthOrPercentageOrAuto { + unsafe { + (&*self.upcast::().unsafe_get()) + .get_attr_for_layout(&ns!(""), &atom!("width")) + .map(AttrValue::as_dimension) + .cloned() + .unwrap_or(LengthOrPercentageOrAuto::Auto) + } + } } @@ -69,6 +87,7 @@ impl VirtualMethods for HTMLHRElement { fn parse_plain_attribute(&self, name: &Atom, value: DOMString) -> AttrValue { match name { &atom!("color") => AttrValue::from_legacy_color(value), + &atom!("width") => AttrValue::from_dimension(value), _ => self.super_type().unwrap().parse_plain_attribute(name, value), } } diff --git a/components/script/dom/webidls/HTMLHRElement.webidl b/components/script/dom/webidls/HTMLHRElement.webidl index 185100712f5..f203527b2bf 100644 --- a/components/script/dom/webidls/HTMLHRElement.webidl +++ b/components/script/dom/webidls/HTMLHRElement.webidl @@ -14,5 +14,5 @@ partial interface HTMLHRElement { attribute DOMString color; // attribute boolean noShade; // attribute DOMString size; - // attribute DOMString width; + attribute DOMString width; }; diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 2237fa1a18b..0751bf60f79 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -4495,6 +4495,16 @@ ], "url": "/html/rendering/non-replaced-elements/the-hr-element-0/color.html" }, + { + "path": "html/rendering/non-replaced-elements/the-hr-element-0/width.html", + "references": [ + [ + "/html/rendering/non-replaced-elements/the-hr-element-0/width-ref.html", + "==" + ] + ], + "url": "/html/rendering/non-replaced-elements/the-hr-element-0/width.html" + }, { "path": "html/rendering/non-replaced-elements/the-page/body_text_00ffff.xhtml", "references": [ diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini index d6b47d19710..eedba2f8c04 100644 --- a/tests/wpt/metadata/html/dom/interfaces.html.ini +++ b/tests/wpt/metadata/html/dom/interfaces.html.ini @@ -2313,9 +2313,6 @@ [HTMLHRElement interface: attribute size] expected: FAIL - [HTMLHRElement interface: attribute width] - expected: FAIL - [HTMLHRElement interface: document.createElement("hr") must inherit property "align" with the proper type (0)] expected: FAIL @@ -2325,9 +2322,6 @@ [HTMLHRElement interface: document.createElement("hr") must inherit property "size" with the proper type (3)] expected: FAIL - [HTMLHRElement interface: document.createElement("hr") must inherit property "width" with the proper type (4)] - expected: FAIL - [HTMLPreElement interface: existence and properties of interface object] expected: FAIL diff --git a/tests/wpt/metadata/html/dom/reflection-grouping.html.ini b/tests/wpt/metadata/html/dom/reflection-grouping.html.ini index cc2a70be8d5..35938009156 100644 --- a/tests/wpt/metadata/html/dom/reflection-grouping.html.ini +++ b/tests/wpt/metadata/html/dom/reflection-grouping.html.ini @@ -1686,135 +1686,6 @@ [hr.size: IDL set to object "test-valueOf" followed by IDL get] expected: FAIL - [hr.width: typeof IDL attribute] - expected: FAIL - - [hr.width: IDL get with DOM attribute unset] - expected: FAIL - - [hr.width: setAttribute() to "" followed by IDL get] - expected: FAIL - - [hr.width: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo " followed by IDL get] - expected: FAIL - - [hr.width: setAttribute() to undefined followed by IDL get] - expected: FAIL - - [hr.width: setAttribute() to 7 followed by IDL get] - expected: FAIL - - [hr.width: setAttribute() to 1.5 followed by IDL get] - expected: FAIL - - [hr.width: setAttribute() to true followed by IDL get] - expected: FAIL - - [hr.width: setAttribute() to false followed by IDL get] - expected: FAIL - - [hr.width: setAttribute() to object "[object Object\]" followed by IDL get] - expected: FAIL - - [hr.width: setAttribute() to NaN followed by IDL get] - expected: FAIL - - [hr.width: setAttribute() to Infinity followed by IDL get] - expected: FAIL - - [hr.width: setAttribute() to -Infinity followed by IDL get] - expected: FAIL - - [hr.width: setAttribute() to "\\0" followed by IDL get] - expected: FAIL - - [hr.width: setAttribute() to null followed by IDL get] - expected: FAIL - - [hr.width: setAttribute() to object "test-toString" followed by IDL get] - expected: FAIL - - [hr.width: setAttribute() to object "test-valueOf" followed by IDL get] - expected: FAIL - - [hr.width: IDL set to "" followed by getAttribute()] - expected: FAIL - - [hr.width: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo " followed by getAttribute()] - expected: FAIL - - [hr.width: IDL set to undefined followed by getAttribute()] - expected: FAIL - - [hr.width: IDL set to undefined followed by IDL get] - expected: FAIL - - [hr.width: IDL set to 7 followed by getAttribute()] - expected: FAIL - - [hr.width: IDL set to 7 followed by IDL get] - expected: FAIL - - [hr.width: IDL set to 1.5 followed by getAttribute()] - expected: FAIL - - [hr.width: IDL set to 1.5 followed by IDL get] - expected: FAIL - - [hr.width: IDL set to true followed by getAttribute()] - expected: FAIL - - [hr.width: IDL set to true followed by IDL get] - expected: FAIL - - [hr.width: IDL set to false followed by getAttribute()] - expected: FAIL - - [hr.width: IDL set to false followed by IDL get] - expected: FAIL - - [hr.width: IDL set to object "[object Object\]" followed by getAttribute()] - expected: FAIL - - [hr.width: IDL set to object "[object Object\]" followed by IDL get] - expected: FAIL - - [hr.width: IDL set to NaN followed by getAttribute()] - expected: FAIL - - [hr.width: IDL set to NaN followed by IDL get] - expected: FAIL - - [hr.width: IDL set to Infinity followed by getAttribute()] - expected: FAIL - - [hr.width: IDL set to Infinity followed by IDL get] - expected: FAIL - - [hr.width: IDL set to -Infinity followed by getAttribute()] - expected: FAIL - - [hr.width: IDL set to -Infinity followed by IDL get] - expected: FAIL - - [hr.width: IDL set to "\\0" followed by getAttribute()] - expected: FAIL - - [hr.width: IDL set to null followed by getAttribute()] - expected: FAIL - - [hr.width: IDL set to null followed by IDL get] - expected: FAIL - - [hr.width: IDL set to object "test-toString" followed by getAttribute()] - expected: FAIL - - [hr.width: IDL set to object "test-toString" followed by IDL get] - expected: FAIL - - [hr.width: IDL set to object "test-valueOf" followed by IDL get] - expected: FAIL - [hr.itemScope: typeof IDL attribute] expected: FAIL diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-hr-element-0/width-ref.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-hr-element-0/width-ref.html new file mode 100644 index 00000000000..906846b3099 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-hr-element-0/width-ref.html @@ -0,0 +1,18 @@ + +
+
+
+
+
+
+
+
+
+
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-hr-element-0/width.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-hr-element-0/width.html new file mode 100644 index 00000000000..3cd516ad70c --- /dev/null +++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-hr-element-0/width.html @@ -0,0 +1,14 @@ + + + + +
+
+
+
+
+
+
+
+
+