Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(117)

Unified Diff: third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp

Issue 2699393002: Place ellipsis correctly inside inline-blocks (Closed)
Patch Set: bug 133700 Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
index ab7e8b01ebab2e21126cbee1ec5a99d4c9e871d7..5385c343d13ac23fc7f2ef6505ef25235f910390 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
@@ -2422,10 +2422,11 @@ void LayoutBlockFlow::checkLinesForTextOverflow() {
LayoutUnit blockEdge = ltr ? blockRightEdge : blockLeftEdge;
if (curr->lineCanAccommodateEllipsis(ltr, blockEdge, lineBoxEdge,
width)) {
- LayoutUnit totalLogicalWidth = curr->placeEllipsis(
- selectedEllipsisStr, ltr, blockLeftEdge, blockRightEdge, width);
+ LayoutUnit totalLogicalWidth =
+ curr->placeEllipsis(selectedEllipsisStr, ltr, blockLeftEdge,
+ blockRightEdge, width, LayoutUnit(), false);
LayoutUnit logicalLeft; // We are only interested in the delta from the
- // base position.
+ // base position.
LayoutUnit availableLogicalWidth = blockRightEdge - blockLeftEdge;
updateLogicalWidthForAlignment(textAlign, curr, 0, logicalLeft,
totalLogicalWidth, availableLogicalWidth,
@@ -2435,12 +2436,84 @@ void LayoutBlockFlow::checkLinesForTextOverflow() {
else
curr->moveInInlineDirection(
logicalLeft - (availableLogicalWidth - totalLogicalWidth));
+ } else {
+ tryPlacingEllipsisOnAtomicInlines(curr, blockRightEdge, blockLeftEdge,
+ width, selectedEllipsisStr);
}
}
indentText = DoNotIndentText;
}
}
+void LayoutBlockFlow::tryPlacingEllipsisOnAtomicInlines(
+ RootInlineBox* root,
+ LayoutUnit blockRightEdge,
+ LayoutUnit blockLeftEdge,
+ LayoutUnit ellipsisWidth,
+ const AtomicString& selectedEllipsisStr) {
+ bool ltr = style()->isLeftToRightDirection();
+ LayoutUnit logicalLeftOffset = blockLeftEdge;
+
+ // Each atomic inline block (e.g. a <span>) inside a blockflow is managed by
+ // an
+ // InlineBox that allows us to access the lineboxes that live inside the
+ // atomic
+ // inline block.
+ bool foundBox = false;
+ for (InlineBox* box = ltr ? root->firstChild() : root->lastChild(); box;
+ box = ltr ? box->nextOnLine() : box->prevOnLine()) {
+ if (!box->getLineLayoutItem().isAtomicInlineLevel() ||
+ !box->getLineLayoutItem().isLayoutBlockFlow())
+ continue;
+
+ RootInlineBox* firstRootBox =
+ LineLayoutBlockFlow(box->getLineLayoutItem()).firstRootBox();
+ if (!firstRootBox)
+ continue;
+
+ bool placedEllipsis = false;
+ // Move the right edge of the block in so that we can test it against the
+ // width of the root line boxes. We don't resize or move the linebox to
+ // respect text-align because it is the final one of a sequence on the line.
+ if (ltr) {
+ for (RootInlineBox* curr = firstRootBox; curr;
+ curr = curr->nextRootBox()) {
+ LayoutUnit currLogicalLeft = logicalLeftOffset + curr->logicalLeft();
+ LayoutUnit ellipsisEdge =
+ currLogicalLeft + curr->logicalWidth() + ellipsisWidth;
+ if (ellipsisEdge <= blockRightEdge)
+ continue;
+ curr->placeEllipsis(selectedEllipsisStr, ltr, blockLeftEdge,
+ blockRightEdge, ellipsisWidth, logicalLeftOffset,
+ foundBox);
+ placedEllipsis = true;
+ }
+ } else {
+ LayoutUnit maxRootBoxWidth;
+ for (RootInlineBox* curr = firstRootBox; curr;
+ curr = curr->nextRootBox()) {
+ LayoutUnit ellipsisEdge =
+ box->logicalLeft() + curr->logicalLeft() - ellipsisWidth;
+ if (ellipsisEdge >= blockLeftEdge)
+ continue;
+ // Root boxes can vary in width so move our offset out to allow
+ // comparison with the right hand edge of the block.
+ LayoutUnit logicalLeftOffset = box->logicalLeft();
+ maxRootBoxWidth =
+ std::max<LayoutUnit>(curr->logicalWidth(), maxRootBoxWidth);
+ if (logicalLeftOffset < 0)
+ logicalLeftOffset += maxRootBoxWidth - curr->logicalWidth();
+ curr->placeEllipsis(selectedEllipsisStr, ltr, blockLeftEdge,
+ blockRightEdge, ellipsisWidth,
+ LayoutUnit(logicalLeftOffset.ceil()), foundBox);
+ placedEllipsis = true;
+ }
+ }
+ foundBox |= placedEllipsis;
+ logicalLeftOffset += box->logicalWidth();
+ }
+}
+
void LayoutBlockFlow::markLinesDirtyInBlockRange(LayoutUnit logicalTop,
LayoutUnit logicalBottom,
RootInlineBox* highest) {

Powered by Google App Engine
This is Rietveld 408576698