diff --git a/components/layout/display_list/builder.rs b/components/layout/display_list/builder.rs index a1ea9b89437..ec660607251 100644 --- a/components/layout/display_list/builder.rs +++ b/components/layout/display_list/builder.rs @@ -3017,11 +3017,12 @@ pub struct IndexableText { impl IndexableText { fn insert(&mut self, node: OpaqueNode, item: IndexableTextItem) { - if let Some(items) = self.inner.get_mut(&node) { - items.push(item); - return; - } - self.inner.insert(node, vec![item]); + let entries = self.inner.entry(node).or_insert(Vec::new()); + entries.push(item); + } + + pub fn get(&self, node: OpaqueNode) -> Option<&[IndexableTextItem]> { + self.inner.get(&node).map(|x| x.as_slice()) } // Returns the text index within a node for the point of interest. diff --git a/components/layout/query.rs b/components/layout/query.rs index e8a40c3012c..025953b374e 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -11,7 +11,7 @@ use display_list::IndexableText; use euclid::{Point2D, Vector2D, Rect, Size2D}; use flow::{Flow, GetBaseFlow}; use fragment::{Fragment, FragmentBorderBoxIterator, SpecificFragmentInfo}; -use gfx::display_list::{DisplayItem, DisplayList, OpaqueNode, ScrollOffsetMap}; +use gfx::display_list::{DisplayList, OpaqueNode, ScrollOffsetMap}; use inline::InlineFragmentNodeFlags; use ipc_channel::ipc::IpcSender; use msg::constellation_msg::PipelineId; @@ -27,7 +27,6 @@ use script_traits::LayoutMsg as ConstellationMsg; use script_traits::UntrustedNodeAddress; use sequential; use std::cmp::{min, max}; -use std::collections::HashMap; use std::ops::Deref; use std::sync::{Arc, Mutex}; use style::computed_values::display::T as Display; @@ -888,16 +887,11 @@ enum InnerTextItem { // https://html.spec.whatwg.org/multipage/#the-innertext-idl-attribute pub fn process_element_inner_text_query(node: N, - display_list: &Option>) -> String { - if !display_list.is_some() { - warn!("We should have a display list at this point. Cannot get inner text"); - return String::new(); - } - + indexable_text: &IndexableText) -> String { // Step 1. let mut results = Vec::new(); // Step 2. - inner_text_collection_steps(node, display_list.as_ref().unwrap(), &mut results); + inner_text_collection_steps(node, indexable_text, &mut results); let mut max_req_line_break_count = 0; let mut inner_text = Vec::new(); for item in results { @@ -936,18 +930,8 @@ pub fn process_element_inner_text_query(node: N, // https://html.spec.whatwg.org/multipage/#inner-text-collection-steps #[allow(unsafe_code)] fn inner_text_collection_steps(node: N, - display_list: &Arc, + indexable_text: &IndexableText, results: &mut Vec) { - // Extracts the text nodes from the display list to avoid traversing it - // for each child node. - let mut text = HashMap::new(); - for item in &display_list.as_ref().list { - if let &DisplayItem::Text(ref text_content) = item { - let entries = text.entry(&item.base().metadata.node).or_insert(Vec::new()); - entries.push(&text_content.text_run.text); - } - } - let mut items = Vec::new(); for child in node.traverse_preorder() { let node = match child.type_id() { @@ -986,9 +970,9 @@ fn inner_text_collection_steps(node: N, match child.type_id() { LayoutNodeType::Text => { // Step 4. - if let Some(text_content) = text.get(&child.opaque()) { + if let Some(text_content) = indexable_text.get(child.opaque()) { for content in text_content { - items.push(InnerTextItem::Text(content.to_string())); + items.push(InnerTextItem::Text(content.text_run.text.to_string())); } } }, diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs index 85d056d3d4a..4e55daaab6a 100644 --- a/components/layout_thread/lib.rs +++ b/components/layout_thread/lib.rs @@ -1427,7 +1427,7 @@ impl LayoutThread { ReflowGoal::ElementInnerTextQuery(node) => { let node = unsafe { ServoLayoutNode::new(&node) }; rw_data.element_inner_text_response = - process_element_inner_text_query(node, &rw_data.display_list); + process_element_inner_text_query(node, &rw_data.indexable_text); }, ReflowGoal::Full | ReflowGoal::TickAnimations => {} }