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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutBlock.cpp

Issue 1952613002: Move LayoutDeprecatedFlexibleBox-specific line handling. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Const all the things! Created 4 years, 7 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2007 David Smith (catfish.man@gmail.com) 4 * (C) 2007 David Smith (catfish.man@gmail.com)
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 2176 matching lines...) Expand 10 before | Expand all | Expand 10 after
2187 { 2187 {
2188 if (childrenInline()) 2188 if (childrenInline())
2189 return toLayoutBlockFlow(const_cast<LayoutBlock*>(this)); 2189 return toLayoutBlockFlow(const_cast<LayoutBlock*>(this));
2190 for (LayoutObject* child = firstChild(); child && !child->isFloatingOrOutOfF lowPositioned() && child->isLayoutBlockFlow(); child = toLayoutBlock(child)->fir stChild()) { 2190 for (LayoutObject* child = firstChild(); child && !child->isFloatingOrOutOfF lowPositioned() && child->isLayoutBlockFlow(); child = toLayoutBlock(child)->fir stChild()) {
2191 if (child->childrenInline()) 2191 if (child->childrenInline())
2192 return toLayoutBlockFlow(child); 2192 return toLayoutBlockFlow(child);
2193 } 2193 }
2194 return nullptr; 2194 return nullptr;
2195 } 2195 }
2196 2196
2197 // Helper methods for obtaining the last line, computing line counts and heights for line counts
2198 // (crawling into blocks).
2199 static bool shouldCheckLines(LayoutObject* obj)
2200 {
2201 return !obj->isFloatingOrOutOfFlowPositioned()
2202 && obj->isLayoutBlock() && obj->style()->height().isAuto()
2203 && (!obj->isDeprecatedFlexibleBox() || obj->style()->boxOrient() == VERT ICAL);
2204 }
2205
2206 static int getHeightForLineCount(LayoutBlock* block, int lineCount, bool include Bottom, int& count)
2207 {
2208 if (block->style()->visibility() == VISIBLE) {
2209 if (block->isLayoutBlockFlow() && block->childrenInline()) {
2210 for (RootInlineBox* box = toLayoutBlockFlow(block)->firstRootBox(); box; box = box->nextRootBox()) {
2211 if (++count == lineCount)
2212 return box->lineBottom() + (includeBottom ? (block->borderBo ttom() + block->paddingBottom()) : LayoutUnit());
2213 }
2214 } else {
2215 LayoutBox* normalFlowChildWithoutLines = nullptr;
2216 for (LayoutBox* obj = block->firstChildBox(); obj; obj = obj->nextSi blingBox()) {
2217 if (shouldCheckLines(obj)) {
2218 int result = getHeightForLineCount(toLayoutBlock(obj), lineC ount, false, count);
2219 if (result != -1)
2220 return result + obj->location().y() + (includeBottom ? ( block->borderBottom() + block->paddingBottom()) : LayoutUnit());
2221 } else if (!obj->isFloatingOrOutOfFlowPositioned()) {
2222 normalFlowChildWithoutLines = obj;
2223 }
2224 }
2225 if (normalFlowChildWithoutLines && lineCount == 0)
2226 return normalFlowChildWithoutLines->location().y() + normalFlowC hildWithoutLines->size().height();
2227 }
2228 }
2229
2230 return -1;
2231 }
2232
2233 RootInlineBox* LayoutBlock::lineAtIndex(int i) const
2234 {
2235 ASSERT(i >= 0);
2236
2237 if (style()->visibility() != VISIBLE)
2238 return nullptr;
2239
2240 if (childrenInline()) {
2241 for (RootInlineBox* box = firstRootBox(); box; box = box->nextRootBox()) {
2242 if (!i--)
2243 return box;
2244 }
2245 } else {
2246 for (LayoutObject* child = firstChild(); child; child = child->nextSibli ng()) {
2247 if (!shouldCheckLines(child))
2248 continue;
2249 if (RootInlineBox* box = toLayoutBlock(child)->lineAtIndex(i))
2250 return box;
2251 }
2252 }
2253
2254 return nullptr;
2255 }
2256
2257 int LayoutBlock::lineCount(const RootInlineBox* stopRootInlineBox, bool* found) const
2258 {
2259 int count = 0;
2260
2261 if (style()->visibility() == VISIBLE) {
2262 if (childrenInline()) {
2263 for (RootInlineBox* box = firstRootBox(); box; box = box->nextRootBo x()) {
2264 count++;
2265 if (box == stopRootInlineBox) {
2266 if (found)
2267 *found = true;
2268 break;
2269 }
2270 }
2271 } else {
2272 for (LayoutObject* obj = firstChild(); obj; obj = obj->nextSibling() ) {
2273 if (shouldCheckLines(obj)) {
2274 bool recursiveFound = false;
2275 count += toLayoutBlock(obj)->lineCount(stopRootInlineBox, &r ecursiveFound);
2276 if (recursiveFound) {
2277 if (found)
2278 *found = true;
2279 break;
2280 }
2281 }
2282 }
2283 }
2284 }
2285 return count;
2286 }
2287
2288 int LayoutBlock::heightForLineCount(int lineCount)
2289 {
2290 int count = 0;
2291 return getHeightForLineCount(this, lineCount, true, count);
2292 }
2293
2294 void LayoutBlock::clearTruncation()
2295 {
2296 if (style()->visibility() == VISIBLE) {
2297 if (childrenInline() && hasMarkupTruncation()) {
2298 setHasMarkupTruncation(false);
2299 for (RootInlineBox* box = firstRootBox(); box; box = box->nextRootBo x())
2300 box->clearTruncation();
2301 } else {
2302 for (LayoutObject* obj = firstChild(); obj; obj = obj->nextSibling() ) {
2303 if (shouldCheckLines(obj))
2304 toLayoutBlock(obj)->clearTruncation();
2305 }
2306 }
2307 }
2308 }
2309
2310 void LayoutBlock::absoluteRects(Vector<IntRect>& rects, const LayoutPoint& accum ulatedOffset) const 2197 void LayoutBlock::absoluteRects(Vector<IntRect>& rects, const LayoutPoint& accum ulatedOffset) const
2311 { 2198 {
2312 // For blocks inside inlines, we go ahead and include margins so that we run right up to the 2199 // For blocks inside inlines, we go ahead and include margins so that we run right up to the
2313 // inline boxes above and below us (thus getting merged with them to form a single irregular 2200 // inline boxes above and below us (thus getting merged with them to form a single irregular
2314 // shape). 2201 // shape).
2315 if (isAnonymousBlockContinuation()) { 2202 if (isAnonymousBlockContinuation()) {
2316 // FIXME: This is wrong for vertical writing-modes. 2203 // FIXME: This is wrong for vertical writing-modes.
2317 // https://bugs.webkit.org/show_bug.cgi?id=46781 2204 // https://bugs.webkit.org/show_bug.cgi?id=46781
2318 LayoutRect rect(accumulatedOffset, size()); 2205 LayoutRect rect(accumulatedOffset, size());
2319 rect.expand(collapsedMarginBoxLogicalOutsets()); 2206 rect.expand(collapsedMarginBoxLogicalOutsets());
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after
2759 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout Object* obj) const 2646 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout Object* obj) const
2760 { 2647 {
2761 showLayoutObject(); 2648 showLayoutObject();
2762 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box()) 2649 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box())
2763 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1); 2650 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1);
2764 } 2651 }
2765 2652
2766 #endif 2653 #endif
2767 2654
2768 } // namespace blink 2655 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutBlock.h ('k') | third_party/WebKit/Source/core/layout/LayoutBlockFlow.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698