diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index e24407d7957a7..deec6afd5c001 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -17,6 +17,7 @@ use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementM use dom::bindings::codegen::Bindings::NamedNodeMapBinding::NamedNodeMapMethods; use dom::bindings::codegen::InheritTypes::{ElementDerived, HTMLInputElementDerived, HTMLTableCellElementDerived}; use dom::bindings::codegen::InheritTypes::{HTMLInputElementCast, NodeCast, EventTargetCast, ElementCast}; +use dom::bindings::codegen::InheritTypes::HTMLTextAreaElementDerived; use dom::bindings::js::{MutNullableJS, JS, JSRef, Temporary, TemporaryPushable}; use dom::bindings::js::{OptionalRootable, Root}; use dom::bindings::utils::{Reflectable, Reflector}; @@ -33,12 +34,14 @@ use dom::htmlcollection::HTMLCollection; use dom::htmlinputelement::{HTMLInputElement, RawLayoutHTMLInputElementHelpers}; use dom::htmlserializer::serialize; use dom::htmltablecellelement::{HTMLTableCellElement, HTMLTableCellElementHelpers}; +use dom::htmltextareaelement::{HTMLTextAreaElement, RawLayoutHTMLTextAreaElementHelpers}; use dom::node::{ElementNodeTypeId, Node, NodeHelpers, NodeIterator, document_from_node, CLICK_IN_PROGRESS}; use dom::node::{window_from_node, LayoutNodeHelpers}; use dom::nodelist::NodeList; use dom::virtualmethods::{VirtualMethods, vtable_for}; use devtools_traits::AttrInfo; use style::{IntegerAttribute, LengthAttribute, SizeIntegerAttribute, WidthLengthAttribute}; +use style::{RowsIntegerAttribute, ColsIntegerAttribute}; use style::{matches, parse_selector_list_from_str}; use style; use servo_util::namespace; @@ -304,6 +307,20 @@ impl RawLayoutElementHelpers for Element { let this: &HTMLInputElement = mem::transmute(self); Some(this.get_size_for_layout() as i32) } + ColsIntegerAttribute => { + if !self.is_htmltextareaelement() { + panic!("I'm not a textarea element!") + } + let this: &HTMLTextAreaElement = mem::transmute(self); + Some(this.get_cols_for_layout() as i32) + } + RowsIntegerAttribute => { + if !self.is_htmltextareaelement() { + panic!("I'm not a textarea element!") + } + let this: &HTMLTextAreaElement = mem::transmute(self); + Some(this.get_rows_for_layout() as i32) + } } } diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index c169a169cf98b..98477108c710f 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -2,7 +2,7 @@ * 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::attr::{Attr, AttrValue}; +use dom::attr::{Attr, AttrValue, UIntAttrValue}; use dom::attr::AttrHelpers; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::EventBinding::EventMethods; @@ -33,6 +33,8 @@ use std::cell::Cell; pub struct HTMLTextAreaElement { htmlelement: HTMLElement, textinput: DOMRefCell, + cols: Cell, + rows: Cell, // https://html.spec.whatwg.org/multipage/forms.html#concept-textarea-dirty value_changed: Cell, @@ -48,6 +50,11 @@ pub trait LayoutHTMLTextAreaElementHelpers { unsafe fn get_value_for_layout(self) -> String; } +pub trait RawLayoutHTMLTextAreaElementHelpers { + unsafe fn get_cols_for_layout(&self) -> u32; + unsafe fn get_rows_for_layout(&self) -> u32; +} + impl LayoutHTMLTextAreaElementHelpers for JS { #[allow(unrooted_must_root)] unsafe fn get_value_for_layout(self) -> String { @@ -55,6 +62,18 @@ impl LayoutHTMLTextAreaElementHelpers for JS { } } +impl RawLayoutHTMLTextAreaElementHelpers for HTMLTextAreaElement { + #[allow(unrooted_must_root)] + unsafe fn get_cols_for_layout(&self) -> u32 { + self.cols.get() + } + + #[allow(unrooted_must_root)] + unsafe fn get_rows_for_layout(&self) -> u32 { + self.rows.get() + } +} + static DEFAULT_COLS: u32 = 20; static DEFAULT_ROWS: u32 = 2; @@ -63,6 +82,8 @@ impl HTMLTextAreaElement { HTMLTextAreaElement { htmlelement: HTMLElement::new_inherited(HTMLTextAreaElementTypeId, localName, prefix, document), textinput: DOMRefCell::new(TextInput::new(Multiple, "".to_string())), + cols: Cell::new(DEFAULT_COLS), + rows: Cell::new(DEFAULT_ROWS), value_changed: Cell::new(false), } } @@ -185,6 +206,18 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLTextAreaElement> { node.set_disabled_state(true); node.set_enabled_state(false); }, + &atom!("cols") => { + match *attr.value() { + UIntAttrValue(_, value) => self.cols.set(value), + _ => panic!("Expected a UIntAttrValue"), + } + }, + &atom!("rows") => { + match *attr.value() { + UIntAttrValue(_, value) => self.rows.set(value), + _ => panic!("Expected a UIntAttrValue"), + } + }, _ => () } } @@ -202,6 +235,12 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLTextAreaElement> { node.set_enabled_state(true); node.check_ancestors_disabled_state_for_form_control(); }, + &atom!("cols") => { + self.cols.set(DEFAULT_COLS); + }, + &atom!("rows") => { + self.rows.set(DEFAULT_ROWS); + }, _ => () } } diff --git a/components/style/legacy.rs b/components/style/legacy.rs index f99314667b8d3..2b6fb9ad09454 100644 --- a/components/style/legacy.rs +++ b/components/style/legacy.rs @@ -15,5 +15,7 @@ pub enum LengthAttribute { pub enum IntegerAttribute { /// `` SizeIntegerAttribute, + ColsIntegerAttribute, + RowsIntegerAttribute, } diff --git a/components/style/lib.rs b/components/style/lib.rs index e6e0e77f7a5e9..b2799ebdef876 100644 --- a/components/style/lib.rs +++ b/components/style/lib.rs @@ -53,7 +53,8 @@ pub use selectors::{PseudoElement, Before, After, SelectorList, parse_selector_l pub use selectors::{AttrSelector, NamespaceConstraint, SpecificNamespace, AnyNamespace}; pub use selectors::{SimpleSelector,LocalNameSelector}; pub use cssparser::{Color, RGBA}; -pub use legacy::{IntegerAttribute, LengthAttribute, SizeIntegerAttribute, WidthLengthAttribute}; +pub use legacy::{IntegerAttribute, LengthAttribute, SizeIntegerAttribute}; +pub use legacy::{ColsIntegerAttribute, RowsIntegerAttribute, WidthLengthAttribute}; pub use font_face::{Source, LocalSource, UrlSource_}; mod stylesheets; diff --git a/components/style/selector_matching.rs b/components/style/selector_matching.rs index 7cd1fd1d232bf..362b59843d878 100644 --- a/components/style/selector_matching.rs +++ b/components/style/selector_matching.rs @@ -19,10 +19,11 @@ use servo_util::str::{AutoLpa, LengthLpa, PercentageLpa}; use string_cache::Atom; use legacy::{SizeIntegerAttribute, WidthLengthAttribute}; +use legacy::{ColsIntegerAttribute, RowsIntegerAttribute}; use media_queries::Device; use node::{TElement, TElementAttributes, TNode}; use properties::{PropertyDeclaration, PropertyDeclarationBlock, SpecifiedValue, WidthDeclaration}; -use properties::{specified}; +use properties::{HeightDeclaration, specified, CSSFloat}; use selectors::*; use stylesheets::{Stylesheet, iter_stylesheet_media_rules, iter_stylesheet_style_rules}; @@ -530,6 +531,36 @@ impl Stylist { Some(_) | None => {} } } + name if *name == atom!("textarea") => { + match element.get_integer_attribute(ColsIntegerAttribute) { + Some(value) if value != 0 => { + // TODO(mttr) ServoCharacterWidth uses the size math for , but + // the math for