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

Side by Side Diff: Source/core/rendering/RenderBlock.cpp

Issue 440233002: [CSS Grid Layout] Ignore ::first-letter pseudo-element (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Patch for landing Created 6 years, 4 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
« no previous file with comments | « LayoutTests/fast/css-grid-layout/grid-item-first-letter-valid-expected.txt ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 3909 matching lines...) Expand 10 before | Expand all | Expand 10 after
3920 const FontMetrics& fontMetrics = firstLineStyle()->fontMetrics(); 3920 const FontMetrics& fontMetrics = firstLineStyle()->fontMetrics();
3921 return fontMetrics.ascent() 3921 return fontMetrics.ascent()
3922 + (lineHeight(true, lineDirection, PositionOfInteriorLineBoxes) - fontMetrics.height()) / 2 3922 + (lineHeight(true, lineDirection, PositionOfInteriorLineBoxes) - fontMetrics.height()) / 2
3923 + (lineDirection == HorizontalLine ? borderTop() + paddingTop() : borderRight() + paddingRight()); 3923 + (lineDirection == HorizontalLine ? borderTop() + paddingTop() : borderRight() + paddingRight());
3924 } 3924 }
3925 } 3925 }
3926 3926
3927 return -1; 3927 return -1;
3928 } 3928 }
3929 3929
3930 static inline bool isRenderBlockFlowOrRenderButton(RenderObject* renderObject)
3931 {
3932 // We include isRenderButton in this check because buttons are implemented
3933 // using flex box but should still support first-line|first-letter.
3934 // The flex box and grid specs requires that flex box and grid do not
3935 // support first-line|first-letter, though.
3936 // FIXME: Remove when buttons are implemented with align-items instead
3937 // of flexbox.
3938 return renderObject->isRenderBlockFlow() || renderObject->isRenderButton();
3939 }
3940
3930 RenderBlock* RenderBlock::firstLineBlock() const 3941 RenderBlock* RenderBlock::firstLineBlock() const
3931 { 3942 {
3932 RenderBlock* firstLineBlock = const_cast<RenderBlock*>(this); 3943 RenderBlock* firstLineBlock = const_cast<RenderBlock*>(this);
3933 bool hasPseudo = false; 3944 bool hasPseudo = false;
3934 while (true) { 3945 while (true) {
3935 hasPseudo = firstLineBlock->style()->hasPseudoStyle(FIRST_LINE); 3946 hasPseudo = firstLineBlock->style()->hasPseudoStyle(FIRST_LINE);
3936 if (hasPseudo) 3947 if (hasPseudo)
3937 break; 3948 break;
3938 RenderObject* parentBlock = firstLineBlock->parent(); 3949 RenderObject* parentBlock = firstLineBlock->parent();
3939 // We include isRenderButton in this check because buttons are
3940 // implemented using flex box but should still support first-line. The
3941 // flex box spec requires that flex box does not support first-line,
3942 // though.
3943 // FIXME: Remove when buttons are implemented with align-items instead
3944 // of flexbox.
3945 if (firstLineBlock->isReplaced() || firstLineBlock->isFloating() 3950 if (firstLineBlock->isReplaced() || firstLineBlock->isFloating()
3946 || !parentBlock 3951 || !parentBlock
3947 || (!parentBlock->isRenderBlockFlow() && !parentBlock->isRenderButto n())) 3952 || !isRenderBlockFlowOrRenderButton(parentBlock))
3948 break; 3953 break;
3949 ASSERT_WITH_SECURITY_IMPLICATION(parentBlock->isRenderBlock()); 3954 ASSERT_WITH_SECURITY_IMPLICATION(parentBlock->isRenderBlock());
3950 if (toRenderBlock(parentBlock)->firstChild() != firstLineBlock) 3955 if (toRenderBlock(parentBlock)->firstChild() != firstLineBlock)
3951 break; 3956 break;
3952 firstLineBlock = toRenderBlock(parentBlock); 3957 firstLineBlock = toRenderBlock(parentBlock);
3953 } 3958 }
3954 3959
3955 if (!hasPseudo) 3960 if (!hasPseudo)
3956 return 0; 3961 return 0;
3957 3962
(...skipping 25 matching lines...) Expand all
3983 3988
3984 static inline bool isSpaceForFirstLetter(UChar c) 3989 static inline bool isSpaceForFirstLetter(UChar c)
3985 { 3990 {
3986 return isSpaceOrNewline(c) || c == noBreakSpace; 3991 return isSpaceOrNewline(c) || c == noBreakSpace;
3987 } 3992 }
3988 3993
3989 static inline RenderObject* findFirstLetterBlock(RenderBlock* start) 3994 static inline RenderObject* findFirstLetterBlock(RenderBlock* start)
3990 { 3995 {
3991 RenderObject* firstLetterBlock = start; 3996 RenderObject* firstLetterBlock = start;
3992 while (true) { 3997 while (true) {
3993 // We include isRenderButton in these two checks because buttons are
3994 // implemented using flex box but should still support first-letter.
3995 // The flex box spec requires that flex box does not support
3996 // first-letter, though.
3997 // FIXME: Remove when buttons are implemented with align-items instead
3998 // of flexbox.
3999 bool canHaveFirstLetterRenderer = firstLetterBlock->style()->hasPseudoSt yle(FIRST_LETTER) 3998 bool canHaveFirstLetterRenderer = firstLetterBlock->style()->hasPseudoSt yle(FIRST_LETTER)
4000 && firstLetterBlock->canHaveGeneratedChildren() 3999 && firstLetterBlock->canHaveGeneratedChildren()
4001 && (!firstLetterBlock->isFlexibleBox() || firstLetterBlock->isRender Button()); 4000 && isRenderBlockFlowOrRenderButton(firstLetterBlock);
4002 if (canHaveFirstLetterRenderer) 4001 if (canHaveFirstLetterRenderer)
4003 return firstLetterBlock; 4002 return firstLetterBlock;
4004 4003
4005 RenderObject* parentBlock = firstLetterBlock->parent(); 4004 RenderObject* parentBlock = firstLetterBlock->parent();
4006 if (firstLetterBlock->isReplaced() || !parentBlock 4005 if (firstLetterBlock->isReplaced() || !parentBlock
4007 || (!parentBlock->isRenderBlockFlow() && !parentBlock->isRenderButto n())) { 4006 || !isRenderBlockFlowOrRenderButton(parentBlock)) {
4008 return 0; 4007 return 0;
4009 } 4008 }
4010 ASSERT(parentBlock->isRenderBlock()); 4009 ASSERT(parentBlock->isRenderBlock());
4011 if (toRenderBlock(parentBlock)->firstChild() != firstLetterBlock) 4010 if (toRenderBlock(parentBlock)->firstChild() != firstLetterBlock)
4012 return 0; 4011 return 0;
4013 firstLetterBlock = parentBlock; 4012 firstLetterBlock = parentBlock;
4014 } 4013 }
4015 4014
4016 return 0; 4015 return 0;
4017 } 4016 }
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
4169 break; 4168 break;
4170 currChild = currChild->nextSibling(); 4169 currChild = currChild->nextSibling();
4171 } else if (currChild->isListMarker()) { 4170 } else if (currChild->isListMarker()) {
4172 currChild = currChild->nextSibling(); 4171 currChild = currChild->nextSibling();
4173 } else if (currChild->isFloatingOrOutOfFlowPositioned()) { 4172 } else if (currChild->isFloatingOrOutOfFlowPositioned()) {
4174 if (currChild->style()->styleType() == FIRST_LETTER) { 4173 if (currChild->style()->styleType() == FIRST_LETTER) {
4175 currChild = currChild->slowFirstChild(); 4174 currChild = currChild->slowFirstChild();
4176 break; 4175 break;
4177 } 4176 }
4178 currChild = currChild->nextSibling(); 4177 currChild = currChild->nextSibling();
4179 } else if (currChild->isReplaced() || currChild->isRenderButton() || cur rChild->isMenuList()) { 4178 } else if (currChild->isReplaced() || currChild->isRenderButton() || cur rChild->isMenuList() || !isRenderBlockFlowOrRenderButton(firstLetterBlock)) {
cbiesinger 2014/08/08 03:28:12 I'm confused, why do we want a break here if the f
Manuel Rego 2014/08/08 12:55:27 Yeah, I agree that it's confusing to add this in t
4180 break; 4179 break;
4181 } else if (currChild->style()->hasPseudoStyle(FIRST_LETTER) && currChild ->canHaveGeneratedChildren()) { 4180 } else if (currChild->style()->hasPseudoStyle(FIRST_LETTER) && currChild ->canHaveGeneratedChildren()) {
4182 // We found a lower-level node with first-letter, which supersedes t he higher-level style 4181 // We found a lower-level node with first-letter, which supersedes t he higher-level style
4183 firstLetterBlock = currChild; 4182 firstLetterBlock = currChild;
4184 currChild = currChild->slowFirstChild(); 4183 currChild = currChild->slowFirstChild();
4185 } else { 4184 } else {
4186 currChild = currChild->slowFirstChild(); 4185 currChild = currChild->slowFirstChild();
4187 } 4186 }
4188 } 4187 }
4189 4188
(...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after
4835 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render Object* obj) const 4834 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render Object* obj) const
4836 { 4835 {
4837 showRenderObject(); 4836 showRenderObject();
4838 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box()) 4837 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box())
4839 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1); 4838 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1);
4840 } 4839 }
4841 4840
4842 #endif 4841 #endif
4843 4842
4844 } // namespace blink 4843 } // namespace blink
OLDNEW
« no previous file with comments | « LayoutTests/fast/css-grid-layout/grid-item-first-letter-valid-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698