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

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

Issue 14113040: Update the first letter when the first line is changed by adding a new text at its start. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@first-letter-rendering-issue
Patch Set: Updated patch Created 7 years, 3 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 | « no previous file | 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 11 matching lines...) Expand all
22 */ 22 */
23 23
24 #include "config.h" 24 #include "config.h"
25 #include "core/rendering/RenderBlock.h" 25 #include "core/rendering/RenderBlock.h"
26 26
27 #include "HTMLNames.h" 27 #include "HTMLNames.h"
28 #include "core/accessibility/AXObjectCache.h" 28 #include "core/accessibility/AXObjectCache.h"
29 #include "core/dom/Document.h" 29 #include "core/dom/Document.h"
30 #include "core/dom/Element.h" 30 #include "core/dom/Element.h"
31 #include "core/dom/OverflowEvent.h" 31 #include "core/dom/OverflowEvent.h"
32 #include "core/dom/Text.h"
32 #include "core/dom/shadow/ShadowRoot.h" 33 #include "core/dom/shadow/ShadowRoot.h"
33 #include "core/editing/Editor.h" 34 #include "core/editing/Editor.h"
34 #include "core/editing/FrameSelection.h" 35 #include "core/editing/FrameSelection.h"
35 #include "core/page/Frame.h" 36 #include "core/page/Frame.h"
36 #include "core/page/FrameView.h" 37 #include "core/page/FrameView.h"
37 #include "core/page/Page.h" 38 #include "core/page/Page.h"
38 #include "core/page/Settings.h" 39 #include "core/page/Settings.h"
39 #include "core/platform/graphics/FloatQuad.h" 40 #include "core/platform/graphics/FloatQuad.h"
40 #include "core/platform/graphics/GraphicsContextStateSaver.h" 41 #include "core/platform/graphics/GraphicsContextStateSaver.h"
41 #include "core/platform/graphics/transforms/TransformState.h" 42 #include "core/platform/graphics/transforms/TransformState.h"
(...skipping 6675 matching lines...) Expand 10 before | Expand all | Expand 10 after
6717 } 6718 }
6718 6719
6719 void RenderBlock::updateFirstLetter() 6720 void RenderBlock::updateFirstLetter()
6720 { 6721 {
6721 if (!document().styleSheetCollections()->usesFirstLetterRules()) 6722 if (!document().styleSheetCollections()->usesFirstLetterRules())
6722 return; 6723 return;
6723 // Don't recur 6724 // Don't recur
6724 if (style()->styleType() == FIRST_LETTER) 6725 if (style()->styleType() == FIRST_LETTER)
6725 return; 6726 return;
6726 6727
6727 // FIXME: We need to destroy the first-letter object if it is no longer the first child. Need to find
6728 // an efficient way to check for that situation though before implementing a nything.
6729 RenderObject* firstLetterBlock = findFirstLetterBlock(this); 6728 RenderObject* firstLetterBlock = findFirstLetterBlock(this);
6730 if (!firstLetterBlock) 6729 if (!firstLetterBlock)
6731 return; 6730 return;
6732 6731
6733 // Drill into inlines looking for our first text child. 6732 // Drill into inlines looking for our first text child.
6734 RenderObject* currChild = firstLetterBlock->firstChild(); 6733 RenderObject* currChild = firstLetterBlock->firstChild();
6735 while (currChild) { 6734 while (currChild) {
6736 if (currChild->isText()) 6735 if (currChild->isText())
6737 break; 6736 break;
6738 if (currChild->isListMarker()) 6737 if (currChild->isListMarker())
(...skipping 10 matching lines...) Expand all
6749 // We found a lower-level node with first-letter, which supersedes t he higher-level style 6748 // We found a lower-level node with first-letter, which supersedes t he higher-level style
6750 firstLetterBlock = currChild; 6749 firstLetterBlock = currChild;
6751 currChild = currChild->firstChild(); 6750 currChild = currChild->firstChild();
6752 } else 6751 } else
6753 currChild = currChild->firstChild(); 6752 currChild = currChild->firstChild();
6754 } 6753 }
6755 6754
6756 if (!currChild) 6755 if (!currChild)
6757 return; 6756 return;
6758 6757
6759 // If the child already has style, then it has already been created, so we j ust want
6760 // to update it.
6761 if (currChild->parent()->style()->styleType() == FIRST_LETTER) { 6758 if (currChild->parent()->style()->styleType() == FIRST_LETTER) {
6759 // Destroy the first-letter object if it is no longer the first child.
6760 RenderObject* remainingText = currChild->parent()->nextSibling();
esprehn 2013/09/09 21:22:57 How do you know the currentCuild->parent() has a n
joone 2013/09/09 22:36:25 The currentChild is the firstLetter(RenderTextFrag
6761 if (currChild->node() != remainingText->node()) {
6762 LayoutStateDisabler layoutStateDisabler(view());
6763
6764 RenderObject* oldRemainingText = toRenderBoxModelObject(currChild->p arent())->firstLetterRemainingText();
6765 if (oldRemainingText)
6766 toRenderText(oldRemainingText)->setText(toText(oldRemainingText- >node())->data().impl());
6767
6768 createFirstLetterRenderer(firstLetterBlock, remainingText);
esprehn 2013/09/09 21:22:57 What destroyed the original RenderTextFragment tha
joone 2013/09/09 22:36:25 When setting a new text to RenderTextFragment(Rema
6769 return;
6770 }
6771
6772 // If the child already has style, then it has already been created, so we just want
6773 // to update it.
6762 updateFirstLetterStyle(firstLetterBlock, currChild); 6774 updateFirstLetterStyle(firstLetterBlock, currChild);
6763 return; 6775 return;
6764 } 6776 }
6765 6777
6766 if (!currChild->isText() || currChild->isBR()) 6778 if (!currChild->isText() || currChild->isBR())
6767 return; 6779 return;
6768 6780
6769 // Our layout state is not valid for the repaints we are going to trigger by 6781 // Our layout state is not valid for the repaints we are going to trigger by
6770 // adding and removing children of firstLetterContainer. 6782 // adding and removing children of firstLetterContainer.
6771 LayoutStateDisabler layoutStateDisabler(view()); 6783 LayoutStateDisabler layoutStateDisabler(view());
(...skipping 1262 matching lines...) Expand 10 before | Expand all | Expand 10 after
8034 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render Object* obj) const 8046 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render Object* obj) const
8035 { 8047 {
8036 showRenderObject(); 8048 showRenderObject();
8037 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box()) 8049 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box())
8038 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1); 8050 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1);
8039 } 8051 }
8040 8052
8041 #endif 8053 #endif
8042 8054
8043 } // namespace WebCore 8055 } // namespace WebCore
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698