From 35c67b22e5089d79df7ffc2d83475290cda99980 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Mon, 24 Aug 2015 11:43:43 -0700 Subject: [PATCH] layout: Don't crash if `quotes: none` is specified and generated content uses quotes. Avoids a crash on The Verge. --- components/layout/generated_content.rs | 43 ++++++++++--------- tests/ref/basic.list | 1 + tests/ref/quotes_none_a.html | 7 +++ tests/ref/quotes_none_ref.html | 2 + .../css21_dev/html4/quotes-035.htm.ini | 2 +- .../css21_dev/html4/quotes-035a.htm.ini | 2 +- .../css21_dev/html4/quotes-036.htm.ini | 2 +- 7 files changed, 36 insertions(+), 23 deletions(-) create mode 100644 tests/ref/quotes_none_a.html create mode 100644 tests/ref/quotes_none_ref.html diff --git a/components/layout/generated_content.rs b/components/layout/generated_content.rs index f512616761b..316f012b885 100644 --- a/components/layout/generated_content.rs +++ b/components/layout/generated_content.rs @@ -213,11 +213,11 @@ impl<'a,'b> ResolveGeneratedContentFragmentMutator<'a,'b> { RenderingMode::All(&separator)); } GeneratedContentInfo::ContentItem(ContentItem::OpenQuote) => { - new_info = Some(render_text(self.traversal.layout_context, - fragment.node, - fragment.pseudo, - fragment.style.clone(), - self.quote(&*fragment.style, false))); + new_info = render_text(self.traversal.layout_context, + fragment.node, + fragment.pseudo, + fragment.style.clone(), + self.quote(&*fragment.style, false)); self.traversal.quote += 1 } GeneratedContentInfo::ContentItem(ContentItem::CloseQuote) => { @@ -225,11 +225,11 @@ impl<'a,'b> ResolveGeneratedContentFragmentMutator<'a,'b> { self.traversal.quote -= 1 } - new_info = Some(render_text(self.traversal.layout_context, - fragment.node, - fragment.pseudo, - fragment.style.clone(), - self.quote(&*fragment.style, true))); + new_info = render_text(self.traversal.layout_context, + fragment.node, + fragment.pseudo, + fragment.style.clone(), + self.quote(&*fragment.style, true)); } GeneratedContentInfo::ContentItem(ContentItem::NoOpenQuote) => { self.traversal.quote += 1 @@ -277,10 +277,7 @@ impl<'a,'b> ResolveGeneratedContentFragmentMutator<'a,'b> { self.traversal.counters.insert((*counter_name).clone(), counter); } - for &(ref counter_name, value) in &fragment.style() - .get_counters() - .counter_increment - .0 { + for &(ref counter_name, value) in &fragment.style().get_counters().counter_increment.0 { if let Some(ref mut counter) = self.traversal.counters.get_mut(counter_name) { counter.increment(self.level, value); continue @@ -296,7 +293,9 @@ impl<'a,'b> ResolveGeneratedContentFragmentMutator<'a,'b> { fn quote(&self, style: &ComputedValues, close: bool) -> String { let quotes = &style.get_list().quotes; - debug_assert!(!quotes.0.is_empty()); + if quotes.0.is_empty() { + return String::new() + } let &(ref open_quote, ref close_quote) = if self.traversal.quote as usize >= quotes.0.len() { quotes.0.last().unwrap() @@ -398,7 +397,7 @@ impl Counter { if string.is_empty() { None } else { - Some(render_text(layout_context, node, pseudo, style, string)) + render_text(layout_context, node, pseudo, style, string) } } } @@ -427,7 +426,7 @@ fn render_text(layout_context: &LayoutContext, pseudo: PseudoElementType<()>, style: Arc, string: String) - -> SpecificFragmentInfo { + -> Option { let mut fragments = LinkedList::new(); let info = SpecificFragmentInfo::UnscannedText(UnscannedTextFragmentInfo::from_text(string)); fragments.push_back(Fragment::from_opaque_node_and_style(node, @@ -437,9 +436,13 @@ fn render_text(layout_context: &LayoutContext, info)); // FIXME(pcwalton): This should properly handle multiple marker fragments. This could happen // due to text run splitting. - let fragments = TextRunScanner::new().scan_for_runs(&mut layout_context.font_context(), fragments); - debug_assert!(fragments.len() >= 1); - fragments.fragments.into_iter().next().unwrap().specific + let fragments = TextRunScanner::new().scan_for_runs(&mut layout_context.font_context(), + fragments); + if fragments.is_empty() { + None + } else { + Some(fragments.fragments.into_iter().next().unwrap().specific) + } } /// Appends string that represents the value rendered using the system appropriate for the given diff --git a/tests/ref/basic.list b/tests/ref/basic.list index cdceba932b3..84d11b13b22 100644 --- a/tests/ref/basic.list +++ b/tests/ref/basic.list @@ -298,6 +298,7 @@ flaky_cpu == linebreak_simple_a.html linebreak_simple_b.html == pre_with_tab.html pre_with_tab_ref.html == pseudo_element_a.html pseudo_element_b.html == pseudo_inherit.html pseudo_inherit_ref.html +== quotes_none_a.html quotes_none_ref.html == quotes_simple_a.html quotes_simple_ref.html == root_height_a.html root_height_b.html == root_margin_collapse_a.html root_margin_collapse_b.html diff --git a/tests/ref/quotes_none_a.html b/tests/ref/quotes_none_a.html new file mode 100644 index 00000000000..eed1edea5a5 --- /dev/null +++ b/tests/ref/quotes_none_a.html @@ -0,0 +1,7 @@ + + +Don't crash! diff --git a/tests/ref/quotes_none_ref.html b/tests/ref/quotes_none_ref.html new file mode 100644 index 00000000000..85f3cf14ca2 --- /dev/null +++ b/tests/ref/quotes_none_ref.html @@ -0,0 +1,2 @@ + +Don't crash! diff --git a/tests/wpt/metadata-css/css21_dev/html4/quotes-035.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/quotes-035.htm.ini index 480b64d5ed6..8cb1b557b80 100644 --- a/tests/wpt/metadata-css/css21_dev/html4/quotes-035.htm.ini +++ b/tests/wpt/metadata-css/css21_dev/html4/quotes-035.htm.ini @@ -1,3 +1,3 @@ [quotes-035.htm] type: reftest - expected: CRASH + expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/quotes-035a.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/quotes-035a.htm.ini index 934ccab7cc7..6f38ba93b98 100644 --- a/tests/wpt/metadata-css/css21_dev/html4/quotes-035a.htm.ini +++ b/tests/wpt/metadata-css/css21_dev/html4/quotes-035a.htm.ini @@ -1,3 +1,3 @@ [quotes-035a.htm] type: reftest - expected: CRASH + expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/quotes-036.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/quotes-036.htm.ini index f64c75a1d90..f79479fde90 100644 --- a/tests/wpt/metadata-css/css21_dev/html4/quotes-036.htm.ini +++ b/tests/wpt/metadata-css/css21_dev/html4/quotes-036.htm.ini @@ -1,3 +1,3 @@ [quotes-036.htm] type: reftest - expected: CRASH + expected: FAIL