Changeset 138909 in webkit
- Timestamp:
- Jan 5, 2013 3:07:05 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r138908 r138909 1 2013-01-05 Elliott Sprehn <esprehn@chromium.org> 2 3 Remove RenderObjectChildList::beforePseudoElementRenderer and afterPseudoElementRenderer 4 https://bugs.webkit.org/show_bug.cgi?id=106132 5 6 Reviewed by Abhishek Arya. 7 8 We no longer need the complicated traversals in beforePseudoElementRenderer 9 and afterPseudoElementRenderer since we can get the renderers of pseudo 10 elements through the node. This removes all that code and swaps it for 11 Element::pseudoElementRenderer. 12 13 This is possible now that r138850 removed all the now incorrect manual 14 management of pseudo element renderers from the render tree that was 15 left over from before the switch to DOM based pseudo elements. 16 17 No new tests, just refactoring. 18 19 * css/CSSComputedStyleDeclaration.cpp: 20 (WebCore::CSSComputedStyleDeclaration::getPropertyCSSValue): 21 * dom/Element.cpp: 22 (WebCore::Element::pseudoElementRenderer): 23 Added, gets the renderer of the pseudo element by PseudoId if it 24 exists. 25 * dom/Element.h: 26 (Element): 27 * dom/NodeRenderingTraversal.cpp: 28 (WebCore::NodeRenderingTraversal::nextSiblingSlow): 29 (WebCore::NodeRenderingTraversal::previousSiblingSlow): 30 * rendering/RenderCounter.cpp: 31 (WebCore::previousInPreOrder): 32 (WebCore::previousSiblingOrParent): 33 (WebCore::nextInPreOrder): 34 * rendering/RenderObject.h: 35 (WebCore::RenderObject::lastChild): 36 * rendering/RenderObjectChildList.cpp: 37 * rendering/RenderObjectChildList.h: 38 (RenderObjectChildList): 39 * rendering/RenderTreeAsText.cpp: 40 (WebCore::counterValueForElement): 41 1 42 2013-01-05 Robert Hogan <robert@webkit.org> 2 43 -
trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp
r138728 r138909 1516 1516 return 0; 1517 1517 1518 if (renderer) { 1519 if (m_pseudoElementSpecifier == AFTER) 1520 renderer = renderer->afterPseudoElementRenderer(); 1521 else if (m_pseudoElementSpecifier == BEFORE) 1522 renderer = renderer->beforePseudoElementRenderer(); 1523 } 1518 if (node->isElementNode() && (m_pseudoElementSpecifier == BEFORE || m_pseudoElementSpecifier == AFTER)) 1519 renderer = toElement(node)->pseudoElementRenderer(m_pseudoElementSpecifier); 1524 1520 1525 1521 propertyID = CSSProperty::resolveDirectionAwareProperty(propertyID, style->direction(), style->writingMode()); -
trunk/Source/WebCore/dom/Element.cpp
r138823 r138909 2172 2172 } 2173 2173 2174 RenderObject* Element::pseudoElementRenderer(PseudoId pseudoId) const 2175 { 2176 if (PseudoElement* element = pseudoElement(pseudoId)) 2177 return element->renderer(); 2178 return 0; 2179 } 2174 2180 2175 2181 // ElementTraversal API -
trunk/Source/WebCore/dom/Element.h
r138897 r138909 369 369 bool hasPseudoElements() const; 370 370 PseudoElement* pseudoElement(PseudoId) const; 371 PseudoElement* beforePseudoElement() const { return pseudoElement(BEFORE); } 372 PseudoElement* afterPseudoElement() const { return pseudoElement(AFTER); } 371 RenderObject* pseudoElementRenderer(PseudoId) const; 373 372 bool childNeedsShadowWalker() const; 374 373 void didShadowTreeAwareChildrenChange(); -
trunk/Source/WebCore/dom/NodeRenderingTraversal.cpp
r137715 r138909 69 69 Node* parent = walker.traverseParent(node); 70 70 if (parent && parent->isElementNode()) 71 return toElement(parent)-> afterPseudoElement();71 return toElement(parent)->pseudoElement(AFTER); 72 72 73 73 return 0; … … 88 88 Node* parent = walker.traverseParent(node); 89 89 if (parent && parent->isElementNode()) 90 return toElement(parent)-> beforePseudoElement();90 return toElement(parent)->pseudoElement(BEFORE); 91 91 92 92 return 0; -
trunk/Source/WebCore/rendering/RenderCounter.cpp
r137406 r138909 54 54 } 55 55 56 static RenderObject* rendererOfAfterPseudoElement(RenderObject* renderer)57 {58 RenderObject* lastContinuation = renderer;59 while (RenderObject* continuation = lastContinuation->virtualContinuation())60 lastContinuation = continuation;61 return lastContinuation->afterPseudoElementRenderer();62 }63 64 56 // This function processes the renderer tree in the order of the DOM tree 65 57 // including pseudo elements as defined in CSS 2.1. 66 // Anonymous renderers are skipped except for those representing pseudo elements.67 58 static RenderObject* previousInPreOrder(const RenderObject* object) 68 59 { … … 88 79 while (sibling) { 89 80 if (RenderObject* renderer = sibling->renderer()) { 90 if (RenderObject* after = rendererOfAfterPseudoElement(renderer))81 if (RenderObject* after = sibling->pseudoElementRenderer(AFTER)) 91 82 return after; 92 83 parent = sibling; 93 84 sibling = sibling->lastElementChild(); 94 85 if (!sibling) { 95 if (RenderObject* before = renderer->beforePseudoElementRenderer())86 if (RenderObject* before = toElement(renderer->node())->pseudoElementRenderer(BEFORE)) 96 87 return before; 97 88 return renderer; … … 102 93 if (!parent) 103 94 return 0; 104 RenderObject* renderer = parent->renderer(); // Should never be null 105 if (RenderObject* before = renderer->beforePseudoElementRenderer()) 95 if (RenderObject* before = parent->pseudoElementRenderer(BEFORE)) 106 96 return before; 107 return renderer;97 return parent->renderer(); 108 98 } 109 99 110 100 // This function processes the renderer tree in the order of the DOM tree 111 101 // including pseudo elements as defined in CSS 2.1. 112 // Anonymous renderers are skipped except for those representing pseudo elements.113 102 static RenderObject* previousSiblingOrParent(const RenderObject* object) 114 103 { … … 137 126 sibling = sibling->previousElementSibling(); 138 127 } 139 if (parent) { 140 RenderObject* renderer = parent->renderer(); 141 if (RenderObject* before = renderer->virtualChildren()->beforePseudoElementRenderer(renderer)) 142 return before; 143 return renderer; 144 } 145 return 0; 128 if (!parent) 129 return 0; 130 if (RenderObject* before = parent->pseudoElementRenderer(BEFORE)) 131 return before; 132 return parent->renderer(); 146 133 } 147 134 … … 168 155 // This function processes the renderer tree in the order of the DOM tree 169 156 // including pseudo elements as defined in CSS 2.1. 170 // Anonymous renderers are skipped except for those representing pseudo elements.171 157 static RenderObject* nextInPreOrder(const RenderObject* object, const Element* stayWithin, bool skipDescendants = false) 172 158 { 173 159 Element* self; 174 160 Element* child; 175 RenderObject* result;176 161 self = toElement(object->generatingNode()); 177 162 if (skipDescendants) … … 180 165 case NOPSEUDO: 181 166 ASSERT(!object->isAnonymous()); 182 result = object->beforePseudoElementRenderer(); 183 if (result) 184 return result; 167 if (RenderObject* before = self->pseudoElementRenderer(BEFORE)) 168 return before; 185 169 break; 186 170 case BEFORE: … … 195 179 while (true) { 196 180 while (child) { 197 result = child->renderer(); 198 if (result) 199 return result; 181 if (RenderObject* renderer = child->renderer()) 182 return renderer; 200 183 child = ElementTraversal::nextSkippingChildren(child, self); 201 184 } 202 result = rendererOfAfterPseudoElement(self->renderer()); 203 if (result) 204 return result; 185 if (RenderObject* after = self->pseudoElementRenderer(AFTER)) 186 return after; 205 187 nextsibling: 206 188 if (self == stayWithin) -
trunk/Source/WebCore/rendering/RenderObject.h
r138113 r138909 184 184 if (const RenderObjectChildList* children = virtualChildren()) 185 185 return children->lastChild(); 186 return 0;187 }188 RenderObject* beforePseudoElementRenderer() const189 {190 if (const RenderObjectChildList* children = virtualChildren())191 return children->beforePseudoElementRenderer(this);192 return 0;193 }194 195 // This function only returns the renderer of the "after" pseudoElement if it is a child of196 // this renderer. If "continuations" exist, the function returns 0 even if the element that197 // generated this renderer has an "after" pseudo-element.198 RenderObject* afterPseudoElementRenderer() const199 {200 if (const RenderObjectChildList* children = virtualChildren())201 return children->afterPseudoElementRenderer(this);202 186 return 0; 203 187 } -
trunk/Source/WebCore/rendering/RenderObjectChildList.cpp
r137336 r138909 186 186 } 187 187 188 RenderObject* RenderObjectChildList::beforePseudoElementRenderer(const RenderObject* owner) const189 {190 // An anonymous (generated) inline run-in that has PseudoId BEFORE must come from a grandparent.191 // Therefore we should skip these generated run-ins when checking our immediate children.192 // If we don't find our :before child immediately, then we should check if we own a193 // generated inline run-in in the next level of children.194 RenderObject* first = const_cast<RenderObject*>(owner);195 do {196 first = first->firstChild();197 // Skip list markers and generated run-ins.198 while (first && (first->isListMarker() || (first->isRenderInline() && first->isRunIn())))199 first = first->nextInPreOrderAfterChildren(owner);200 } while (first && first->isAnonymous() && first->style()->styleType() == NOPSEUDO);201 202 if (!first)203 return 0;204 205 if (first->isBeforeContent())206 return first;207 208 // Check for a possible generated run-in, using run-in positioning rules.209 first = owner->firstChild();210 if (!first->isRenderBlock())211 return 0;212 213 first = first->firstChild();214 // We still need to skip any list markers that could exist before the run-in.215 while (first && first->isListMarker())216 first = first->nextSibling();217 if (first && first->isBeforeContent() && first->isRenderInline() && first->isRunIn())218 return first;219 220 return 0;221 }222 223 RenderObject* RenderObjectChildList::afterPseudoElementRenderer(const RenderObject* owner) const224 {225 RenderObject* last = const_cast<RenderObject*>(owner);226 do {227 last = last->lastChild();228 } while (last && last->isAnonymous() && last->style()->styleType() == NOPSEUDO && !last->isListMarker());229 if (last && !last->isAfterContent())230 return 0;231 return last;232 }233 234 188 } // namespace WebCore -
trunk/Source/WebCore/rendering/RenderObjectChildList.h
r137336 r138909 56 56 void insertChildNode(RenderObject* owner, RenderObject* child, RenderObject* before, bool notifyRenderer = true); 57 57 58 RenderObject* beforePseudoElementRenderer(const RenderObject* owner) const;59 RenderObject* afterPseudoElementRenderer(const RenderObject* owner) const;60 61 58 private: 62 59 RenderObject* m_firstChild; -
trunk/Source/WebCore/rendering/RenderTreeAsText.cpp
r136744 r138909 902 902 bool isFirstCounter = true; 903 903 // The counter renderers should be children of :before or :after pseudo-elements. 904 if (RenderObject* renderer = element->renderer()) { 905 if (RenderObject* pseudoElement = renderer->beforePseudoElementRenderer()) 906 writeCounterValuesFromChildren(stream, pseudoElement, isFirstCounter); 907 if (RenderObject* pseudoElement = renderer->afterPseudoElementRenderer()) 908 writeCounterValuesFromChildren(stream, pseudoElement, isFirstCounter); 909 } 904 if (RenderObject* before = element->pseudoElementRenderer(BEFORE)) 905 writeCounterValuesFromChildren(stream, before, isFirstCounter); 906 if (RenderObject* after = element->pseudoElementRenderer(AFTER)) 907 writeCounterValuesFromChildren(stream, after, isFirstCounter); 910 908 return stream.release(); 911 909 }
Note: See TracChangeset
for help on using the changeset viewer.