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

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

Issue 1473363003: Invalidate first line display item clients when first line style changes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Some modifications were not saved to README.md in the previous patch Created 5 years 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 2274 matching lines...) Expand 10 before | Expand all | Expand 10 after
2285 } 2285 }
2286 if (!haveNormalFlowChild && hasLineIfEmpty()) { 2286 if (!haveNormalFlowChild && hasLineIfEmpty()) {
2287 const FontMetrics& fontMetrics = firstLineStyle()->fontMetrics(); 2287 const FontMetrics& fontMetrics = firstLineStyle()->fontMetrics();
2288 return fontMetrics.ascent() 2288 return fontMetrics.ascent()
2289 + (lineHeight(true, lineDirection, PositionOfInteriorLineBoxes) - fo ntMetrics.height()) / 2 2289 + (lineHeight(true, lineDirection, PositionOfInteriorLineBoxes) - fo ntMetrics.height()) / 2
2290 + (lineDirection == HorizontalLine ? borderTop() + paddingTop() : bo rderRight() + paddingRight()); 2290 + (lineDirection == HorizontalLine ? borderTop() + paddingTop() : bo rderRight() + paddingRight());
2291 } 2291 }
2292 return -1; 2292 return -1;
2293 } 2293 }
2294 2294
2295 static inline bool isLayoutBlockFlowOrLayoutButton(LayoutObject* layoutObject) 2295 LayoutBlock* LayoutBlock::enclosingFirstLineStyleBlock() const
2296 {
2297 // We include isLayoutButton in this check because buttons are implemented
2298 // using flex box but should still support first-line|first-letter.
2299 // The flex box and grid specs require that flex box and grid do not
2300 // support first-line|first-letter, though.
2301 // FIXME: Remove when buttons are implemented with align-items instead
2302 // of flex box.
2303 return layoutObject->isLayoutBlockFlow() || layoutObject->isLayoutButton();
2304 }
2305
2306 LayoutBlock* LayoutBlock::firstLineBlock() const
2307 { 2296 {
2308 LayoutBlock* firstLineBlock = const_cast<LayoutBlock*>(this); 2297 LayoutBlock* firstLineBlock = const_cast<LayoutBlock*>(this);
2309 bool hasPseudo = false; 2298 bool hasPseudo = false;
2310 while (true) { 2299 while (true) {
2311 hasPseudo = firstLineBlock->style()->hasPseudoStyle(FIRST_LINE); 2300 hasPseudo = firstLineBlock->style()->hasPseudoStyle(FIRST_LINE);
2312 if (hasPseudo) 2301 if (hasPseudo)
2313 break; 2302 break;
2314 LayoutObject* parentBlock = firstLineBlock->parent(); 2303 LayoutObject* parentBlock = firstLineBlock->parent();
2315 if (firstLineBlock->isReplaced() || firstLineBlock->isFloatingOrOutOfFlo wPositioned() 2304 if (firstLineBlock->isReplaced() || firstLineBlock->isFloatingOrOutOfFlo wPositioned()
2316 || !parentBlock 2305 || !parentBlock
2317 || !isLayoutBlockFlowOrLayoutButton(parentBlock)) 2306 || !parentBlock->canHaveFirstLineOrFirstLetterStyle())
2318 break; 2307 break;
2319 ASSERT_WITH_SECURITY_IMPLICATION(parentBlock->isLayoutBlock()); 2308 ASSERT_WITH_SECURITY_IMPLICATION(parentBlock->isLayoutBlock());
2320 if (toLayoutBlock(parentBlock)->firstChild() != firstLineBlock) 2309 if (toLayoutBlock(parentBlock)->firstChild() != firstLineBlock)
2321 break; 2310 break;
2322 firstLineBlock = toLayoutBlock(parentBlock); 2311 firstLineBlock = toLayoutBlock(parentBlock);
2323 } 2312 }
2324 2313
2325 if (!hasPseudo) 2314 if (!hasPseudo)
2326 return nullptr; 2315 return nullptr;
2327 2316
2328 return firstLineBlock; 2317 return firstLineBlock;
2329 } 2318 }
2330 2319
2320 LayoutBlockFlow* LayoutBlock::nearestInnerBlockWithFirstLine() const
2321 {
2322 if (childrenInline())
2323 return toLayoutBlockFlow(const_cast<LayoutBlock*>(this));
2324 for (LayoutObject* child = firstChild(); child && !child->isFloatingOrOutOfF lowPositioned() && child->isLayoutBlockFlow(); child = toLayoutBlock(child)->fir stChild()) {
2325 if (child->childrenInline())
2326 return toLayoutBlockFlow(child);
2327 }
2328 return nullptr;
2329 }
2330
2331 // Helper methods for obtaining the last line, computing line counts and heights for line counts 2331 // Helper methods for obtaining the last line, computing line counts and heights for line counts
2332 // (crawling into blocks). 2332 // (crawling into blocks).
2333 static bool shouldCheckLines(LayoutObject* obj) 2333 static bool shouldCheckLines(LayoutObject* obj)
2334 { 2334 {
2335 return !obj->isFloatingOrOutOfFlowPositioned() 2335 return !obj->isFloatingOrOutOfFlowPositioned()
2336 && obj->isLayoutBlock() && obj->style()->height().isAuto() 2336 && obj->isLayoutBlock() && obj->style()->height().isAuto()
2337 && (!obj->isDeprecatedFlexibleBox() || obj->style()->boxOrient() == VERT ICAL); 2337 && (!obj->isDeprecatedFlexibleBox() || obj->style()->boxOrient() == VERT ICAL);
2338 } 2338 }
2339 2339
2340 static int getHeightForLineCount(LayoutBlock* block, int lineCount, bool include Bottom, int& count) 2340 static int getHeightForLineCount(LayoutBlock* block, int lineCount, bool include Bottom, int& count)
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after
2908 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout Object* obj) const 2908 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout Object* obj) const
2909 { 2909 {
2910 showLayoutObject(); 2910 showLayoutObject();
2911 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box()) 2911 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box())
2912 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1); 2912 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1);
2913 } 2913 }
2914 2914
2915 #endif 2915 #endif
2916 2916
2917 } // namespace blink 2917 } // 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