diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs index 35353a85cf1..12d2e0f3b8a 100644 --- a/components/layout/wrapper.rs +++ b/components/layout/wrapper.rs @@ -58,7 +58,6 @@ use script::layout_interface::TrustedNodeAddress; use selectors::matching::{DeclarationBlock, ElementFlags}; use selectors::parser::{AttrSelector, NamespaceConstraint}; use smallvec::VecLike; -use std::borrow::ToOwned; use std::cell::{Ref, RefCell, RefMut}; use std::marker::PhantomData; use std::mem::{transmute, transmute_copy}; @@ -1137,22 +1136,7 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> { } let this = unsafe { self.get_jsmanaged() }; - if let Some(text) = this.downcast::() { - let data = unsafe { - text.upcast().data_for_layout().to_owned() - }; - return TextContent::Text(data); - } - if let Some(input) = this.downcast::() { - let data = unsafe { input.value_for_layout() }; - return TextContent::Text(data); - } - if let Some(area) = this.downcast::() { - let data = unsafe { area.get_value_for_layout() }; - return TextContent::Text(data); - } - - unreachable!("not text!") + return TextContent::Text(this.text_content()); } fn selection(&self) -> Option> { diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 3a77fb6fe6d..d9d9343680d 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -32,7 +32,7 @@ use dom::bindings::reflector::{Reflectable, reflect_dom_object}; use dom::bindings::trace::JSTraceable; use dom::bindings::trace::RootedVec; use dom::bindings::xmlname::namespace_from_domstring; -use dom::characterdata::CharacterData; +use dom::characterdata::{CharacterData, LayoutCharacterDataHelpers}; use dom::document::{Document, DocumentSource, IsHTMLDocument}; use dom::documentfragment::DocumentFragment; use dom::documenttype::DocumentType; @@ -41,6 +41,8 @@ use dom::eventtarget::EventTarget; use dom::htmlbodyelement::HTMLBodyElement; use dom::htmlcollection::HTMLCollection; use dom::htmlelement::HTMLElement; +use dom::htmlinputelement::{HTMLInputElement, LayoutHTMLInputElementHelpers}; +use dom::htmltextareaelement::{HTMLTextAreaElement, LayoutHTMLTextAreaElementHelpers}; use dom::nodelist::NodeList; use dom::processinginstruction::ProcessingInstruction; use dom::range::WeakRangeVec; @@ -958,6 +960,8 @@ pub trait LayoutNodeHelpers { unsafe fn get_style_and_layout_data(&self) -> Option; unsafe fn init_style_and_layout_data(&self, OpaqueStyleAndLayoutData); + + fn text_content(&self) -> String; } impl LayoutNodeHelpers for LayoutJS { @@ -1048,6 +1052,23 @@ impl LayoutNodeHelpers for LayoutJS { debug_assert!((*self.unsafe_get()).style_and_layout_data.get().is_none()); (*self.unsafe_get()).style_and_layout_data.set(Some(val)); } + + #[allow(unsafe_code)] + fn text_content(&self) -> String { + if let Some(text) = self.downcast::() { + return unsafe { text.upcast().data_for_layout().to_owned() }; + } + + if let Some(input) = self.downcast::() { + return unsafe { input.value_for_layout() }; + } + + if let Some(area) = self.downcast::() { + return unsafe { area.get_value_for_layout() }; + } + + panic!("not text!") + } }