From fd65b5f43826e526eb1dced4c93b0a63b8f49121 Mon Sep 17 00:00:00 2001 From: Matthew Rasmus Date: Sat, 29 Nov 2014 13:24:29 -0800 Subject: [PATCH 1/5] Implements some HTMLTextAreaElement attributes These attributes all reflect their own related content values, with the exception of defaultValue, which acts as an alias for its IDL textContent attribute. Many of these do have default values and constraints which are currently unimplemented. --- components/script/dom/htmltextareaelement.rs | 52 +++++++++++++++++++ .../dom/webidls/HTMLTextAreaElement.webidl | 14 ++--- 2 files changed, 59 insertions(+), 7 deletions(-) diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 80aad8c136c..8888178df5f 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -7,6 +7,7 @@ use dom::attr::AttrHelpers; use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding; use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding::HTMLTextAreaElementMethods; use dom::bindings::codegen::InheritTypes::{HTMLElementCast, NodeCast}; +use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::codegen::InheritTypes::{HTMLTextAreaElementDerived, HTMLFieldSetElementDerived}; use dom::bindings::js::{JSRef, Temporary}; use dom::bindings::utils::{Reflectable, Reflector}; @@ -46,16 +47,67 @@ impl HTMLTextAreaElement { } impl<'a> HTMLTextAreaElementMethods for JSRef<'a, HTMLTextAreaElement> { + // TODO A few of these attributes have default values and additional + // constraints + + // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-cols + make_uint_getter!(Cols) + + // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-cols + make_uint_setter!(SetCols, "cols") + // http://www.whatwg.org/html/#dom-fe-disabled make_bool_getter!(Disabled) // http://www.whatwg.org/html/#dom-fe-disabled make_bool_setter!(SetDisabled, "disabled") + // https://html.spec.whatwg.org/multipage/forms.html#attr-fe-name + make_getter!(Name) + + // https://html.spec.whatwg.org/multipage/forms.html#attr-fe-name + make_setter!(SetName, "name") + + // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-placeholder + make_getter!(Placeholder) + + // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-placeholder + make_setter!(SetPlaceholder, "placeholder") + + // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-required + make_bool_getter!(Required) + + // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-required + make_bool_setter!(SetRequired, "required") + + // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-rows + make_uint_getter!(Rows) + + // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-rows + make_uint_setter!(SetRows, "rows") + + // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-wrap + make_getter!(Wrap) + + // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-wrap + make_setter!(SetWrap, "wrap") + // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-type fn Type(self) -> DOMString { "textarea".to_string() } + + // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-defaultvalue + fn DefaultValue(self) -> DOMString { + let node: JSRef = NodeCast::from_ref(self); + node.GetTextContent().unwrap() + } + + // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-defaultvalue + fn SetDefaultValue(self, value: DOMString) { + let node: JSRef = NodeCast::from_ref(self); + node.SetTextContent(Some(value)) + } } impl<'a> VirtualMethods for JSRef<'a, HTMLTextAreaElement> { diff --git a/components/script/dom/webidls/HTMLTextAreaElement.webidl b/components/script/dom/webidls/HTMLTextAreaElement.webidl index f3fb5b3cf40..124de2015f1 100644 --- a/components/script/dom/webidls/HTMLTextAreaElement.webidl +++ b/components/script/dom/webidls/HTMLTextAreaElement.webidl @@ -7,22 +7,22 @@ interface HTMLTextAreaElement : HTMLElement { // attribute DOMString autocomplete; // attribute boolean autofocus; - // attribute unsigned long cols; + attribute unsigned long cols; // attribute DOMString dirName; attribute boolean disabled; //readonly attribute HTMLFormElement? form; // attribute DOMString inputMode; // attribute long maxLength; // attribute long minLength; - // attribute DOMString name; - // attribute DOMString placeholder; + attribute DOMString name; + attribute DOMString placeholder; // attribute boolean readOnly; - // attribute boolean required; - // attribute unsigned long rows; - // attribute DOMString wrap; + attribute boolean required; + attribute unsigned long rows; + attribute DOMString wrap; readonly attribute DOMString type; - // attribute DOMString defaultValue; + attribute DOMString defaultValue; //[TreatNullAs=EmptyString] attribute DOMString value; //readonly attribute unsigned long textLength; From 29241699fdbdfe9308dde4f0586472919049f153 Mon Sep 17 00:00:00 2001 From: Matthew Rasmus Date: Sat, 29 Nov 2014 13:48:55 -0800 Subject: [PATCH 2/5] Implements multi line text input for TextArea --- components/layout/construct.rs | 15 ++- components/layout/wrapper.rs | 8 +- components/script/dom/htmltextareaelement.rs | 92 ++++++++++++++++++- .../dom/webidls/HTMLTextAreaElement.webidl | 2 +- resources/servo.css | 3 +- tests/html/textarea.html | 6 ++ 6 files changed, 115 insertions(+), 11 deletions(-) create mode 100644 tests/html/textarea.html diff --git a/components/layout/construct.rs b/components/layout/construct.rs index 95c2919b764..d4d52c2ebb4 100644 --- a/components/layout/construct.rs +++ b/components/layout/construct.rs @@ -49,6 +49,7 @@ use script::dom::element::{HTMLObjectElementTypeId, HTMLInputElementTypeId}; use script::dom::element::{HTMLTableColElementTypeId, HTMLTableDataCellElementTypeId}; use script::dom::element::{HTMLTableElementTypeId, HTMLTableHeaderCellElementTypeId}; use script::dom::element::{HTMLTableRowElementTypeId, HTMLTableSectionElementTypeId}; +use script::dom::element::HTMLTextAreaElementTypeId; use script::dom::node::{CommentNodeTypeId, DoctypeNodeTypeId, DocumentFragmentNodeTypeId}; use script::dom::node::{DocumentNodeTypeId, ElementNodeTypeId, ProcessingInstructionNodeTypeId}; use script::dom::node::{TextNodeTypeId}; @@ -273,7 +274,8 @@ impl<'a> FlowConstructor<'a> { TableColumnFragment(TableColumnFragmentInfo::new(node)) } Some(ElementNodeTypeId(HTMLTableDataCellElementTypeId)) | - Some(ElementNodeTypeId(HTMLTableHeaderCellElementTypeId)) => TableCellFragment, + Some(ElementNodeTypeId(HTMLTableHeaderCellElementTypeId)) | + Some(ElementNodeTypeId(HTMLTextAreaElementTypeId)) => TableCellFragment, Some(ElementNodeTypeId(HTMLTableRowElementTypeId)) | Some(ElementNodeTypeId(HTMLTableSectionElementTypeId)) => TableRowFragment, Some(TextNodeTypeId) => UnscannedTextFragment(UnscannedTextFragmentInfo::new(node)), @@ -487,7 +489,16 @@ impl<'a> FlowConstructor<'a> { // Special case: If this is generated content, then we need to initialize the accumulator // with the fragment corresponding to that content. if node.get_pseudo_element_type() != Normal || - node.type_id() == Some(ElementNodeTypeId(HTMLInputElementTypeId)) { + node.type_id() == Some(ElementNodeTypeId(HTMLInputElementTypeId)) || + node.type_id() == Some(ElementNodeTypeId(HTMLTextAreaElementTypeId)) { + // A TextArea's text contents are displayed through the input text + // box, so don't construct them. + // TODO Maybe this belongs somewhere else? + if node.type_id() == Some(ElementNodeTypeId(HTMLTextAreaElementTypeId)) { + for kid in node.children() { + kid.set_flow_construction_result(NoConstructionResult) + } + } let fragment_info = UnscannedTextFragment(UnscannedTextFragmentInfo::new(node)); let fragment = Fragment::new_from_specific_info(node, fragment_info); inline_fragment_accumulator.fragments.push_back(fragment); diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs index 11ef5b66822..595ae6a760e 100644 --- a/components/layout/wrapper.rs +++ b/components/layout/wrapper.rs @@ -39,13 +39,14 @@ use util::{PrivateLayoutData}; use gfx::display_list::OpaqueNode; use script::dom::bindings::codegen::InheritTypes::{ElementCast, HTMLIFrameElementCast}; use script::dom::bindings::codegen::InheritTypes::{HTMLImageElementCast, HTMLInputElementCast}; -use script::dom::bindings::codegen::InheritTypes::{NodeCast, TextCast}; +use script::dom::bindings::codegen::InheritTypes::{HTMLTextAreaElementCast, NodeCast, TextCast}; use script::dom::bindings::js::JS; use script::dom::element::{Element, HTMLAreaElementTypeId, HTMLAnchorElementTypeId}; use script::dom::element::{HTMLLinkElementTypeId, LayoutElementHelpers, RawLayoutElementHelpers}; use script::dom::htmliframeelement::HTMLIFrameElement; use script::dom::htmlimageelement::LayoutHTMLImageElementHelpers; use script::dom::htmlinputelement::LayoutHTMLInputElementHelpers; +use script::dom::htmltextareaelement::LayoutHTMLTextAreaElementHelpers; use script::dom::node::{DocumentNodeTypeId, ElementNodeTypeId, Node, NodeTypeId}; use script::dom::node::{LayoutNodeHelpers, RawLayoutNodeHelpers, SharedLayoutData}; use script::dom::node::{HAS_CHANGED, IS_DIRTY, HAS_DIRTY_SIBLINGS, HAS_DIRTY_DESCENDANTS}; @@ -188,7 +189,10 @@ impl<'ln> TLayoutNode for LayoutNode<'ln> { Some(text) => (*text.unsafe_get()).characterdata().data_for_layout().to_string(), None => match HTMLInputElementCast::to_js(self.get_jsmanaged()) { Some(input) => input.get_value_for_layout(), - None => panic!("not text!") + None => match HTMLTextAreaElementCast::to_js(self.get_jsmanaged()) { + Some(area) => area.get_value_for_layout(), + None => panic!("not text!") + } } } } diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 8888178df5f..e34ec36aeca 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -4,18 +4,24 @@ use dom::attr::Attr; use dom::attr::AttrHelpers; +use dom::bindings::cell::DOMRefCell; +use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding; use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding::HTMLTextAreaElementMethods; -use dom::bindings::codegen::InheritTypes::{HTMLElementCast, NodeCast}; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; +use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast, NodeCast}; use dom::bindings::codegen::InheritTypes::{HTMLTextAreaElementDerived, HTMLFieldSetElementDerived}; -use dom::bindings::js::{JSRef, Temporary}; +use dom::bindings::codegen::InheritTypes::{KeyboardEventCast, TextDerived}; +use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::utils::{Reflectable, Reflector}; -use dom::document::Document; +use dom::document::{Document, DocumentHelpers}; use dom::element::{AttributeHandlers, HTMLTextAreaElementTypeId}; +use dom::event::Event; use dom::eventtarget::{EventTarget, NodeTargetTypeId}; use dom::htmlelement::HTMLElement; -use dom::node::{DisabledStateHelpers, Node, NodeHelpers, ElementNodeTypeId}; +use dom::keyboardevent::KeyboardEvent; +use dom::node::{DisabledStateHelpers, Node, NodeHelpers, ElementNodeTypeId, document_from_node}; +use textinput::{Multiple, TextInput, TriggerDefaultAction, DispatchInput, Nothing}; use dom::virtualmethods::VirtualMethods; use servo_util::str::DOMString; @@ -24,6 +30,7 @@ use string_cache::Atom; #[dom_struct] pub struct HTMLTextAreaElement { htmlelement: HTMLElement, + textinput: DOMRefCell, } impl HTMLTextAreaElementDerived for EventTarget { @@ -32,10 +39,22 @@ impl HTMLTextAreaElementDerived for EventTarget { } } +pub trait LayoutHTMLTextAreaElementHelpers { + unsafe fn get_value_for_layout(self) -> String; +} + +impl LayoutHTMLTextAreaElementHelpers for JS { + #[allow(unrooted_must_root)] + unsafe fn get_value_for_layout(self) -> String { + (*self.unsafe_get()).textinput.borrow_for_layout().get_content() + } +} + impl HTMLTextAreaElement { fn new_inherited(localName: DOMString, prefix: Option, document: JSRef) -> HTMLTextAreaElement { HTMLTextAreaElement { - htmlelement: HTMLElement::new_inherited(HTMLTextAreaElementTypeId, localName, prefix, document) + htmlelement: HTMLElement::new_inherited(HTMLTextAreaElementTypeId, localName, prefix, document), + textinput: DOMRefCell::new(TextInput::new(Multiple, "".to_string())), } } @@ -108,6 +127,28 @@ impl<'a> HTMLTextAreaElementMethods for JSRef<'a, HTMLTextAreaElement> { let node: JSRef = NodeCast::from_ref(self); node.SetTextContent(Some(value)) } + + // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-value + fn Value(self) -> DOMString { + self.textinput.borrow().get_content() + } + + // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-value + fn SetValue(self, value: DOMString) { + self.textinput.borrow_mut().set_content(value); + } +} + +pub trait HTMLTextAreaElementHelpers { + fn force_relayout(self); +} + +impl<'a> HTMLTextAreaElementHelpers for JSRef<'a, HTMLTextAreaElement> { + fn force_relayout(self) { + let doc = document_from_node(self).root(); + let node: JSRef = NodeCast::from_ref(self); + doc.content_changed(node) + } } impl<'a> VirtualMethods for JSRef<'a, HTMLTextAreaElement> { @@ -172,6 +213,47 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLTextAreaElement> { node.check_disabled_attribute(); } } + + fn child_inserted(&self, child: JSRef) { + match self.super_type() { + Some(s) => { + s.child_inserted(child); + } + _ => (), + } + + if child.is_text() { + self.SetValue(child.GetTextContent().unwrap()); + } + } + + // copied and modified from htmlinputelement.rs + fn handle_event(&self, event: JSRef) { + match self.super_type() { + Some(s) => { + s.handle_event(event); + } + _ => (), + } + + if "click" == event.Type().as_slice() && !event.DefaultPrevented() { + //TODO: set the editing position for text inputs + + let doc = document_from_node(*self).root(); + doc.request_focus(ElementCast::from_ref(*self)); + } else if "keydown" == event.Type().as_slice() && !event.DefaultPrevented() { + let keyevent: Option> = KeyboardEventCast::to_ref(event); + keyevent.map(|event| { + match self.textinput.borrow_mut().handle_keydown(event) { + TriggerDefaultAction => (), + DispatchInput => { + self.force_relayout(); + } + Nothing => (), + } + }); + } + } } impl Reflectable for HTMLTextAreaElement { diff --git a/components/script/dom/webidls/HTMLTextAreaElement.webidl b/components/script/dom/webidls/HTMLTextAreaElement.webidl index 124de2015f1..59d10658b14 100644 --- a/components/script/dom/webidls/HTMLTextAreaElement.webidl +++ b/components/script/dom/webidls/HTMLTextAreaElement.webidl @@ -23,7 +23,7 @@ interface HTMLTextAreaElement : HTMLElement { readonly attribute DOMString type; attribute DOMString defaultValue; - //[TreatNullAs=EmptyString] attribute DOMString value; + [TreatNullAs=EmptyString] attribute DOMString value; //readonly attribute unsigned long textLength; //readonly attribute boolean willValidate; diff --git a/resources/servo.css b/resources/servo.css index cf81713a015..1fa54c8b816 100644 --- a/resources/servo.css +++ b/resources/servo.css @@ -1,5 +1,6 @@ -input, select { display: inline-block; } +input, textarea, select { display: inline-block; } input { background: white; min-height: 1.0em; padding: 0em; padding-left: 0.25em; padding-right: 0.25em; border: solid lightgrey 1px; color: black; white-space: nowrap; } +textarea { background: white; min-height: 1.0em; padding: 0em; padding-left: 0.25em; padding-right: 0.25em; border: solid lightgrey 1px; color: black; white-space: pre; } input[type="button"], input[type="submit"], input[type="reset"] { background: lightgrey; border-top: solid 1px #EEEEEE; border-left: solid 1px #CCCCCC; border-right: solid 1px #999999; border-bottom: solid 1px #999999; text-align: center; vertical-align: middle; color: black; width: 100%; } diff --git a/tests/html/textarea.html b/tests/html/textarea.html new file mode 100644 index 00000000000..b499465dff6 --- /dev/null +++ b/tests/html/textarea.html @@ -0,0 +1,6 @@ + + + + + From ed37b53a62defe1d3d08de18166d41a20bd86912 Mon Sep 17 00:00:00 2001 From: Matthew Rasmus Date: Sat, 29 Nov 2014 14:03:33 -0800 Subject: [PATCH 3/5] Updates WPT to expect newly passing tests Addresses reviews More review addressing --- components/layout/construct.rs | 3 +- components/layout/lib.rs | 2 +- components/layout/wrapper.rs | 18 ++++--- components/script/dom/htmltextareaelement.rs | 6 +-- .../wpt/metadata/html/dom/interfaces.html.ini | 48 ------------------- 5 files changed, 13 insertions(+), 64 deletions(-) diff --git a/components/layout/construct.rs b/components/layout/construct.rs index d4d52c2ebb4..21a24af7efb 100644 --- a/components/layout/construct.rs +++ b/components/layout/construct.rs @@ -274,8 +274,7 @@ impl<'a> FlowConstructor<'a> { TableColumnFragment(TableColumnFragmentInfo::new(node)) } Some(ElementNodeTypeId(HTMLTableDataCellElementTypeId)) | - Some(ElementNodeTypeId(HTMLTableHeaderCellElementTypeId)) | - Some(ElementNodeTypeId(HTMLTextAreaElementTypeId)) => TableCellFragment, + Some(ElementNodeTypeId(HTMLTableHeaderCellElementTypeId)) => TableCellFragment, Some(ElementNodeTypeId(HTMLTableRowElementTypeId)) | Some(ElementNodeTypeId(HTMLTableSectionElementTypeId)) => TableRowFragment, Some(TextNodeTypeId) => UnscannedTextFragment(UnscannedTextFragmentInfo::new(node)), diff --git a/components/layout/lib.rs b/components/layout/lib.rs index 6489f6fe307..2d045508088 100644 --- a/components/layout/lib.rs +++ b/components/layout/lib.rs @@ -5,7 +5,7 @@ #![comment = "The Servo Parallel Browser Project"] #![license = "MPL"] -#![feature(globs, macro_rules, phase, thread_local, unsafe_destructor)] +#![feature(globs, macro_rules, phase, thread_local, unsafe_destructor, if_let)] #![deny(unused_imports)] #![deny(unused_variables)] diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs index 595ae6a760e..14c18bf1e17 100644 --- a/components/layout/wrapper.rs +++ b/components/layout/wrapper.rs @@ -184,16 +184,14 @@ impl<'ln> TLayoutNode for LayoutNode<'ln> { fn text(&self) -> String { unsafe { - let text_opt: Option> = TextCast::to_js(self.get_jsmanaged()); - match text_opt { - Some(text) => (*text.unsafe_get()).characterdata().data_for_layout().to_string(), - None => match HTMLInputElementCast::to_js(self.get_jsmanaged()) { - Some(input) => input.get_value_for_layout(), - None => match HTMLTextAreaElementCast::to_js(self.get_jsmanaged()) { - Some(area) => area.get_value_for_layout(), - None => panic!("not text!") - } - } + if let Some(text) = TextCast::to_js(self.get_jsmanaged()) { + (*text.unsafe_get()).characterdata().data_for_layout().to_string() + } else if let Some(input) = HTMLInputElementCast::to_js(self.get_jsmanaged()) { + input.get_value_for_layout() + } else if let Some(area) = HTMLTextAreaElementCast::to_js(self.get_jsmanaged()) { + area.get_value_for_layout() + } else { + panic!("not text!") } } } diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index e34ec36aeca..67498ba6a17 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -139,11 +139,11 @@ impl<'a> HTMLTextAreaElementMethods for JSRef<'a, HTMLTextAreaElement> { } } -pub trait HTMLTextAreaElementHelpers { +trait PrivateHTMLTextAreaElementHelpers { fn force_relayout(self); } -impl<'a> HTMLTextAreaElementHelpers for JSRef<'a, HTMLTextAreaElement> { +impl<'a> PrivateHTMLTextAreaElementHelpers for JSRef<'a, HTMLTextAreaElement> { fn force_relayout(self) { let doc = document_from_node(self).root(); let node: JSRef = NodeCast::from_ref(self); @@ -223,7 +223,7 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLTextAreaElement> { } if child.is_text() { - self.SetValue(child.GetTextContent().unwrap()); + self.SetValue(self.DefaultValue()); } } diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini index a9e0d52f1cf..40fc05cdb10 100644 --- a/tests/wpt/metadata/html/dom/interfaces.html.ini +++ b/tests/wpt/metadata/html/dom/interfaces.html.ini @@ -5370,9 +5370,6 @@ [HTMLTextAreaElement interface: attribute autofocus] expected: FAIL - [HTMLTextAreaElement interface: attribute cols] - expected: FAIL - [HTMLTextAreaElement interface: attribute dirName] expected: FAIL @@ -5388,30 +5385,9 @@ [HTMLTextAreaElement interface: attribute minLength] expected: FAIL - [HTMLTextAreaElement interface: attribute name] - expected: FAIL - - [HTMLTextAreaElement interface: attribute placeholder] - expected: FAIL - [HTMLTextAreaElement interface: attribute readOnly] expected: FAIL - [HTMLTextAreaElement interface: attribute required] - expected: FAIL - - [HTMLTextAreaElement interface: attribute rows] - expected: FAIL - - [HTMLTextAreaElement interface: attribute wrap] - expected: FAIL - - [HTMLTextAreaElement interface: attribute defaultValue] - expected: FAIL - - [HTMLTextAreaElement interface: attribute value] - expected: FAIL - [HTMLTextAreaElement interface: attribute textLength] expected: FAIL @@ -5463,9 +5439,6 @@ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autofocus" with the proper type (1)] expected: FAIL - [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "cols" with the proper type (2)] - expected: FAIL - [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "dirName" with the proper type (3)] expected: FAIL @@ -5481,30 +5454,9 @@ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "minLength" with the proper type (8)] expected: FAIL - [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "name" with the proper type (9)] - expected: FAIL - - [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "placeholder" with the proper type (10)] - expected: FAIL - [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "readOnly" with the proper type (11)] expected: FAIL - [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "required" with the proper type (12)] - expected: FAIL - - [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "rows" with the proper type (13)] - expected: FAIL - - [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "wrap" with the proper type (14)] - expected: FAIL - - [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "defaultValue" with the proper type (16)] - expected: FAIL - - [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "value" with the proper type (17)] - expected: FAIL - [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "textLength" with the proper type (18)] expected: FAIL From f5bd8f830acd54617b74a7eed25992119e449462 Mon Sep 17 00:00:00 2001 From: Matthew Rasmus Date: Sun, 30 Nov 2014 15:37:27 -0800 Subject: [PATCH 4/5] HTMLTextArea: Implements a dirty value flag --- components/script/dom/htmltextareaelement.rs | 34 ++++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 67498ba6a17..59cbf9e6dd7 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -27,10 +27,15 @@ use dom::virtualmethods::VirtualMethods; use servo_util::str::DOMString; use string_cache::Atom; +use std::cell::Cell; + #[dom_struct] pub struct HTMLTextAreaElement { htmlelement: HTMLElement, textinput: DOMRefCell, + + // https://html.spec.whatwg.org/multipage/forms.html#concept-textarea-dirty + value_changed: Cell, } impl HTMLTextAreaElementDerived for EventTarget { @@ -55,6 +60,7 @@ impl HTMLTextAreaElement { HTMLTextAreaElement { htmlelement: HTMLElement::new_inherited(HTMLTextAreaElementTypeId, localName, prefix, document), textinput: DOMRefCell::new(TextInput::new(Multiple, "".to_string())), + value_changed: Cell::new(false), } } @@ -125,7 +131,13 @@ impl<'a> HTMLTextAreaElementMethods for JSRef<'a, HTMLTextAreaElement> { // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-defaultvalue fn SetDefaultValue(self, value: DOMString) { let node: JSRef = NodeCast::from_ref(self); - node.SetTextContent(Some(value)) + node.SetTextContent(Some(value)); + + // if the element's dirty value flag is false, then the element's + // raw value must be set to the value of the element's textContent IDL attribute + if !self.value_changed.get() { + self.SetValue(node.GetTextContent().unwrap()); + } } // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-value @@ -136,6 +148,7 @@ impl<'a> HTMLTextAreaElementMethods for JSRef<'a, HTMLTextAreaElement> { // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-value fn SetValue(self, value: DOMString) { self.textinput.borrow_mut().set_content(value); + self.force_relayout(); } } @@ -242,16 +255,17 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLTextAreaElement> { let doc = document_from_node(*self).root(); doc.request_focus(ElementCast::from_ref(*self)); } else if "keydown" == event.Type().as_slice() && !event.DefaultPrevented() { - let keyevent: Option> = KeyboardEventCast::to_ref(event); - keyevent.map(|event| { - match self.textinput.borrow_mut().handle_keydown(event) { - TriggerDefaultAction => (), - DispatchInput => { - self.force_relayout(); - } - Nothing => (), + let keyevent: Option> = KeyboardEventCast::to_ref(event); + keyevent.map(|event| { + match self.textinput.borrow_mut().handle_keydown(event) { + TriggerDefaultAction => (), + DispatchInput => { + self.force_relayout(); + self.value_changed.set(true); } - }); + Nothing => (), + } + }); } } } From c97a4d999ec31b107b69ce22fd7738603c04d111 Mon Sep 17 00:00:00 2001 From: Matthew Rasmus Date: Fri, 5 Dec 2014 09:48:35 -0800 Subject: [PATCH 5/5] Handle default uint attributes properly ...and passing a whole bunch of new tests. --- components/script/dom/htmltextareaelement.rs | 13 +- .../html/dom/reflection-forms.html.ini | 759 ------------------ 2 files changed, 12 insertions(+), 760 deletions(-) diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 59cbf9e6dd7..c169a169cf9 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; +use dom::attr::{Attr, AttrValue}; use dom::attr::AttrHelpers; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::EventBinding::EventMethods; @@ -55,6 +55,9 @@ impl LayoutHTMLTextAreaElementHelpers for JS { } } +static DEFAULT_COLS: u32 = 20; +static DEFAULT_ROWS: u32 = 2; + impl HTMLTextAreaElement { fn new_inherited(localName: DOMString, prefix: Option, document: JSRef) -> HTMLTextAreaElement { HTMLTextAreaElement { @@ -213,6 +216,14 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLTextAreaElement> { node.check_ancestors_disabled_state_for_form_control(); } + fn parse_plain_attribute(&self, name: &Atom, value: DOMString) -> AttrValue { + match name { + &atom!("cols") => AttrValue::from_u32(value, DEFAULT_COLS), + &atom!("rows") => AttrValue::from_u32(value, DEFAULT_ROWS), + _ => self.super_type().unwrap().parse_plain_attribute(name, value), + } + } + fn unbind_from_tree(&self, tree_in_doc: bool) { match self.super_type() { Some(ref s) => s.unbind_from_tree(tree_in_doc), diff --git a/tests/wpt/metadata/html/dom/reflection-forms.html.ini b/tests/wpt/metadata/html/dom/reflection-forms.html.ini index b9e9561ade5..2569e501673 100644 --- a/tests/wpt/metadata/html/dom/reflection-forms.html.ini +++ b/tests/wpt/metadata/html/dom/reflection-forms.html.ini @@ -13401,165 +13401,39 @@ [textarea.autofocus: IDL set to object "test-valueOf" followed by IDL get] expected: FAIL - [textarea.cols: typeof IDL attribute] - expected: FAIL - [textarea.cols: IDL get with DOM attribute unset] expected: FAIL - [textarea.cols: setAttribute() to -2147483649 followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to -2147483648 followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to -36 followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to -1 followed by IDL get] - expected: FAIL - [textarea.cols: setAttribute() to 0 followed by IDL get] expected: FAIL - [textarea.cols: setAttribute() to 1 followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to 2147483647 followed by IDL get] - expected: FAIL - [textarea.cols: setAttribute() to 2147483648 followed by IDL get] expected: FAIL [textarea.cols: setAttribute() to 4294967295 followed by IDL get] expected: FAIL - [textarea.cols: setAttribute() to 4294967296 followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "-1" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "-0" followed by IDL get] - expected: FAIL - [textarea.cols: setAttribute() to "0" followed by IDL get] expected: FAIL - [textarea.cols: setAttribute() to "1" followed by IDL get] - expected: FAIL - [textarea.cols: setAttribute() to "\\t7" followed by IDL get] expected: FAIL - [textarea.cols: setAttribute() to "\\v7" followed by IDL get] - expected: FAIL - [textarea.cols: setAttribute() to "\\f7" followed by IDL get] expected: FAIL [textarea.cols: setAttribute() to " 7" followed by IDL get] expected: FAIL - [textarea.cols: setAttribute() to "\xc2\xa07" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xef\xbb\xbf7" followed by IDL get] - expected: FAIL - [textarea.cols: setAttribute() to "\\n7" followed by IDL get] expected: FAIL [textarea.cols: setAttribute() to "\\r7" followed by IDL get] expected: FAIL - [textarea.cols: setAttribute() to "\xe2\x80\xa87" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe2\x80\xa97" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe1\x9a\x807" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe1\xa0\x8e7" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe2\x80\x807" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe2\x80\x817" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe2\x80\x827" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe2\x80\x837" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe2\x80\x847" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe2\x80\x857" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe2\x80\x867" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe2\x80\x877" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe2\x80\x887" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe2\x80\x897" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe2\x80\x8a7" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe2\x80\xaf7" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\xe3\x80\x807" followed by IDL get] - expected: FAIL - - [textarea.cols: 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 - - [textarea.cols: setAttribute() to undefined followed by IDL get] - expected: FAIL - [textarea.cols: setAttribute() to 1.5 followed by IDL get] expected: FAIL - [textarea.cols: setAttribute() to true followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to false followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to object "[object Object\]" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to NaN followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to Infinity followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to -Infinity followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to "\\0" followed by IDL get] - expected: FAIL - - [textarea.cols: setAttribute() to object "2" followed by IDL get] - expected: FAIL - [textarea.cols: setAttribute() to object "3" followed by getAttribute()] expected: FAIL @@ -13569,12 +13443,6 @@ [textarea.cols: IDL set to 0 must throw INDEX_SIZE_ERR] expected: FAIL - [textarea.cols: IDL set to 1 followed by getAttribute()] - expected: FAIL - - [textarea.cols: IDL set to 2147483647 followed by getAttribute()] - expected: FAIL - [textarea.dirName: typeof IDL attribute] expected: FAIL @@ -14484,264 +14352,6 @@ [textarea.maxLength: IDL set to 2147483647 followed by getAttribute()] expected: FAIL - [textarea.name: typeof IDL attribute] - expected: FAIL - - [textarea.name: IDL get with DOM attribute unset] - expected: FAIL - - [textarea.name: setAttribute() to "" followed by IDL get] - expected: FAIL - - [textarea.name: 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 - - [textarea.name: setAttribute() to undefined followed by IDL get] - expected: FAIL - - [textarea.name: setAttribute() to 7 followed by IDL get] - expected: FAIL - - [textarea.name: setAttribute() to 1.5 followed by IDL get] - expected: FAIL - - [textarea.name: setAttribute() to true followed by IDL get] - expected: FAIL - - [textarea.name: setAttribute() to false followed by IDL get] - expected: FAIL - - [textarea.name: setAttribute() to object "[object Object\]" followed by IDL get] - expected: FAIL - - [textarea.name: setAttribute() to NaN followed by IDL get] - expected: FAIL - - [textarea.name: setAttribute() to Infinity followed by IDL get] - expected: FAIL - - [textarea.name: setAttribute() to -Infinity followed by IDL get] - expected: FAIL - - [textarea.name: setAttribute() to "\\0" followed by IDL get] - expected: FAIL - - [textarea.name: setAttribute() to null followed by IDL get] - expected: FAIL - - [textarea.name: setAttribute() to object "test-toString" followed by IDL get] - expected: FAIL - - [textarea.name: setAttribute() to object "test-valueOf" followed by IDL get] - expected: FAIL - - [textarea.name: IDL set to "" followed by getAttribute()] - expected: FAIL - - [textarea.name: 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 - - [textarea.name: IDL set to undefined followed by getAttribute()] - expected: FAIL - - [textarea.name: IDL set to undefined followed by IDL get] - expected: FAIL - - [textarea.name: IDL set to 7 followed by getAttribute()] - expected: FAIL - - [textarea.name: IDL set to 7 followed by IDL get] - expected: FAIL - - [textarea.name: IDL set to 1.5 followed by getAttribute()] - expected: FAIL - - [textarea.name: IDL set to 1.5 followed by IDL get] - expected: FAIL - - [textarea.name: IDL set to true followed by getAttribute()] - expected: FAIL - - [textarea.name: IDL set to true followed by IDL get] - expected: FAIL - - [textarea.name: IDL set to false followed by getAttribute()] - expected: FAIL - - [textarea.name: IDL set to false followed by IDL get] - expected: FAIL - - [textarea.name: IDL set to object "[object Object\]" followed by getAttribute()] - expected: FAIL - - [textarea.name: IDL set to object "[object Object\]" followed by IDL get] - expected: FAIL - - [textarea.name: IDL set to NaN followed by getAttribute()] - expected: FAIL - - [textarea.name: IDL set to NaN followed by IDL get] - expected: FAIL - - [textarea.name: IDL set to Infinity followed by getAttribute()] - expected: FAIL - - [textarea.name: IDL set to Infinity followed by IDL get] - expected: FAIL - - [textarea.name: IDL set to -Infinity followed by getAttribute()] - expected: FAIL - - [textarea.name: IDL set to -Infinity followed by IDL get] - expected: FAIL - - [textarea.name: IDL set to "\\0" followed by getAttribute()] - expected: FAIL - - [textarea.name: IDL set to null followed by getAttribute()] - expected: FAIL - - [textarea.name: IDL set to null followed by IDL get] - expected: FAIL - - [textarea.name: IDL set to object "test-toString" followed by getAttribute()] - expected: FAIL - - [textarea.name: IDL set to object "test-toString" followed by IDL get] - expected: FAIL - - [textarea.name: IDL set to object "test-valueOf" followed by IDL get] - expected: FAIL - - [textarea.placeholder: typeof IDL attribute] - expected: FAIL - - [textarea.placeholder: IDL get with DOM attribute unset] - expected: FAIL - - [textarea.placeholder: setAttribute() to "" followed by IDL get] - expected: FAIL - - [textarea.placeholder: 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 - - [textarea.placeholder: setAttribute() to undefined followed by IDL get] - expected: FAIL - - [textarea.placeholder: setAttribute() to 7 followed by IDL get] - expected: FAIL - - [textarea.placeholder: setAttribute() to 1.5 followed by IDL get] - expected: FAIL - - [textarea.placeholder: setAttribute() to true followed by IDL get] - expected: FAIL - - [textarea.placeholder: setAttribute() to false followed by IDL get] - expected: FAIL - - [textarea.placeholder: setAttribute() to object "[object Object\]" followed by IDL get] - expected: FAIL - - [textarea.placeholder: setAttribute() to NaN followed by IDL get] - expected: FAIL - - [textarea.placeholder: setAttribute() to Infinity followed by IDL get] - expected: FAIL - - [textarea.placeholder: setAttribute() to -Infinity followed by IDL get] - expected: FAIL - - [textarea.placeholder: setAttribute() to "\\0" followed by IDL get] - expected: FAIL - - [textarea.placeholder: setAttribute() to null followed by IDL get] - expected: FAIL - - [textarea.placeholder: setAttribute() to object "test-toString" followed by IDL get] - expected: FAIL - - [textarea.placeholder: setAttribute() to object "test-valueOf" followed by IDL get] - expected: FAIL - - [textarea.placeholder: IDL set to "" followed by getAttribute()] - expected: FAIL - - [textarea.placeholder: 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 - - [textarea.placeholder: IDL set to undefined followed by getAttribute()] - expected: FAIL - - [textarea.placeholder: IDL set to undefined followed by IDL get] - expected: FAIL - - [textarea.placeholder: IDL set to 7 followed by getAttribute()] - expected: FAIL - - [textarea.placeholder: IDL set to 7 followed by IDL get] - expected: FAIL - - [textarea.placeholder: IDL set to 1.5 followed by getAttribute()] - expected: FAIL - - [textarea.placeholder: IDL set to 1.5 followed by IDL get] - expected: FAIL - - [textarea.placeholder: IDL set to true followed by getAttribute()] - expected: FAIL - - [textarea.placeholder: IDL set to true followed by IDL get] - expected: FAIL - - [textarea.placeholder: IDL set to false followed by getAttribute()] - expected: FAIL - - [textarea.placeholder: IDL set to false followed by IDL get] - expected: FAIL - - [textarea.placeholder: IDL set to object "[object Object\]" followed by getAttribute()] - expected: FAIL - - [textarea.placeholder: IDL set to object "[object Object\]" followed by IDL get] - expected: FAIL - - [textarea.placeholder: IDL set to NaN followed by getAttribute()] - expected: FAIL - - [textarea.placeholder: IDL set to NaN followed by IDL get] - expected: FAIL - - [textarea.placeholder: IDL set to Infinity followed by getAttribute()] - expected: FAIL - - [textarea.placeholder: IDL set to Infinity followed by IDL get] - expected: FAIL - - [textarea.placeholder: IDL set to -Infinity followed by getAttribute()] - expected: FAIL - - [textarea.placeholder: IDL set to -Infinity followed by IDL get] - expected: FAIL - - [textarea.placeholder: IDL set to "\\0" followed by getAttribute()] - expected: FAIL - - [textarea.placeholder: IDL set to null followed by getAttribute()] - expected: FAIL - - [textarea.placeholder: IDL set to null followed by IDL get] - expected: FAIL - - [textarea.placeholder: IDL set to object "test-toString" followed by getAttribute()] - expected: FAIL - - [textarea.placeholder: IDL set to object "test-toString" followed by IDL get] - expected: FAIL - - [textarea.placeholder: IDL set to object "test-valueOf" followed by IDL get] - expected: FAIL - [textarea.readOnly: typeof IDL attribute] expected: FAIL @@ -14850,273 +14460,39 @@ [textarea.readOnly: IDL set to object "test-valueOf" followed by IDL get] expected: FAIL - [textarea.required: typeof IDL attribute] - expected: FAIL - - [textarea.required: IDL get with DOM attribute unset] - expected: FAIL - - [textarea.required: setAttribute() to "" followed by IDL get] - expected: FAIL - - [textarea.required: setAttribute() to " foo " followed by IDL get] - expected: FAIL - - [textarea.required: setAttribute() to undefined followed by IDL get] - expected: FAIL - - [textarea.required: setAttribute() to null followed by IDL get] - expected: FAIL - - [textarea.required: setAttribute() to 7 followed by IDL get] - expected: FAIL - - [textarea.required: setAttribute() to 1.5 followed by IDL get] - expected: FAIL - - [textarea.required: setAttribute() to true followed by IDL get] - expected: FAIL - - [textarea.required: setAttribute() to false followed by IDL get] - expected: FAIL - - [textarea.required: setAttribute() to object "[object Object\]" followed by IDL get] - expected: FAIL - - [textarea.required: setAttribute() to NaN followed by IDL get] - expected: FAIL - - [textarea.required: setAttribute() to Infinity followed by IDL get] - expected: FAIL - - [textarea.required: setAttribute() to -Infinity followed by IDL get] - expected: FAIL - - [textarea.required: setAttribute() to "\\0" followed by IDL get] - expected: FAIL - - [textarea.required: setAttribute() to object "test-toString" followed by IDL get] - expected: FAIL - - [textarea.required: setAttribute() to object "test-valueOf" followed by IDL get] - expected: FAIL - - [textarea.required: setAttribute() to "required" followed by IDL get] - expected: FAIL - - [textarea.required: IDL set to "" followed by hasAttribute()] - expected: FAIL - - [textarea.required: IDL set to "" followed by IDL get] - expected: FAIL - - [textarea.required: IDL set to " foo " followed by IDL get] - expected: FAIL - - [textarea.required: IDL set to undefined followed by hasAttribute()] - expected: FAIL - - [textarea.required: IDL set to undefined followed by IDL get] - expected: FAIL - - [textarea.required: IDL set to null followed by hasAttribute()] - expected: FAIL - - [textarea.required: IDL set to null followed by IDL get] - expected: FAIL - - [textarea.required: IDL set to 7 followed by IDL get] - expected: FAIL - - [textarea.required: IDL set to 1.5 followed by IDL get] - expected: FAIL - - [textarea.required: IDL set to false followed by hasAttribute()] - expected: FAIL - - [textarea.required: IDL set to object "[object Object\]" followed by IDL get] - expected: FAIL - - [textarea.required: IDL set to NaN followed by hasAttribute()] - expected: FAIL - - [textarea.required: IDL set to NaN followed by IDL get] - expected: FAIL - - [textarea.required: IDL set to Infinity followed by IDL get] - expected: FAIL - - [textarea.required: IDL set to -Infinity followed by IDL get] - expected: FAIL - - [textarea.required: IDL set to "\\0" followed by IDL get] - expected: FAIL - - [textarea.required: IDL set to object "test-toString" followed by IDL get] - expected: FAIL - - [textarea.required: IDL set to object "test-valueOf" followed by IDL get] - expected: FAIL - - [textarea.rows: typeof IDL attribute] - expected: FAIL - [textarea.rows: IDL get with DOM attribute unset] expected: FAIL - [textarea.rows: setAttribute() to -2147483649 followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to -2147483648 followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to -36 followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to -1 followed by IDL get] - expected: FAIL - [textarea.rows: setAttribute() to 0 followed by IDL get] expected: FAIL - [textarea.rows: setAttribute() to 1 followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to 2147483647 followed by IDL get] - expected: FAIL - [textarea.rows: setAttribute() to 2147483648 followed by IDL get] expected: FAIL [textarea.rows: setAttribute() to 4294967295 followed by IDL get] expected: FAIL - [textarea.rows: setAttribute() to 4294967296 followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "-1" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "-0" followed by IDL get] - expected: FAIL - [textarea.rows: setAttribute() to "0" followed by IDL get] expected: FAIL - [textarea.rows: setAttribute() to "1" followed by IDL get] - expected: FAIL - [textarea.rows: setAttribute() to "\\t7" followed by IDL get] expected: FAIL - [textarea.rows: setAttribute() to "\\v7" followed by IDL get] - expected: FAIL - [textarea.rows: setAttribute() to "\\f7" followed by IDL get] expected: FAIL [textarea.rows: setAttribute() to " 7" followed by IDL get] expected: FAIL - [textarea.rows: setAttribute() to "\xc2\xa07" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xef\xbb\xbf7" followed by IDL get] - expected: FAIL - [textarea.rows: setAttribute() to "\\n7" followed by IDL get] expected: FAIL [textarea.rows: setAttribute() to "\\r7" followed by IDL get] expected: FAIL - [textarea.rows: setAttribute() to "\xe2\x80\xa87" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe2\x80\xa97" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe1\x9a\x807" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe1\xa0\x8e7" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe2\x80\x807" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe2\x80\x817" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe2\x80\x827" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe2\x80\x837" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe2\x80\x847" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe2\x80\x857" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe2\x80\x867" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe2\x80\x877" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe2\x80\x887" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe2\x80\x897" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe2\x80\x8a7" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe2\x80\xaf7" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\xe3\x80\x807" followed by IDL get] - expected: FAIL - - [textarea.rows: 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 - - [textarea.rows: setAttribute() to undefined followed by IDL get] - expected: FAIL - [textarea.rows: setAttribute() to 1.5 followed by IDL get] expected: FAIL - [textarea.rows: setAttribute() to true followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to false followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to object "[object Object\]" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to NaN followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to Infinity followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to -Infinity followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to "\\0" followed by IDL get] - expected: FAIL - - [textarea.rows: setAttribute() to object "2" followed by IDL get] - expected: FAIL - [textarea.rows: setAttribute() to object "3" followed by getAttribute()] expected: FAIL @@ -15126,141 +14502,6 @@ [textarea.rows: IDL set to 0 must throw INDEX_SIZE_ERR] expected: FAIL - [textarea.rows: IDL set to 1 followed by getAttribute()] - expected: FAIL - - [textarea.rows: IDL set to 2147483647 followed by getAttribute()] - expected: FAIL - - [textarea.wrap: typeof IDL attribute] - expected: FAIL - - [textarea.wrap: IDL get with DOM attribute unset] - expected: FAIL - - [textarea.wrap: setAttribute() to "" followed by IDL get] - expected: FAIL - - [textarea.wrap: 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 - - [textarea.wrap: setAttribute() to undefined followed by IDL get] - expected: FAIL - - [textarea.wrap: setAttribute() to 7 followed by IDL get] - expected: FAIL - - [textarea.wrap: setAttribute() to 1.5 followed by IDL get] - expected: FAIL - - [textarea.wrap: setAttribute() to true followed by IDL get] - expected: FAIL - - [textarea.wrap: setAttribute() to false followed by IDL get] - expected: FAIL - - [textarea.wrap: setAttribute() to object "[object Object\]" followed by IDL get] - expected: FAIL - - [textarea.wrap: setAttribute() to NaN followed by IDL get] - expected: FAIL - - [textarea.wrap: setAttribute() to Infinity followed by IDL get] - expected: FAIL - - [textarea.wrap: setAttribute() to -Infinity followed by IDL get] - expected: FAIL - - [textarea.wrap: setAttribute() to "\\0" followed by IDL get] - expected: FAIL - - [textarea.wrap: setAttribute() to null followed by IDL get] - expected: FAIL - - [textarea.wrap: setAttribute() to object "test-toString" followed by IDL get] - expected: FAIL - - [textarea.wrap: setAttribute() to object "test-valueOf" followed by IDL get] - expected: FAIL - - [textarea.wrap: IDL set to "" followed by getAttribute()] - expected: FAIL - - [textarea.wrap: 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 - - [textarea.wrap: IDL set to undefined followed by getAttribute()] - expected: FAIL - - [textarea.wrap: IDL set to undefined followed by IDL get] - expected: FAIL - - [textarea.wrap: IDL set to 7 followed by getAttribute()] - expected: FAIL - - [textarea.wrap: IDL set to 7 followed by IDL get] - expected: FAIL - - [textarea.wrap: IDL set to 1.5 followed by getAttribute()] - expected: FAIL - - [textarea.wrap: IDL set to 1.5 followed by IDL get] - expected: FAIL - - [textarea.wrap: IDL set to true followed by getAttribute()] - expected: FAIL - - [textarea.wrap: IDL set to true followed by IDL get] - expected: FAIL - - [textarea.wrap: IDL set to false followed by getAttribute()] - expected: FAIL - - [textarea.wrap: IDL set to false followed by IDL get] - expected: FAIL - - [textarea.wrap: IDL set to object "[object Object\]" followed by getAttribute()] - expected: FAIL - - [textarea.wrap: IDL set to object "[object Object\]" followed by IDL get] - expected: FAIL - - [textarea.wrap: IDL set to NaN followed by getAttribute()] - expected: FAIL - - [textarea.wrap: IDL set to NaN followed by IDL get] - expected: FAIL - - [textarea.wrap: IDL set to Infinity followed by getAttribute()] - expected: FAIL - - [textarea.wrap: IDL set to Infinity followed by IDL get] - expected: FAIL - - [textarea.wrap: IDL set to -Infinity followed by getAttribute()] - expected: FAIL - - [textarea.wrap: IDL set to -Infinity followed by IDL get] - expected: FAIL - - [textarea.wrap: IDL set to "\\0" followed by getAttribute()] - expected: FAIL - - [textarea.wrap: IDL set to null followed by getAttribute()] - expected: FAIL - - [textarea.wrap: IDL set to null followed by IDL get] - expected: FAIL - - [textarea.wrap: IDL set to object "test-toString" followed by getAttribute()] - expected: FAIL - - [textarea.wrap: IDL set to object "test-toString" followed by IDL get] - expected: FAIL - - [textarea.wrap: IDL set to object "test-valueOf" followed by IDL get] - expected: FAIL - [textarea.itemScope: typeof IDL attribute] expected: FAIL