diff --git a/components/layout/display_list_builder.rs b/components/layout/display_list_builder.rs index 4bc969b2e74..8188e3c06fb 100644 --- a/components/layout/display_list_builder.rs +++ b/components/layout/display_list_builder.rs @@ -29,7 +29,6 @@ use gfx::display_list::{LayeredItem, LayerInfo, LineDisplayItem, OpaqueNode}; use gfx::display_list::{SolidColorDisplayItem, StackingContext, StackingContextType}; use gfx::display_list::{TextDisplayItem, TextOrientation, WebRenderImageInfo}; use gfx::paint_thread::THREAD_TINT_COLORS; -use gfx::text::glyph::ByteIndex; use gfx_traits::{color, ScrollPolicy, StackingContextId}; use inline::{FIRST_FRAGMENT_OF_ELEMENT, InlineFlow, LAST_FRAGMENT_OF_ELEMENT}; use ipc_channel::ipc; @@ -970,7 +969,8 @@ impl FragmentDisplayListBuilding for Fragment { Some(insertion_point_index) => insertion_point_index, None => return, }; - let range = Range::new(ByteIndex(0), insertion_point_index); + let range = Range::new(scanned_text_fragment_info.range.begin(), + insertion_point_index - scanned_text_fragment_info.range.begin()); let advance = scanned_text_fragment_info.run.advance_for_range(&range); let insertion_point_bounds; diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index 8092985f401..da62243f26f 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -882,16 +882,23 @@ impl Fragment { let size = LogicalSize::new(self.style.writing_mode, split.inline_size, self.border_box.size.block); - let flags = match self.specific { - SpecificFragmentInfo::ScannedText(ref info) => info.flags, - _ => ScannedTextFlags::empty() + // Preserve the insertion point if it is in this fragment's range or it is at line end. + let (flags, insertion_point) = match self.specific { + SpecificFragmentInfo::ScannedText(ref info) => { + match info.insertion_point { + Some(index) if split.range.contains(index) => (info.flags, info.insertion_point), + Some(index) if index == ByteIndex(text_run.text.chars().count() as isize - 1) && + index == split.range.end() => (info.flags, info.insertion_point), + _ => (info.flags, None) + } + }, + _ => (ScannedTextFlags::empty(), None) }; - // FIXME(pcwalton): This should modify the insertion point as necessary. let info = box ScannedTextFragmentInfo::new( text_run, split.range, size, - None, + insertion_point, flags); self.transform(size, SpecificFragmentInfo::ScannedText(info)) } diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs index 9bb65979f4e..96e1b89a1e0 100644 --- a/components/style/properties/properties.mako.rs +++ b/components/style/properties/properties.mako.rs @@ -2130,10 +2130,6 @@ pub fn modify_style_for_input_text(style: &mut Arc) { margin_style.margin_right = computed::LengthOrPercentageOrAuto::Length(Au(0)); margin_style.margin_bottom = computed::LengthOrPercentageOrAuto::Length(Au(0)); margin_style.margin_left = computed::LengthOrPercentageOrAuto::Length(Au(0)); - - // whitespace inside text input should not be collapsed - let inherited_text = Arc::make_mut(&mut style.inheritedtext); - inherited_text.white_space = longhands::white_space::computed_value::T::pre; } /// Adjusts the `clip` property so that an inline absolute hypothetical fragment doesn't clip its diff --git a/resources/servo.css b/resources/servo.css index 98ee52c0982..95eccfd1603 100644 --- a/resources/servo.css +++ b/resources/servo.css @@ -9,7 +9,7 @@ input { color: black; font-family: sans-serif; font-size: 0.8333em; - white-space: nowrap; + white-space: pre; text-align: left; line-height: 1.8; } @@ -24,7 +24,7 @@ textarea { color: black; font-family: sans-serif; font-size: 0.8333em; - white-space: pre; + white-space: pre-wrap; } input::selection,