aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-11-09 16:36:45 -0600
committerGitHub <noreply@github.com>2016-11-09 16:36:45 -0600
commita91f48ee05933784630fdf918fc4b66037dba9f1 (patch)
tree1165f1678b0471bd241d7239be5a37846b4bf6ad
parent9a7559fd826f53a0020e5e9a575c8265ad349af7 (diff)
parent4b2737606d25ab19d6ddbf17c14eaa4f6edf093d (diff)
downloadservo-a91f48ee05933784630fdf918fc4b66037dba9f1.tar.gz
servo-a91f48ee05933784630fdf918fc4b66037dba9f1.zip
Auto merge of #13924 - cynicaldevil:text-overflow, r=emilio
implemented string-valued text-overflow <!-- Please describe your changes on the following line: --> --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes fix #13709 <!-- Either: --> - [x] There are tests for these changes <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> cc @Manishearth The lorem-ipsum example from MDN works as expected. <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/13924) <!-- Reviewable:end -->
-rw-r--r--components/layout/fragment.rs7
-rw-r--r--components/layout/inline.rs37
-rw-r--r--components/style/properties/longhand/text.mako.rs4
-rw-r--r--tests/wpt/mozilla/meta/MANIFEST.json56
-rw-r--r--tests/wpt/mozilla/tests/css/text_overflow_ellipsis.html (renamed from tests/wpt/mozilla/tests/css/text_overflow_a.html)5
-rw-r--r--tests/wpt/mozilla/tests/css/text_overflow_ref.html2
-rw-r--r--tests/wpt/mozilla/tests/css/text_overflow_string.html20
7 files changed, 91 insertions, 40 deletions
diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs
index 7ff692e913b..2c193d09e41 100644
--- a/components/layout/fragment.rs
+++ b/components/layout/fragment.rs
@@ -1037,12 +1037,15 @@ impl Fragment {
}
/// Transforms this fragment into an ellipsis fragment, preserving all the other data.
- pub fn transform_into_ellipsis(&self, layout_context: &LayoutContext) -> Fragment {
+ pub fn transform_into_ellipsis(&self,
+ layout_context: &LayoutContext,
+ text_overflow_string: String)
+ -> Fragment {
let mut unscanned_ellipsis_fragments = LinkedList::new();
unscanned_ellipsis_fragments.push_back(self.transform(
self.border_box.size,
SpecificFragmentInfo::UnscannedText(
- box UnscannedTextFragmentInfo::new("…".to_owned(), None))));
+ box UnscannedTextFragmentInfo::new(text_overflow_string, 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/inline.rs b/components/layout/inline.rs
index 735ee0acf90..57eb16f1b84 100644
--- a/components/layout/inline.rs
+++ b/components/layout/inline.rs
@@ -31,10 +31,10 @@ use std::collections::VecDeque;
use std::sync::Arc;
use style::arc_ptr_eq;
use style::computed_values::{display, overflow_x, position, text_align, text_justify};
-use style::computed_values::{text_overflow, vertical_align, white_space};
+use style::computed_values::{vertical_align, white_space};
use style::context::{SharedStyleContext, StyleContext};
use style::logical_geometry::{LogicalRect, LogicalSize, WritingMode};
-use style::properties::ServoComputedValues;
+use style::properties::{longhands, ServoComputedValues};
use style::servo::restyle_damage::{BUBBLE_ISIZES, REFLOW, REFLOW_OUT_OF_FLOW, REPOSITION, RESOLVE_GENERATED_CONTENT};
use text;
use unicode_bidi;
@@ -684,21 +684,30 @@ impl LineBreaker {
}
// Determine if an ellipsis will be necessary to account for `text-overflow`.
- let mut need_ellipsis = false;
let available_inline_size = self.pending_line.green_zone.inline -
self.pending_line.bounds.size.inline - indentation;
- match (fragment.style().get_text().text_overflow,
- fragment.style().get_box().overflow_x) {
- (text_overflow::T::clip, _) | (_, overflow_x::T::visible) => {}
- (text_overflow::T::ellipsis, _) => {
- need_ellipsis = fragment.margin_box_inline_size() > available_inline_size;
+
+ let ellipsis = match (&fragment.style().get_text().text_overflow.first,
+ fragment.style().get_box().overflow_x) {
+ (&longhands::text_overflow::Side::Clip, _) | (_, overflow_x::T::visible) => None,
+ (&longhands::text_overflow::Side::Ellipsis, _) => {
+ if fragment.margin_box_inline_size() > available_inline_size {
+ Some("…".to_string())
+ } else {
+ None
+ }
+ },
+ (&longhands::text_overflow::Side::String(ref string), _) => {
+ if fragment.margin_box_inline_size() > available_inline_size {
+ Some(string.to_string())
+ } else {
+ None
+ }
}
- }
+ };
- if !need_ellipsis {
- self.push_fragment_to_line_ignoring_text_overflow(fragment, layout_context);
- } else {
- let ellipsis = fragment.transform_into_ellipsis(layout_context);
+ if let Some(string) = ellipsis {
+ let ellipsis = fragment.transform_into_ellipsis(layout_context, string);
if let Some(truncation_info) =
fragment.truncate_to_inline_size(available_inline_size -
ellipsis.margin_box_inline_size()) {
@@ -707,6 +716,8 @@ impl LineBreaker {
self.push_fragment_to_line_ignoring_text_overflow(fragment, layout_context);
}
self.push_fragment_to_line_ignoring_text_overflow(ellipsis, layout_context);
+ } else {
+ self.push_fragment_to_line_ignoring_text_overflow(fragment, layout_context);
}
if line_flush_mode == LineFlushMode::Flush {
diff --git a/components/style/properties/longhand/text.mako.rs b/components/style/properties/longhand/text.mako.rs
index d10850400fa..2923948ed1c 100644
--- a/components/style/properties/longhand/text.mako.rs
+++ b/components/style/properties/longhand/text.mako.rs
@@ -12,9 +12,6 @@
Method("has_overline", "bool"),
Method("has_line_through", "bool")]) %>
-% if product == "servo":
- ${helpers.single_keyword("text-overflow", "clip ellipsis", animatable=False)}
-% else:
<%helpers:longhand name="text-overflow" animatable="False">
use std::fmt;
use style_traits::ToCss;
@@ -93,7 +90,6 @@
}
}
</%helpers:longhand>
-% endif
${helpers.single_keyword("unicode-bidi",
"normal embed isolate bidi-override isolate-override plaintext",
diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json
index b0b62309839..4752ad4381f 100644
--- a/tests/wpt/mozilla/meta/MANIFEST.json
+++ b/tests/wpt/mozilla/meta/MANIFEST.json
@@ -5496,28 +5496,40 @@
"url": "/_mozilla/css/text_node_opacity.html"
}
],
- "css/text_overflow_a.html": [
+ "css/text_overflow_basic_a.html": [
{
- "path": "css/text_overflow_a.html",
+ "path": "css/text_overflow_basic_a.html",
+ "references": [
+ [
+ "/_mozilla/css/text_overflow_basic_ref.html",
+ "=="
+ ]
+ ],
+ "url": "/_mozilla/css/text_overflow_basic_a.html"
+ }
+ ],
+ "css/text_overflow_ellipsis.html": [
+ {
+ "path": "css/text_overflow_ellipsis.html",
"references": [
[
"/_mozilla/css/text_overflow_ref.html",
"!="
]
],
- "url": "/_mozilla/css/text_overflow_a.html"
+ "url": "/_mozilla/css/text_overflow_ellipsis.html"
}
],
- "css/text_overflow_basic_a.html": [
+ "css/text_overflow_string.html": [
{
- "path": "css/text_overflow_basic_a.html",
+ "path": "css/text_overflow_string.html",
"references": [
[
- "/_mozilla/css/text_overflow_basic_ref.html",
- "=="
+ "/_mozilla/css/text_overflow_ref.html",
+ "!="
]
],
- "url": "/_mozilla/css/text_overflow_basic_a.html"
+ "url": "/_mozilla/css/text_overflow_string.html"
}
],
"css/text_shadow_blur_a.html": [
@@ -20364,28 +20376,40 @@
"url": "/_mozilla/css/text_node_opacity.html"
}
],
- "css/text_overflow_a.html": [
+ "css/text_overflow_basic_a.html": [
{
- "path": "css/text_overflow_a.html",
+ "path": "css/text_overflow_basic_a.html",
+ "references": [
+ [
+ "/_mozilla/css/text_overflow_basic_ref.html",
+ "=="
+ ]
+ ],
+ "url": "/_mozilla/css/text_overflow_basic_a.html"
+ }
+ ],
+ "css/text_overflow_ellipsis.html": [
+ {
+ "path": "css/text_overflow_ellipsis.html",
"references": [
[
"/_mozilla/css/text_overflow_ref.html",
"!="
]
],
- "url": "/_mozilla/css/text_overflow_a.html"
+ "url": "/_mozilla/css/text_overflow_ellipsis.html"
}
],
- "css/text_overflow_basic_a.html": [
+ "css/text_overflow_string.html": [
{
- "path": "css/text_overflow_basic_a.html",
+ "path": "css/text_overflow_string.html",
"references": [
[
- "/_mozilla/css/text_overflow_basic_ref.html",
- "=="
+ "/_mozilla/css/text_overflow_ref.html",
+ "!="
]
],
- "url": "/_mozilla/css/text_overflow_basic_a.html"
+ "url": "/_mozilla/css/text_overflow_string.html"
}
],
"css/text_shadow_blur_a.html": [
diff --git a/tests/wpt/mozilla/tests/css/text_overflow_a.html b/tests/wpt/mozilla/tests/css/text_overflow_ellipsis.html
index 2a3ca5be0f7..70de0992fee 100644
--- a/tests/wpt/mozilla/tests/css/text_overflow_a.html
+++ b/tests/wpt/mozilla/tests/css/text_overflow_ellipsis.html
@@ -8,14 +8,13 @@ p {
background: gold;
text-overflow: ellipsis;
}
-#hideme {
+p.hidden {
overflow: hidden;
}
</style>
</head>
<body>
-<p id=hideme>mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm</p>
<p>mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm</p>
+<p class="hidden">mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm</p>
</body>
</html>
-
diff --git a/tests/wpt/mozilla/tests/css/text_overflow_ref.html b/tests/wpt/mozilla/tests/css/text_overflow_ref.html
index 19adf5d9104..0e19e6e3f07 100644
--- a/tests/wpt/mozilla/tests/css/text_overflow_ref.html
+++ b/tests/wpt/mozilla/tests/css/text_overflow_ref.html
@@ -13,5 +13,3 @@ p {
<p>mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm</p>
</body>
</html>
-
-
diff --git a/tests/wpt/mozilla/tests/css/text_overflow_string.html b/tests/wpt/mozilla/tests/css/text_overflow_string.html
new file mode 100644
index 00000000000..3249b8b224f
--- /dev/null
+++ b/tests/wpt/mozilla/tests/css/text_overflow_string.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link rel=mismatch href=text_overflow_ref.html>
+<style>
+p {
+ width: 128px;
+ background: gold;
+ text-overflow: "[..]";
+}
+p.hidden {
+ overflow: hidden;
+}
+</style>
+</head>
+<body>
+<p>mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm</p>
+<p class="hidden">mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm</p>
+</body>
+</html>