diff --git a/components/layout/construct.rs b/components/layout/construct.rs index 050eb9d9857..1ce1c2f1ba3 100644 --- a/components/layout/construct.rs +++ b/components/layout/construct.rs @@ -297,7 +297,7 @@ impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode> let specific_fragment_info = match node.type_id() { Some(NodeTypeId::Element(ElementTypeId::HTMLElement( HTMLElementTypeId::HTMLIFrameElement))) => { - SpecificFragmentInfo::Iframe(box IframeFragmentInfo::new(node)) + SpecificFragmentInfo::Iframe(IframeFragmentInfo::new(node)) } Some(NodeTypeId::Element(ElementTypeId::HTMLElement( HTMLElementTypeId::HTMLImageElement))) => { @@ -578,7 +578,7 @@ impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode> // Add whitespace results. They will be stripped out later on when // between block elements, and retained when between inline elements. let fragment_info = SpecificFragmentInfo::UnscannedText( - UnscannedTextFragmentInfo::new(" ".to_owned(), None)); + box UnscannedTextFragmentInfo::new(" ".to_owned(), None)); properties::modify_style_for_replaced_content(&mut whitespace_style); properties::modify_style_for_text(&mut whitespace_style); let fragment = Fragment::from_opaque_node_and_style(whitespace_node, @@ -715,7 +715,7 @@ impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode> match text_content { TextContent::Text(string) => { - let info = UnscannedTextFragmentInfo::new(string, selection); + let info = box UnscannedTextFragmentInfo::new(string, selection); let specific_fragment_info = SpecificFragmentInfo::UnscannedText(info); fragments.fragments.push_back(Fragment::from_opaque_node_and_style( node.opaque(), @@ -728,7 +728,7 @@ impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode> for content_item in content_items.into_iter() { let specific_fragment_info = match content_item { ContentItem::String(string) => { - let info = UnscannedTextFragmentInfo::new(string, None); + let info = box UnscannedTextFragmentInfo::new(string, None); SpecificFragmentInfo::UnscannedText(info) } content_item => { @@ -859,7 +859,7 @@ impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode> whitespace_damage)) => { // Instantiate the whitespace fragment. let fragment_info = SpecificFragmentInfo::UnscannedText( - UnscannedTextFragmentInfo::new(" ".to_owned(), None)); + box UnscannedTextFragmentInfo::new(" ".to_owned(), None)); properties::modify_style_for_replaced_content(&mut whitespace_style); properties::modify_style_for_text(&mut whitespace_style); let fragment = Fragment::from_opaque_node_and_style(whitespace_node, @@ -1241,7 +1241,7 @@ impl<'a, ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode> unscanned_marker_fragments.push_back(Fragment::new( node, SpecificFragmentInfo::UnscannedText( - UnscannedTextFragmentInfo::new(text, None)))); + box UnscannedTextFragmentInfo::new(text, None)))); let marker_fragments = TextRunScanner::new().scan_for_runs( &mut self.layout_context.font_context(), unscanned_marker_fragments); @@ -1848,7 +1848,7 @@ fn control_chars_to_fragment(node: &InlineFragmentNodeInfo, restyle_damage: RestyleDamage) -> Fragment { let info = SpecificFragmentInfo::UnscannedText( - UnscannedTextFragmentInfo::new(String::from(text), None)); + box UnscannedTextFragmentInfo::new(String::from(text), None)); let mut style = node.style.clone(); properties::modify_style_for_text(&mut style); Fragment::from_opaque_node_and_style(node.address, diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index 6c48142a2c5..c675eb0aa5f 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -145,7 +145,7 @@ pub enum SpecificFragmentInfo { /// content resolution phase (e.g. an ordered list item marker). GeneratedContent(Box), - Iframe(Box), + Iframe(IframeFragmentInfo), Image(Box), Canvas(Box), @@ -167,7 +167,7 @@ pub enum SpecificFragmentInfo { TableWrapper, Multicol, MulticolColumn, - UnscannedText(UnscannedTextFragmentInfo), + UnscannedText(Box), } impl SpecificFragmentInfo { @@ -896,8 +896,8 @@ impl Fragment { let mut unscanned_ellipsis_fragments = LinkedList::new(); unscanned_ellipsis_fragments.push_back(self.transform( self.border_box.size, - SpecificFragmentInfo::UnscannedText(UnscannedTextFragmentInfo::new("…".to_owned(), - None)))); + SpecificFragmentInfo::UnscannedText( + box UnscannedTextFragmentInfo::new("…".to_owned(), None)))); let ellipsis_fragments = TextRunScanner::new().scan_for_runs(&mut layout_context.font_context(), unscanned_ellipsis_fragments); debug_assert!(ellipsis_fragments.len() == 1); diff --git a/components/layout/generated_content.rs b/components/layout/generated_content.rs index d4be74f9a4d..80ca30e2e71 100644 --- a/components/layout/generated_content.rs +++ b/components/layout/generated_content.rs @@ -434,7 +434,8 @@ fn render_text(layout_context: &LayoutContext, string: String) -> Option { let mut fragments = LinkedList::new(); - let info = SpecificFragmentInfo::UnscannedText(UnscannedTextFragmentInfo::new(string, None)); + let info = SpecificFragmentInfo::UnscannedText( + box UnscannedTextFragmentInfo::new(string, None)); fragments.push_back(Fragment::from_opaque_node_and_style(node, pseudo, style, diff --git a/components/layout/lib.rs b/components/layout/lib.rs index fa8a2231265..4f1d9abdac1 100644 --- a/components/layout/lib.rs +++ b/components/layout/lib.rs @@ -100,3 +100,6 @@ mod text; mod traversal; mod webrender_helpers; mod wrapper; + +// For unit tests: +pub use fragment::Fragment; diff --git a/components/layout/text.rs b/components/layout/text.rs index db9b8f13376..42af26efff6 100644 --- a/components/layout/text.rs +++ b/components/layout/text.rs @@ -476,8 +476,8 @@ fn split_first_fragment_at_newline_if_necessary(fragments: &mut LinkedList(); + + if actual < expected { + panic!("Your changes have decreased the stack size of layout::fragment::Fragment \ + from {} to {}. Good work! Please update the size in tests/layout/size_of.rs", + expected, actual); + } + + if actual > expected { + panic!("Your changes have increased the stack size of layout::fragment::Fragment \ + from {} to {}. Please consider choosing a design which avoids this increase. \ + If you feel that the increase is necessary, update the size in \ + tests/layout/size_of.rs.", + expected, actual); + } +} diff --git a/tests/unit/script/size_of.rs b/tests/unit/script/size_of.rs index 1550ca558d1..fc9cf6f09bf 100644 --- a/tests/unit/script/size_of.rs +++ b/tests/unit/script/size_of.rs @@ -23,14 +23,14 @@ macro_rules! sizeof_checker ( let old = $known_size; if new < old { panic!("Your changes have decreased the stack size of commonly used DOM struct {} from {} to {}. \ - Good work! Please update the size in script/tests.rs", + Good work! Please update the size in tests/unit/script/size_of.rs.", stringify!($t), old, new) } else if new > old { panic!("Your changes have increased the stack size of commonly used DOM struct {} from {} to {}. \ These structs are present in large quantities in the DOM, and increasing the size \ may dramatically affect our memory footprint. Please consider choosing a design which \ avoids this increase. If you feel that the increase is necessary, \ - update to the new size in script/tests.rs.", + update to the new size in tests/unit/script/size_of.rs.", stringify!($t), old, new) } });